编写C程序时应该注意的问题(选择、循环、数组部分)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编写C程序时应该注意的问题(选择、循环、数组部分):1.选择结构中if和else均只能“管辖”其下的一条语句,当功能实现需要多条语句时必须将这多条语句用{}括起来,构成复合语句。如:if(xy)x=1;-----当只有一条语句时{}可以省略elsex=y+1;-----当只有一条语句时{}可以省略if(xy){x=1;y++;}-----当有多条语句时,用{}括起来else{x=y+1;--y;}-----当有多条语句时,用{}括起来2.选择结构if(条件)后面不能加;否则计算机认为其后跟了一条空语句,不能正确表示功能含义。如:if(xy)x=y+1;elsex-=y;是正确的语法形式而if(xy);x=y+1;elsex-=y;相当于if(xy);x=y+1;此处由于;和x=y+1;在c语言中是被认为两条语句,应该用{}括起来,作为一条复合语句(见上面说明1)才正确,否则系统将提示else没有if匹配错。(见下面说明3)elsex-=y;3.if之后可以没有else相匹配,但else不能没有if,即else不能单独使用,如:if(xy)x=1;正确;---无else而:。。。elsex--;错误;---无if进行匹配,else不能单独使用又如:if(xy)x++;y--;else--x;++y;错误---思考系统提示为何种错误?4.break语句只能用于从switch–case结构或循环中退出。不能用在其它地方。5.判断几个量的大小相互关系时一定不能使用类似如下形式:if(xyz)…必须写成if(xy&&yz)…原因已经讲得很清楚了6.在if(条件)形式的条件处,条件表达式的形式并非固定为关系表达式或者逻辑表达式,可以是常量、变量、算术表达式等如下均为正确形式:if(6-3)…if(x)….if(x*x-y*3)…if(x=7)…系统先计算()内表达式的值,非零认为真即1,0认为假。特别的对于if(x=7)…这种形式,系统先把7赋值给变量x,整个赋值表达式的值为7==非零==真==1。7.对于循环结构来说,同样while之后,do。。。while之间,for之后只能“管辖”一条语句,当功能需要多条语句时,必须通过{}将其括起来构成一条复合语句构成循环体。反之当循环体只有一条语句时{}可以省略。8.对于if。。。else构成的选择结构,while,do。。。while,for构成的循环结构,计算机都会认为是一条语句,而和其下面管辖了多少条语句无关。如:if(xy){t=x;x=y;y=t;}系统会认为这是一条选择语句。因此如下使用就是正确的:k=0;while(k++)if(xy){t=x;x=y;y=t;}注意:while下面可以不加{},因为对于系统用来说,现在while下面仅仅“管辖”了一条选择语句。{}可省略。又如:if(x3)for(k=0;k=x;k++){s=s+k;t=t-k;}类似的if后面可以不加{},理由同上。9.循环如果出现死循环情况可以通过同时按下ctrl和break组合键强行中止循环执行。(针对turboc中使用)10.出现死循环的可能有:1循环变量变化方向不是是循环趋于结束(即和循环条件背道而驰)如for(k=1;k=10;k--)。。。2;号位置不正确如x=9;while(x1);{x--;s=s+x;}此时,系统认为while的循环体是一条空语句。3循环条件书写不正确,(恒为真了)如原意为while(x==5){y++;s=s+y;。。。}结果少写一个=号while(x=5){y++;s=s+y;。。。}则循环条件恒为真(自己思考为什么,参考前面说明。)11.对于知道循环次数的循环搭建模式:1有一个循环变量,并且在执行循环之前对其初始化2有判断循环是否结束的循环条件3有使循环趋于结束的循环变量变化。12.判断一个实数是否为零不能使用如下形式:floatx;…while(x==0){…}必须使用形如:…while(x=1e-6){…}来进行比较判断。13.break语句结束本循环,continue语句结束本次循环,开始本循环的下一次循环。比较:若s=0;for(k=3;k=10;k++){if(k%3!=0)break;s=s+k;}//运行后s值为3for(k=3;k=10;k++){if(k%3!=0)continue;s=s+k;}//运行后s值为18考虑为什么。。。。14.环嵌套的使用:外层循环m(定值)次,内层循环n(定值)次,则内层循环中的语句供执行m*n次。若内层循环k(k为外层循环变量,k初值为a,终值为b)次,则内层循环中的语句共执行次a+(a+1)+(a+2)+(a+3)+。。。+(b-1)+b次。15.循环嵌套应注意,外层循环变量变化一次,内层循环变量变化一圈(即内层循环全部执行完),外层变量变化永远比内层变量变化慢。16.打印图形的通用公式为:1两层循环实现,外层变量控制打印多少行,内层变量控制每行打印多少列2内层循环先考虑前导空格打印3再打印相关图形如若干星号4再打印回车换行符。参考所给的程序中打印*组成的三角形的例子。17.数组的使用应该注意:如果有inta[10];此处int称为数组的基类型。表明:数组名为a,数组长度为10,数组中有10个元素,下标由小到大分别是a[0],a[1],a[2]…a[9],数组中每个元素的类型都是整型。数组名a表示数组的首地址,相当于&a[0],即元素a[0]的地址,是常量,程序里不能有a=1000;这样的赋值。18.数组初始化,可以在定义数组的同时赋初值如:inta[10]={1,2};给a[0],a[1]赋值1和2其他元素默认0值,注意这种“一次性赋值”的形式只能在数组定义的同时可以,程序中不能出现a[10]=…的样子。字符数组赋初值时{}内的值应该带上两侧的单引号如:chark[100]={’a’,’b’,’v’,’5’,’*’};注意:inta[];是错误的。inta[]={1,2,3,4};是正确的,计算机可以根据赋初值的个数,确定数组长度。此时等价于:inta[4]={1,2,3,4};二维数组定义同时赋初值方法类似:inta[2][3]={{1,2,3},{4,5}};内层的小括号表明给不同的行赋值。也可以写成inta[2][3]={1,2,3,4,5};此时计算机会自动根据定义的数组行数、列数分配给数组元素对应的值,效果同上。对于二维数组来说,长度可以为空,不过需要注意的是,只能用在在定义同时赋初值,且第一维为空,第二维不能为空。如:inta[][]={1,2,3,4,5};inta[2][]={1,2,3,4,5};inta[][]={{1,2},{3,4,5}};都是不对的。正确的方式为:inta[][3]={1,2,3,4,5};相当于inta[2][3]={1,2,3,4,5};相当于inta[][3]={{1,2,3},{4,5}};不管是几维数组在内存中都是线性存放,因此不要因为定义了二维数组,则输出数组元素时一定会在屏幕上打印出“行列”的二维样式,输出为一行,一列还是方阵、矩阵、三角形,要根据输出语句来控制,通过循环、空格和换行达到需要的效果,跟是否定义为二维数组无关。19.数组在使用的时候特别要注意下标越界问题,尤其是一些“隐式”越界不容易被发现,出现越界计算机将会得不到正确结果。如:inta[10],k,t;for(k=0;k10;k++)scanf(“%d”,&a[k]);//注意,从循环中退出时k的值其实已经是10了for(t=k;t=0;t--)//第一次循环中a[t]即a[10],没有意义。printf(“%d”,a[t]);这段程序运行后将多打印出来一个莫名其妙的数据20.将字符串倒置,下面的代码有什么问题??main(){charstr[14]=abcedfghijklmn;chara[14];inti;for(i=0;i14;i++)a[i]=str[13-i];printf(%s,a);}系统运行将会报errorC2117:'abcedfghijklmn':arrayboundsoverflow错误。为何报此错误呢?注意字符串的长度并非是双引号内的字符个数(此题中为14个)而是字符个数加一,此题为15个,这是因为系统自动要在字符串的末尾添加字符'\0'造成的。而题目中存放字符串的字符数组str和a定义长度为14,不够存放,所以报错误为下标越界!可以改为#includestdio.hmain(){charstr[15]=abcedfghijklmn;chara[15];inti;for(i=0;i14;i++)a[i]=str[13-i];a[i]='\0';printf(%s,a);}关于二维数组的行列,需要注意的一点就是:求类似“行最大”或者“列最大”这样的结果时,需要进行行最大:遍历该行,即确定行下标后,列下标取所有可能。列最大:遍历该列,即确定列下标后,行下标取所有可能。for(i=0;iN;i++){x[i]=a[i][0];//---------------注意,此时针对下标为i的每行进行处理,请比较下面另一段代码for(j=1;jM;j++)if(x[i]a[i][j])x[i]=a[i][j];//-----这句话的意思是遍历i行所有元素,求出该行最大值,放入x[i]中。}for(j=0;jM;j++){x[j]=a[0][j];//---------------注意,此时针对下标为j的每列进行处理,请比较上面另一段代码for(i=1;iN;i++)if(x[j]a[i][j])x[j]=a[i][j];//-----这句话的意思是遍历j列所有元素,求出该列最大值,放入x[j]中。}

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功