配色: 字号:
C程序课件第6章循环
2012-04-24 | 阅:  转:  |  分享 
  
第六章循环一、概述二、while语句二、do-while语句三、for语句四、循环语句的嵌套五、转移语句六、程
序举例七、小结本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样
,就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的p
rintf语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反
复执行。这些都是编程中常见的错误,要十分注意。1、循环嵌套的几种形式for语句也可与while,do-while语
句相互嵌套,构成多重循环。以下形成都合法的嵌套。for() { … while() {…}
… }(2) do { … for() {…} … }while()(3) while(
) { … for() {…} … }除了以上几种形式外,还有其他形式,不一一列举。(4) for
( ) { … for() {…} … }例EX6_8应用循环嵌套打印图形 voidmain()
{ inti,j,k; for(i=1;i<=3;i++) { for(j=1;j<=3-i+5;j++) p
rintf(""); for(k=1;k<=2i-1+5;k++) { if(k<=5)printf("");
elseprintf(""); } printf("\n"); } }2、几种循环语句的比较
(1)while和do-while循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i
=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此fo
r语句的功能更强,凡用while循环能完成的,用for循环都能实现。(2)用while和do-while循环时,循环变
量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。(3)whi
le循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和co
ntinue语句将在下一节介绍)。程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。如果需要改变程序的正
常流向,可以使用转移语句。在C语言中提供了4种转移语句:goto,break,continue和return。
其中的return语句只能出现在被调函数中,用于返回主调函数,我们将在函数一章中具体介绍。本小节介绍前三种转移语句。
goto语句也称为无条件转移语句,其一般格式如下:goto语句标号;其中语句标号是按标识符规定书写的符号,放在某一语句行的前面
,标号后加冒号(:)。语句标号起标识语句的作用,与goto语句配合使用。如:label:i++;loop:while
(x<7);1、goto语句C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向
,转去执行语句标号所标识的语句。goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。但是,在结构
化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。例EX6_9统计从键盘输入一
行字符的个数。(EX6_2的第三种方法) #include"stdio.h" voidmain() { intn=0;
printf("Inputastring:\n"); loop:if(getchar()!=''\n'') { n+
+; gotoloop; } printf("N=%d\n",n); }本例用if语句和goto语句
构成循环结构。当输入字符不为''\n''时即执行n++进行计数,然后转移至if语句循环执行。直至输入字符为''\n''才停止循环。
由于C语言提供了几种循环语句(while语句、do-while语句和for语句),而且这几种循环语句的功能也很强,因此在一般情况
下,不提倡使用goto语句来构造循环。break语句只能用在switch语句或循环语句中,其作用是跳出switch语
句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。2、break语句
break语句的一般形式为:break;上面例题中分别在switch语句(EX5_7_2)和for语句(EX6_6
_2)中使用了break语句作为跳转。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。
continue语句只能用在循环体中,其一般格式是:continue;其语义是:结束本次循环,即不再执行循环体中co
ntinue语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,并不跳出循环。3、cont
inue语句例EX6_10输出100以内能被7整除的数。 voidmain() { intn; for(n=7
;n<=100;n++) { if(n%7!=0) continue; printf("%d",n); }
}例EX6_11检查输入的一行中有无相邻两字符相同。 #include"stdio.h" voidmain()
{ chara,b; printf("Inputastring:\n"); b=getchar(); while
((a=getchar())!=''\n'') { if(a==b) { printf("samecharacter\n"
); break; } b=a; } }例EX6_12输出100以内的素数。素数是只能被1和本
身整除的数。可用穷举法来判断一个数是否是素数。 voidmain() { intn,i; for(n=2;n<=100
;n++) { for(i=2;i=n) print
f("\t%d",n); } }本例程序中,第一层循环表示从2-100这99个数逐个判断是否是素数,共循环99次
。在第二层循环中用2-n-1逐个去除n,若某次除尽(求余为0)则跳出该层循环,说明不是素数;如果2到n-1之间所有的数都未能除尽的
情况下结束本次循环,则该数为素数,此时有i>=n,故可经此判断后输出素数。然后转入下一次大循环。实际上,2以上的所有偶数均不是素数
,因此可以使循环变量的步长值改为2,即每次增加2,此外只需用2-n去除n就可判断该数是否素数。这样将大大减少循环次数,减少程序运行
时间。C程序设计数学系计算机系列课程课件之一本章要点6.1While循环结构6.2do-while循环
结构6.3for循环结构6.4循环结构的嵌套6.5转向控制6.6程序举例循环结构是程序中一种很重
要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。
C语言提供了多种循环语句,可以组成各种不同形式的循环结构。1、用goto语句和if语句构成循环;2、用while
语句构成循环;3、用do–while语句构成循环;4、用for语句构成循环。以上循环结构将在以下各节中分别介绍。
while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体。while语句
的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。其执行过程可用P107图6.1表示。例EX6_1计算1+2
+3+…+99+100 #include voidmain() { inti=1,s=
0; while(i<=100) { s=s+i;i++; } printf(“S=%d\n”,s);
}构成此循环的N-S图如下所示:sum+1=>sumi+1=>i当i<=1001=>i例E
X6_2统计从键盘输入一行字符的个数。 #include voidmain() { intn=0
; printf("Inputastring:\n"); while(getchar()!=''\n'')n++;
printf("%d\n",n); }本例程序中的循环条件为: getchar()!=''\n'',
其意义是,只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行
字符的字符个数计数。使用while语句应注意以下几点:1)while语句中的表达式一般是关系表达或逻辑表达式,只要
表达式的值为真(非0)即可继续循环。2)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。
3)应注意循环条件的选择以避免死循环。4)允许while语句的循环体又是while语句,从而形成双重循环。以下举
例说明以上几点:例EX6_3循环的终止条件voidmain(){ inta=0,n; printf("\ninpu
tn:"); scanf("%d",&n); while(n--) printf("%d,",a++2); pr
intf(“\n”);}本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++2的值。该表达式效于
(a2;a++)。本例中while语句的循环条件为赋值表达式a=5,因此该表达式的值永远为真,而循环体中又没有其它中
止循环的手段,因此该循环将无休止地进行下去,形成死循环。当执行到死循环时,应同时按下+两个键,才能中止。
EX6_4死循环问题 voidmain() { inta,n=0; while(a=5) printf("
%d",n++); }do-while语句的一般形式为:do{ 语句; /循环体/}while(表达式);其
中语句是循环体,表达式是循环条件。do-while语句的语义是:先执行循环体语句一次,再判别表达式的值,若为真(非0
)则继续循环,否则终止循环。do-while语句和while语句的区别在于do-while是先执行后判断,因此
do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。while
语句和do-while语句一般都可以相互改写。例EX6_3_2用do-while改写EX6_3 voidmain
() { inta=0,n; printf("Inputn:\n"); scanf("%d",&n); do
{ printf("%d",a++2); }while(--n); }构成此循环的N-S图如下所示:a+2
=>aa+1=>a直到n<=0为止0=>a,输入n的值对于do-whil
e语句还应注意以下几点:1)在if语句,while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面
则必须加分号。2)do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。3)在do和wh
ile之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。4)do-while和while语句相互替换时,
要注意修改循环控制条件。for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:
for(表达式1;表达式2;表达3) 语句;表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for
语句外给循环变量赋初值,此时可以省略该表达式,但分号不能省略。表达式2通常是循环条件,一般为关系表达式或逻辑表达式。
表达式3通常可用来修改循环变量的值,一般是赋值语句。或者说,表达式1为循环变量赋初值语句,表达式2为循环条件
语句,表达式3为循环变量的改变量语句。for语句最简单最易理解的形式为: for(循环变量赋初值;循环条件;循环变量改变量)
语句; /循环体/for语句的语义是:1、首先计算表达式1的值。2、再计算表达式2的值,若值为
真(非0)则执行循环体一次,否则跳出循环。3、然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式
1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for语句的执行过程如P118
图6.6所示。4、for语句的一般形式也可以改写为while循环的形式,即: 表达式1; while(表达式2)
{ 语句; 表达式3; }例EX6_5用for语句改写EX6_1voidmain(){ intn,s=0;
for(n=1;n<=100;n++) s=s+n; printf("s=%d\n",s);}例EX6_3_3
用for语句改写EX6_3voidmain(){ inta=0,n; printf("Inputn:\n"); sc
anf("%d",&n); for(;n>0;a++,n--) printf("%d,",a2);}在使用fo
r语句中要注意以下几点1、for语句中的各表达式都可省略,但分号分隔符不能少。如:for(;表达式;表达式)
省去了表达式1for(表达式;;表达式) 省去了表达式2for(表达式;表达式;) 省去了表达式3for(;;
) 省去了全部表达式2、在循环变量已赋初值时,可省去表达式1。如省去表达式2或表达式3则将造成无限循环,这时应
在循环体内设法结束循环。下例即属于此情况。例EX6_6避免死循环 voidmain() { inta=0,n;
printf("Inputn:\n"); scanf("%d",&n); for(;n>0;) { a++;n--; printf("%d",a2); } }例EX6_6_2避免死循环 voidmain() { inta=0,n; printf("Inputn:\n"); scanf("%d",&n); for(;;) { a++;n--; printf("%d",a2); if(n==0)break; } }3、循环体可以是空语句。例EX6_7(例EX6_2的另一种方法) #include"stdio.h" voidmain() { intn=0; printf("Inputastring:\n"); for(;getchar()!=''\n'';n++); printf("N=%d\n",n); }
献花(0)
+1
(本文系紫霄书屋首藏)