1、C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。5.1 while5.1 while语句语句1While语句的一般形式语句的一般形式 while(表达式)(表达式)语句语句 首先计算表达式首先计算表
2、达式,当表达式为当表达式为非非0 0时,执行时,执行whilewhile语句中的内嵌语语句中的内嵌语句句;然后重新计算表达式,如果表然后重新计算表达式,如果表达式的值为达式的值为0 0,则跳出循环。,则跳出循环。2while语句的执行流程语句的执行流程 表达式语句非00注意:注意:如果表达式的值一开始就如果表达式的值一开始就为为0 0,则语句一次也会被不执行。,则语句一次也会被不执行。v特点:先判断表达式,后执行循环体v说明:l循环体有可能一次也不执行l循环体可为任意类型语句l下列情况,退出while循环u条件表达式不成立(为零)u循环体内遇break,return,gotol无限循环:whi
3、le(1)循环体;while语句举例例1:求n 100n1 main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d”,sum);例例2:显示显示110的平方的平方#include main()int i=1;while(i=10)printf(%d*%d=%dn,i,i,i*i);i+;运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100注意:(1)循环体如果包含一个以上的语句,应该用花括循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。
4、如果不加花括弧,弧括起来,以复合语句形式出现。如果不加花括弧,则则 while语句的范围只到语句的范围只到 while后面第一个分号处。后面第一个分号处。(2 2)在循环体中应有使循环趋向于结束的语句。如)在循环体中应有使循环趋向于结束的语句。如果无此语句,则果无此语句,则i i的值始终不改变,循环永不结束。的值始终不改变,循环永不结束。5.25.2 dowhile语句1dowhile语句的一般形式为:语句的一般形式为:do 循环体语句 while(表达式);2dowhile语句的执行流程语句的执行流程 当表达式值为真当表达式值为真循环体语句循环体语句(b)循环体语句表达式(a)TFdowhi
5、le语句执行过程首先执行语句,再计算表达式。如果表达式的值为非零,继续下一次循环,如果表达式的值为0,则跳出循环。如果表达式的值一开始就为如果表达式的值一开始就为0 0,也会执行一次语句。也会执行一次语句。例例 用用dowhile循环求循环求 1001nn#include main()int i,sum=0;i=1;do sum+=i;i+;while(i=100);printf(%d,sum);例例 while和和dowhile比较比较#include main()int i,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10);printf(%d,sum)
6、;#include main()int i,sum=0;scanf(%d,&i);while(i=10)sum+=i;i+;printf(%d,sum);思考思考:这两个程序完全一样吗这两个程序完全一样吗?当当while后面的表达式的第一次的值为后面的表达式的第一次的值为“真真”时,时,两种循环得到的结果相同,否则两者结果不相同(指两种循环得到的结果相同,否则两者结果不相同(指两者具有相同的循环体的情况)。两者具有相同的循环体的情况)。举例:举例:#include main()float score,average=0;int n=0;do scanf(“%f”,&score);if(scor
7、e=0)average+=score;n+;while(score=0);if(n!=0)average=average/n;printf(“%6.2f”,average);思考思考:该程序是什么功能该程序是什么功能?for循环语句是C语言中功能最强的循环语句,它有多个变化形式,并且可以很方便的代替其它的循环语句。for语句的一般形式语句的一般形式 for(表达式表达式1;表达式;表达式2;表达式;表达式3)循环体语句)循环体语句先计算初值表达式1,它主要用于循环开始前设置变量初值;接着计算循环控制逻辑表达式2,它控制循环条件,决定循环次数;如果表达式2为真,则执行循环体语句,否则结束for循
8、环;求解表达式3,它主要是对循环控制变量进行修改。转步骤执行。求表达式1表达式2语句求表达式3for语句的下一语句真假流程流程求求 1+2+99#include(stdio.h)main()int i,s=0;/*s清清0*/for(i=1;i100;i+)s=s+i;printf(“s=%d”,i;)i=0i100s=s+ii+for语句说明(1)for语句的一般形式中的“表达式1”可以省略,注意省略表达式 1时,其后的分号不能省略。如 for(;(;i=100;i)sum=sumi;执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去
9、。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;它相当于:i=1;while(1)sum=sum+1;i+;for语句说明2(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(il;i100;);)sum=suml;i;(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;(;i100)while(i100)sumsuml;相当于 sumsuml;i;i;for语句说明3(5)3个表达式都可省略,如:for(;)语句语句 相当于 while(1)语句)语句 即不设初值,不判断条件(认为表达式2为真值),循环变
10、量不增值。无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i)sum=sum+i;表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i+)sum=sum+i;或 for(i=0,j=100;icC换行符i=i+cTF例:例:#include main()int i=0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij例:例:#include main()int i=
11、0;for(;i10;i+)putchar(a+i);运行结果:abcdefghij例:#include main()int i=0;for(;i10;)putchar(a+(i+);例:例:#include main()int i=0;for(;i10;putchar(a+i),i+);#include main()int i,j;float s=0.0;for(i=1,j=99;i=j;i+,j-)s=s+i/j;printf(“s=1/99+2/98+1=%f”,s);思考:上面程序的运行结果是多少?思考:上面程序的运行结果是多少?#include main()int i,j;float
12、 s=0.0;for(i=1,j=99;i100)break;/*如果 i100,则退出循环*/printf(“s=%d”,s);本程序中,当i100时,强行终止for循环,继续执行for语句下一条语句例如:例如:例例 break举例:输出圆面积,面积大于举例:输出圆面积,面积大于100时停止时停止#define PI 3.14159main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,area);例例 break举例:小写字母转换成大写字母举例:小写字母转换成大写字母,直至输入非字母字符直至输入非字母字符例例 b
13、reak举例:小写字母转换成大写字母举例:小写字母转换成大写字母,直至输入非字母字符直至输入非字母字符#include main()int i,j;char c;while(1)c=getchar();if(c=a&c=z)putchar(c-a+A);else break;continue语句被称为继续语句。执行continue语句,使本次循环提前结束,即跳过循环体中continue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为:continue;continue语句v功能:结束本次循环,跳过循环体中尚未执行的语句
14、,进行下一次是否执行循环体的判断v仅用于循环语句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3#include“conio.h”main()char ch;for(;)ch=getchar();/*字符输入函数字符输入函数*/if (ch=27)/*Esc键的键的ACSII码为码为27*/break;/*退出循环退出循环*/if(ch=13)continue;/*按的是按的是Enter:键,跳过字符输出语句键,跳过字符输出语句*/putchar(ch)
15、;/*显示输入的字符显示输入的字符*/getch();/*让程序停一下,拍任意键继续让程序停一下,拍任意键继续*/例例 求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值例例 求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值/*ch5_12.c*/#include main()int i,num=0,a;float sum=0;for(i=0;i10;i+)scanf(%d,&a);if(a=0)continue;num+;sum+=a;printf(%d plus integers sum:%6.0fn,num,sum);printf(M
16、ean value:%6.2fn,sum/num);goto被称为无条件转移语句。由两部分组成被称为无条件转移语句。由两部分组成goto 标号标号;和和 标号标号:语句语句 它最大的好处就是可以一下子跳出多重它最大的好处就是可以一下子跳出多重循环,而循环,而break却不能做到这点。却不能做到这点。用用if语句和语句和goto语句构成循环,求语句构成循环,求 n100n1 main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;goto loop;printf(“%d”,sum);运行结果如下:5050程序举例(P124 例6.6)为止最后一项的绝对值
17、小于的近似值,直到公式求例用61071513114t=1,pi=0,n=1.0,s=1当当|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出输出pi分子:1,-1,1,-1分母:1,3,5,7,.例例 求求Fibonacci数列:数列:1,1,2,3,5,8,的前的前40个数个数)3()2(12)1(1121nFFFnFnFnnnf1=1,f2=1for i=1 to 20输出f1,f2f1=f1+f2f2=f2+f115342331597109467502551422935245782415781718553772584177111213938320405702887
18、39088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155程序如下main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)printf(%12ld%12ld,f1,f2);if(i%2=0)printf(n);f1=f1+f2;f2=f2+f1;例例 判断判断m是否素数是否素数读入mk=mi=2当ikm被i整除真假用break结束循环i=i+1ik+1真假输出:m”是素数”输出:m”不是素数”5.5 循
19、环的嵌套 在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。While、do-while、for三种循环都可以互相嵌套。下面几种情况均为合法的形式下面几种情况均为合法的形式(1)while()while()(2)do do while();while();(3)for(;)for(;)(4)while()do while();.(5)for(;).while().(6)do for(;)while();注意:在循环嵌套中,内循环注意:在循环嵌套中,内循环必须在外循环开始循环
20、之前结束。必须在外循环开始循环之前结束。问题:输出图形分析:一共6行,每行的*数目与行号相同算法:行用 i 表示,当 i=6 则输出 i 个 *换行 输出结果:执行语句段执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)printf(“%3d%3d”,i,j);putchar(n);00 01 02 03 04 0510 11 12 13 14 1520 21 22 23 24 2530 31 32 33 34 3540 41 42 43 44 4550 51 52 53 54 55输出结果:执行语句段执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)pri
21、ntf(“%3d%3d”,i,j);putchar(n);问题问题:输出图形输出图形分析:一共4行,每行*个数是1,3,5,7,如果考虑第4行输出不空格,则每行输出*之前的空格数为3,2,1,如果用i表示每行输出*的个数,则输出空格数与i的关系为(7-i)/2,所以:#include main()int i,j;for(i=1;i=7;i+=2)printf(“n”);for(j=1;j=(7-i)/2;j+)putchar();/*输出输出 (7-i)/2个空格个空格*/for(j=1;j=i;j+)putchar(*);/*输出输出i 个个 */(1)四种循环都可以用来处理同一问题,一般情
22、况下它们可以互相代替。但一般不提倡用goto型循环。(2)while和 dowhile循环,只在 while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如 i,或i=i1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。比较(4)while循型、dowhile循环和 for循环,可以用 break语句跳出循环,用 continue语句结束本次循环。而对用 goto语句和 if语句构成的循环,不能用break语句和continue语句进行控制。(3)用 wh
23、ile和 dowhile循环时,循环变量初始化的操作应在 while和dowhile语句之前完成。而 for语句可以在表达式 1中实现循环变量的初始化。5.7复合程序结构及举例 C语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不允许出现嵌套层次之间相互交叉的情况。用用C语言编程打印语言编程打印1到到10的乘法表。的乘法表。main()int j,k;printf(1 2 3 4 5 6 7 8 9 10 n);printf(-n);for(j=1;j=10;j+)printf(%4d|,j);fo
24、r(k=1;k=10;k+)printf(%4d|,j*k);printf(n);用用C语言编程实现从键盘输入一个数字串,语言编程实现从键盘输入一个数字串,然后把它变成一个实数输出。然后把它变成一个实数输出。分析:首先要判断输入的是否是数字还是.;使用函数isdigit()。采用getchar()函数进行输入,输入的字符常量是ASCII码的值,怎样转换成对应的十进制数字?先输入的是高位数字,后输入的是低位数字,怎样处理?整数与小数的不同处理方式:123=1*102+2*10+3,0.456=4*10-1+5*10-2+6*10-3#include#include#define POINT./*
25、注意不能是注意不能是“.”*/main()int c,j,digitcount=0;double value=0,fracdigit;while(isdigit(c=getchar()value=value*10;value=value+(c-0);if(c=POINT)while(isdigit(c=getchar()digitcount+;fracdigit=c-0;for(j=0;j0)x2=(x1+1)*2;x1=x2;day-;printf(“Total=%dn,x2);例例 译密码译密码例如 Hello,world!译成密码:Lipps,asvph!#includemain()char c;while(c=getchar()!=n)if(c=a&c=A&cZ&cz)c=c-26;printf(“%c”,c);