正文

[推荐]c语言补课笔记(2)2006-07-31 02:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/petibo/17036.html

分享到:

[推荐]c语言补课笔记(2) 第三天    今天所讲的都是围绕着数组,我们在C语言里定义数组和其它高级语言定义的不同,这里示出C语言和其它语言的。  C语言      Foxbase  int a[10][10]; dim a(10,10)  是不是符号也不同了,我们以前用惯的都是小括号,但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学C语言呢,不习惯都要得习惯了。还记得以前定数组根本就是不用理会它的地址,只知道用就行了,就算用错了也会编译出错。可是C语言可不是呢,一但你定义了一个数组之后,你就得好好的管住它,因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多,真是灵活多变,这里不再重复书上里的东西了。现在就定义一个数组来看看:int a[10];   如这个表所示,数组定义之后有相对地址,而且数组名a就是存放这些地址的首地址。(但是数组名是一个指针常量。)现在我们定义多一个整型指针变量 int *p; ,让他指向数组a,p=a; 我们试着让指针运算递增一个p++; 我们看到的结果是p指向了新的地址2003,原来的地址是2001,为什么递增一个就移向了2003呢?不是2002才是正确的吗?其实这里就说明了我们定义指针变量为什么要整型呢,是因为所有的指针运算也是看自己本身是什么类型的指针作出什么的运算,就是现在是整型类型,整型数据存储是需要2字节的,所以针指运算也是按这个方式来到进行,结果很显然就是往下移2了。  好了,接下来我们做一些题目吧,这是今天老师给我们出的题,其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做,多思考,看看谁的方法比较好。 在n行n列矩阵中,每行都有最大数,本程序求这几个最大数中的最小一个。#include <stdio.h>#define N 100int a[N][N];void main(){  int row,col,max,min,n;  /*输入合法的n和n*n个整数的代码, 注,这里略了一部份到后面练习自己做回*/  for(row=0;row<n;row++)  {    for(max=a[row][0],col=1;col<n;col++)    if (  ) max=a[row][col];    if (  ) min=max;    else if (  ) min=max;  }  printf("最大数中的最小数为:%d\n",min);}   这题可真有些难度,它的难就难在第二个空那里,相信第一个空绝大部分都会做,可是第二个空呢,真的下不笔了。当时看程序的最后继续两个空后面的语句为什么一样的呢,可真的没有想通,只是要死钻牛解尖,老是想着一定是用数组的,第一个循环里是行,跟着就是列了。可是还是想不到答案,因为我的思路已经大错特错了。最后老师还是说出答案,也说这题真的是比较难。第二空其实是填row= =0,为什么这样填呢,是因为这个矩阵里一开始要有一个BASE数做底,所以row= =0只出现一次,很自然的就成了第一个比较的基数,跟着这个if语句里的就是比较这几个最大数中的最小一个数了,第二个空填了出来当然答案也就随之可以出来了max<min。看来我现在功力去考中程还是白费心机吧,因为这只是第一大题啊,有很多难的题都在后几题。那么既然现在知道自己的弱点就应该去好好克服改正它,好了,这只是第一道练习题,跟着下面还有将略了的那部份编出来。我所写的如下,因为考虑到整数类型界限的问题,我所编的所着重这里。printf("please input n:";scanf("%d",&n);for(row=0;row<n;row++) for(col=0;col<n;col++) {  do  {   printf("please a[%d][%d]",row,col);   scanf("%d",&a[row][col]);  }while(a[row][col]<-32767 && a[row][col]>32767 ); } 接下的是第二题了,题目如下:求n*n的对角线和这题因为全由自己写,所以各种写法都有。在下面先写我的最基础简单的方法吧。#include <stdio.h>#define n 5main(){  int a[n][n];  int row, col;  int sum=0;  /* 输入略 */  for(row=col=0;row<n;row++,col++)    sum+=a[row][col];  for(row=0,col=n-1;row<n;row++,col--)    sum+=a[row][col];  if ( n%2 !=0)    sum-= a[n/2][n/2];  printf("%d",max);}  这是最基本的方法了,两个循环跟着判断是否偶数来减去中间重复出现的一个数,这样就求得结果了下面我写一个我同学编的还比较简单,而且方法独到的(反正所有人都没有想过这种方法,除了他)。这里主要写一写他的方法。int sum=0,j;for ( j=0; j<n; j++ )  sum+=a[j][j]+a[j][n-1-j];if ( n%2 !=0 )sum-=a[n/2][n/2]; 够简单吧,一次循环就可以了,他的思路是这样的,比方有一个如下的矩阵每次都两个两个刚好相对立,所以可以一次就扫描完了。好了,我写的有些累了,因为今天没有什么精神,最后老师还补充了另一个更简单的,方法其实就是一种只是运用了条件运算符sum+=a[j][j]+( (j == (n-1-j) ? 0: a[j][n-1-j];C语言真的想有多简洁有多简洁。    第四天    今天的课程里终于到了重点了,就是算法,因为才刚开始,先从容易的排序算法开始说,抄了一道题目让我们做,如下:  已有一个已排序的数组,今输入一个数,要求按原来的排序规律将它插入数组中。看到了这个题目我觉得自己比较有把握,很快的就写了出来,可是谁知道我的程序有一个至命的地方,刚给老师看的时候还得意洋洋,可是看完指出我的错来时真的不好受,既然都错了,就把我所做的那个答案写下来吧,也好让大家比较比较。#define n 8main(){  int a[n];  int i,j,t,s;  for(i=1;i<=7;i++)    a[i-1]=i*10;  for ( i=0;i < 7;i--)    if ( a[ i ] < a[ i+1 ] )     { s=a[ i ]  a[ i ] = a[ i+1]  a[ i+1] = s; }    for(i=0;i<7;i++)      printf("%d,a[ i ]);}  看上去真的对的,没有错误,可能如果不细心都走眼的了。老师就是有这种本领可以看出来,让我慢慢道来我的错误吧,其实就是错在那一个最后没有赋值的元素,因为没有初始传值,随机生成的数可能很大,也可能很少,不过如果刚好小于插入的数话,那么就不再是正确的排序了。好了,说了我的错让我们看一个正确的程序吧 #define N 8main(){  int a[N]={20,30,40,50,60,70,80};  int n,i;  for(i=N-1;i>=0;i--)  {    if(n<a[i]) a[i+1]=a[i];    else break;   }  a[i+1]=n;}   这里就是一个比较好的排序算法了,在讲这些排序的时候老师画了一个图,如第四天图一这个图可以方便的表示出当时的排序情况,排起序来更清晰了。不过更重要的一点就是不排让人只单独看源程序那样头晕,根本不知道这是怎么一回事。因为我也是,自己编这个程序的时候跟着看完,看得模模糊糊的,所以我推荐大家也学一学这种方法。  说到排序,我们又教我们一种新的排序方法,就是冒泡排序法了。记得以前我学QB里也学过,不过今天听着老师说,自己动着手画图来看,真的变得清晰多了。说冒泡排序法其实也可以叫左下沉排序法,因为是按程序的两个循环来决定,如果是按从底到顶当然就是冒泡啦,相反从顶到底就是下沉了。显下两个程序:int n=6,i,j;for ( i=n-1; i > 0; i--)  for(j=0; j < i; j++)    if(a[j]>a[j+1] { 交换 };以上的是冒泡法 int n=6,i,j;for ( i=0; i < n; i++)  for(j=n-1; j > i; j--)    if(a[j]<a[j-1] { 交换 };这就是下沉了。  我们今天基本上全都在练习这个排序了,快到放学了,可是老师还是把握好时间,真的一点都不浪费啊,而且还拖了半个钟头堂。唉~!有时候我觉得他人好,好时候真的不好。可是怎么说呢,他至终都是我们的老师。那么他拖了我们半个钟就是为了说完C语言里条件语句,不过说真的还是学到了一些东西。  C语言里条件语句也有好几种形式,用条件运算符 ? : ,基本的if语句,还有就是switch语句,至于最灵活都是答件运算符 ? : , 而且还是C语言里唯一的三目运算符了。为什么这么灵活,因为他的参数是表达式,C语言最灵活也就是表达式了,那么它能不灵活吗!这里给出一个源程序:int a=5,b=10,c=8;if(a>b)if(a>c)printf("a";else if(b>c)printf("b";else printf("c";  这么一条源程序是否让你看得不舒服呢,这就是C语言的另一个特点啊,你知道这条程序的答案吗?不过其实也不难,程序也很短嘛,就让我说出答案好了,答案不就是输出b嘛,道理很简单一看就出了,谁?谁?谁在这里搞乱,答案会是输出b 吗,笨!所以写你功夫还不到家嘛,下面让整理一下程序int a=5,b=10,c=8;if(a>b)if(a>c)   printf("a";else   if(b>c)printf("b";else printf("c";  这样看清楚了吗?答案就是什么都没有,因为一开始第一个if语句就不成立了,那里有答案出呢!这里也看出一个情况,所以我们要陪养好代码的格式,如果有良好的编码风格就有好的程序。还有我今日又明白了一样,想看看下面的if语句:if ifelse else if if else ifelse else ififelse  我原还以为这两个是不同的呢,在QB里的印象是两个不if语句呢。可是今天就给我弄明白了,大家也应该知道吧,可能就是我笨了。  在C语言里swtich也和别的高级语言不同,你们有发现吗?现在看看第四天图二吧在这个图里清楚的说明了这个语句与其的不同之处,而且条件是用常量的,所以老师说给我们听他自己也不怎么喜欢用这个swtich语句。如果用懂了这个条件运算符? : 还真的挺方便的,这个也是可以无限嵌套的,这里不多说了,让自己慢慢体会研究。

阅读(2367) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册