




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 6章 循环结构程序设计,6.1 while语句 6.2 do-while语句 6.3 for语句 6.4 终止循环语句 6.5 多重循环 6.6 程序设计举例 习 题 六,6.1 while语句,格式: while (条件表达式) 语句 其中,条件表达式描述进行循环的条件,语句描述要反复执行的操作,称为循环体。 功能:先计算条件表达式的值,当条件表达式的值为真时,代表循环的条件成立,则执行循环体。当条件表达式的值为假时,代表循环的条件不成立,则退出循环,执行循环语句的下一条语句。 当循环的条件成立时,while语句反复执行循环。,例 6 1 求一些正数的和。,算法提示: (1) 反复从键盘输入这些数,输入一个非正数时终止。 (2) 在输入数的过程中反复执行求和的操作,逐步求出数的和。先行求出部分数的和,最后求出所有数的和。 (3) 当前这些数的和等于前面一些数的和加上当前数。 (4) 存放和的变量称为累加器变量,累加器变量一般初始化为0,在0的基础上开始累加。 (5) 循环的条件为处理的数大于0。 (6) 求一些数之和的问题称为累加问题。,程序如下: /*程序6-1,求一些正数之和*/ main( ) float x;/*存放当前输入的数*/ float sum=0;/*存放和,初值为0*/ scanf(“%f“,&x);/*输入第一个数*/ while(x0) sum+=x;/*累加*/ scanf(“%f“,&x);/*输入下一个数,仍然放x中*/ /*接下去判断循环的条件是否满足*/ printf(“和=%6.2f“,sum);/*输出所求一些数的和*/ 输入数据:1.1 2.2 3.3 4.4 0(0作为输入数的结束) 运行结果:和= 11.00,例 6 2 计算 1+2+3+ +100。,数据分析: 中间量:项i,int。 输出量:和sum,int。 算法提示: (1) 这也是一个累加问题,与上题不同的是,该题知道是哪些数相加。 (2) 项i兼作循环控制变量,循环条件用i=100描述。,程序如下: /*程序 6 - 2, 计算 1+2+3+ +100 */ main( ) int i=1; /*i 存放项, 初值为1*/ int sum=0; while (i=100) sum+=i; /*当i=100, 累加*/ i+; /*i的值改变为下一个自然数, 改变后接下去判断循环的条件是否满足*/ printf(1+2+3+100=%d, sum); /*输出所求和*/ 运行结果: 1+2+3+100=5050 说明:对本例来说,因已经知道循环100次,所以用for语句更好。 ,例 6-3 求一些正数的积。,/*程序 6-3, 求一些正数的积*/ main( ) float x; /*存放当前输入的数*/ float m=1; /*存放积, 初始化为1*/ scanf(%f, 输入数据: 1.2 2 5 0 运行结果: 积 = 12.10,例 6 4 计算1*2*3*100的值(实际上是求100!的值)。,算法提示: (1) 对照例6-2,只需将累加问题变成累乘问题。 (2) 为避免溢出,累乘器采用双精度型变量。 (3) 对本例来说,同样用for语句较好。,程序如下: /*程序 6-4, 计算1*2*3*100*/ main( ) int i=1; double m=1; while (i=100) m*=i; i+; printf(1*2*3*100=%f, m); 运行结果: 1*2*3*100= 9.33262154439441022e+157,6.2 do-while语句,dowhile语句是while语句的倒装形式。 格式: do 语句 while (条件表达式),功能:先执行循环,再计算条件表达式的值。当条件表达式的值为真时,代表循环的条件成立,则继续执行循环。当条件表达式的值为假,代表循环的条件不成立,则退出循环,执行循环的下一条语句。 dowhile语句反复执行循环,直到循环的条件不成立时为止。,说明: (1) dowhile语句是先执行,后判断。如果循环的条件一开始就不成立,循环也将执行一次。 (2) 与while语句一样,循环体中同样必须有改变循环条件的语句,否则循环将不能终止,形成无限循环。 (3) 循环体为多条语句时必须采用复合语句。 (4) 当循环条件为永真条件时,将变成无限循环。 (5) 与其它高级语言不同,C语言的直到循环与当循环的条件是一致的,其它高级语言中是互为相反条件。,(6) 与dowhile语句等价的if语句加goto语句的形式如下: 循环体; 标号:if(条件表达式) 循环体; goto标号; 本节例题考虑的问题与上节例题相同,只是在程序实现上改用dowhile语句,请读者注意对比分析。,例 6-5 求一些正数的和。,/*程序 6 - 5, 求一些正数的和*/ main( ) float x; float sum=0; do scanf(%f, ,例 6-6 计算1+2+3+100。 程序如下: /*程序6-6, 1+2+3+100 */ main( ) int i=1; int sum=0; do sum+=i; i+; while (i=100); printf(1+2+3+100=%d, sum); ,例 6-7 求一些正数之积。 程序如下: /*程序 6 - 7, 求一些正数的积*/ main( ) float x; float m=1; do scanf(%f, ,例 6-8 计算1*2*3*100。 程序如下: /*程序 6 - 8, 计算1*2*3*100*/ main( ) int i=1; double m=1; do m*=i; i+; while (i=100); printf(1*2*3*100=%f, m); ,6.3 for语句,格式: for(表达式1; 表达式2; 表达式3) 循环体 其中,表达式1为循环的初值表达式,表达式2为循环的条件表达式,表达式3为改变循环条件的表达式。 循环执行的次数隐含于循环中。,功能: (1) 计算表达式1, 循环控制变量得到初值。 (2) 计算表达式2, 如果表达式2为真, 代表循环的条件成立, 执行循环。如果表达式2的值为假, 代表循环的条件不成立, 也就是终止循环的条件成立, 退出循环, 执行循环的下一条语句。 (3) 计算表达式3, 改变循环条件, 回第(2)步。,例如: for(k=10; k20; k+) printf(k=%dn, k); 表达式1为k=10, 表达式2为k20, 表达式3为k+。 计算表达式1 , k得到初值10。 计算表达式2, k20为真, 执行第一次循环, 输出: k=10。 计算表达式3, k的值变为11。 计算表达式2, k20为真, 执行第二次循环, 输出: k=11。 计算表达式3, k的值变为12。 计算表达式2, k20为真, 执行第三次循环, 输出: k=12。 计算表达式3, k的值变为13。 ,最后: k 的值变为19, 执行第20次循环, 输出: k=19。 计算表达式3, k 的值变为20。 计算表达式2, k20为假, 终止整个循环的执行, 退出循环。,例 6-9 计算1+2+3+100, 1*2*3*100。,程序如下: /*程序6-9,计算1+2+3+100和1*2*3*100的值*/ main( ) int i;/*循环控制变量*/ int s; float m;/*和s,积m*/ /*求和*/ s=0; for(i=1;i=100;i+) s+=i;,/*求积*/ m=1; for(i=1;i=100;i+) m*=i; /*输出和、积*/ printf(“1+2+3+100=%dn“,s); printf(“1*2*3*100=%fn“,m); ,求和、求积可以合成一个循环处理,程序代码如下: s=0;m=1; for (i=1;i=100;i+) s+=i; m*=i; ,看了上面的例题后,我们对for语句做些说明: (1) 循环体为多条语句时,也必须采用复合语句描述。相信读者已对复合语句的使用场合有了较清醒的认识,请注意加以总结。 (2) 表达式1可省略,但分号不能省。此时应在循环外给循环赋初值,执行循环时,将跳过第一步。例如: for(;i=100;i+) sum+=i; (3) 如果表达式2省略,分号也不能省,则不判断循环条件,相当循环条件永真,形成无限循环。例如: for(i=1;i+) sum+=i,(4) 表达式3也可省略,分号也不能省,此时循环体中应有改变循环条件的语句。例如: for(i=1;i=100;) sum+=i;i+; (5) 当缺省表达式1、表达式2、表达式3中的一个、二个或全部,或当采用逗号表达式时,可产生for语句的多种变化形式。 例如: for(;) 语句;/*形成无限循环*/ for(;表达式2;) 语句;/*相当于while循环*/ for(sum=0,i=1;i=100;i+) sum+=i;/*累加器清0嵌入初值表达式1中*/ for(sum=0;i=100;sum+=i,i+);/*将原循环体嵌入表达式3中*/,(6) for语句最简单的应用形式是通过一个循环控制变量来控制循环,这类似于其它语言中的for语句。其形式为: for(循环控制变量赋初值;循环控制变量=终值;循环控制变量增值) 循环体 例如: for(i=1;i=1000;i+) printf(“%4dn“,i); for(ch=a;ch=z;ch+) printf(“%4cn“,ch);,(7) for语句中的三个表达式必须用分号分隔。 (8) for语句同while语句,也是先判断,后执行。 (9) 等价的if语句加goto语句的形式如下: 表达式1; 标号:if(表达式2) 循环体; 表达式3; goto 标号 ,例 6 10 求100个数的最大值。,算法提示: (1) 参照例5-8的做法,先假定第一个数是最大值,然后将其它数依次与最大值进行比较,所有数比较完成,最大值即被求出。 (2) 整个比较用for语句完成。,程序如下: /*程序6-10,求100个数的最大值*/ main( ) float x;/*存放当前输入数*/ int i;/*循环控制变量*/ float max;/*最大值*/ printf(“输入第1个数:“); scanf(“%f“,&x); max=x;/*最大值初始化*/,for(i=2;imax) max=x;/*将当前数与最大值进行比较*/ printf(“最大值=%fn“,max); ,例6-11 用2000个“¥”填充屏幕,每行40个。 本题用一个执行2000次的for语句即可实现。 程序如下: /*程序6-11,用2000个¥填充屏幕*/ main( ) int i; for (i=1;i=2000;i+) printf(“¥“): if(i%40=0)printf(“n“); ,例 6-12 判断正整数n是否为素数。,算法提示: (1) n是不是素数,只要看它有没有除1和它本身以外的因子。n可能的因子是2n1之间的数,对这些可能的因子一个个去反复判断。 (2) 引入一个标志变量p,其值为0代表不是素数,其值为1代表是素数。,图6-1 n是否为素数的NS图,程序如下: /*程序6-12,素数判断*/ main( ) int n; int i; int p;/*标志变量,值为1代表是素数,值为0代表不是素数*/ printf(“请输入要判断的正整数n:“); scanf(“%d“,&n); p=1;/*先假定n是素数*/ for(i=2;in;i+) if (n%i=0) p=0;/*有因子,不是素数*/,if(p=1) printf(“%d是素数“,n); else printf(“%d不是素数“,n); 输入数据:7 运行结果:7是素数,说明: (1) 实际上只要找到1个因子,就可证明n非素数,循环就可以终止,不需要继续下去。请参考例6-14。 (2) 其实只要判断2n/2或2之间的数不是n的因子,就可判断n是素数,即 for(i=2;i =n/2;i+) 或 for(i=2;i =sqrt(n);i+) ,6.4 终止循环语句,6.4.1 continue语句 格式: continue; 功能:终止本次循环的执行,即跳过当前这次循环中continue语句后尚未执行的语句,接着进行下一次循环条件的判断。 说明: (1) 往往与if 语句联用。 (2) 并不退出整个循环。,例 6-13 求10个正整数之和。,/*程序6-13,求10个数中的正整数之和*/ main( ) int i; int s=0; for(i=1;i0) s+=i;,6.4.2 break语句 在5.2节中已经介绍过用break语句可以跳出switch语句,其实break语句还可以终止整个循环的执行。 格式: break; 功能:终止整个循环的执行,退出循环。,例6-14 判断n是否为素数。 本例是例6-12的改进。 /*程序6-14,素数判断*/ main( ) int n; int i; int p; printf(“请输入要判断的数:“); scanf(“%d“,&n); p=1;,for(i=2;i=n/2;i+) if(n%i=0) p=0; break;/*找到一个因子即可终止整个循环*/ if(p=1) printf(“%d是素数“,n); else printf(“%d非素数“,n); ,6.5 多重循环,多重循环是循环语句之间的一种嵌套关系,是指循环体内还包含有循环语句。内嵌的循环称为内层循环,包含循环的循环称为外层循环。 多重循环执行时,外层循环执行一次,内层循环将执行整个循环。一般多重循环执行的次数等于外层循环的执行次数乘以内层循环的执行次数。 三种循环语句不仅可以通过自身嵌套构成多重循环,而且常互相嵌套构成多重循环。内嵌的循环还可再包含循环语句。 对于多重循环务请注意,内层循环必须完全包含在外层循环中,必须完全嵌套,不能部分嵌套。使用多重循环时,程序运行时间增加较快,一般循环的层数不要超过三重。,例 6-15 计算1!+2!+3!+100!。,数据分析: 中间量:i,外层循环控制变量,int;j,内层循环控制变量,int;t,存放阶乘,为避免溢出,采用double型。 输出量:和s,double。 算法提示: (1) 本问题要先计算阶乘,再计算和。 (2) 阶乘是累乘问题,用内层循环完成;求和是累加问题,用外层循环完成。,程序如下: /*程序 6-15, 计算1!+2!+3!+100!*/ main( ) int i, j double t; double s; s=0; for(i=1; i=100, i+)/*求和*/ t=1; for(j=1; j=i; j+)/*求阶乘*/ t*=j; s+=t; printf(1!+2!+3!+100!=%f, s); ,程序如下: /*程序6-15-2,计算1!+2!+3!+100! 的值*/ main( ) int i,j double t; double s; t=1; s=1; for(i=2;i=100,i+) t*=i; s+=t; printf(“1!+2!+3!+100!=%f“,s); ,例 6-16 输出下三角形式九九乘法表。,* 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 9 9 18 27 36 45 54 63 72 81,算法提示: (1) 外层循环控制行,for(i=1;i=9;i+)。 (2) 内层循环控制列,第i行有i列,for(j=1;j=i;j+)。 (3) 第i行、第j列的数为i*j。,程序如下: /*程序6-16,输出下三角形式九九乘法表*/ main( ) int i,j; clrscr( ); printf(“ 九九乘法口诀表n“); /*输出表头*/ printf(“%4c“,*); for(i=1;i=9;i+) printf(“%4d“,i); printf(“n“);,for(i=1;i=9;i+)/*控制行*/ printf(“%4d“,i); /*输出第i行*/ for(j=1;j=i;j+)/*控制列*/ printf(“%4d“,i*j); printf(“n“); ,6.6 程序设计举例,1. 循环语句的选择 while语句、do-while语句用于条件循环,for语句用于计数循环。while语句、for语句是先判断循环条件, 后执行循环体, 如果循环的条件一开始就不成立, 循环一次都不执行。do -while语句是先执行循环体, 后判断循环条件, 循环至少执行一次。 知道循环的次数选用for语句实现循环; 不知道循环的次数选用while语句、do-while语句实现循环; 保证循环至少执行一次, 选用do-while语句实现循环。,从一般意义上讲,三种循环语句可等价实现,并都可通过if语句加goto语句实现。 (1) while语句的for语句形式: for(;条件表达式;) 语句 (2) dowhile语句的for语句形式: 语句 for(;条件表达式;) 语句 (3) for语句的while语句形式: 表达式1; while(条件表达式2) 语句 表达式3; ,2循环条件的设计 循环条件的设计应从循环执行的条件与退出循环的条件正反两方面加以综合考虑。 有些问题的循环条件是隐含的,甚至需要人为地去构造,即将一些非处理范围的数据,一般是一些非常特殊的数据作为循环条件构造的基础,这样构造的条件称为“伪条件”。 如求一些数的和是一个累加问题,需要循环完成,但循环条件并没有给出。我们可用一个很小的数,比如1020来构造循环的条件:“数1e20”;或用一个很大的数,比如1020来构造循环的条件:“数1e20”,只要处理的一些数不比1e20小或不比1e20大就可以了。如果1020还不够小,1020还不够大,那很容易找到更小的和更大的数,如1030和1030。,3. 循环体的设计 注意循环体外的语句不要放至循环体中, 循环体中的语句不要放至循环体外。,例6-17 求一些数的最小值。 算法提示: 方法一:参考例6-10的做法,先假定第一个数是最小值,将其它数依次与最小值进行比较,如果比最小值还小,这个数就是新的最小值。完成所有数的比较后,其中的最小值即被求出。 方法二:为将第一个数与所有其它数同样处理,可将最小值初始化为一个很大的数,再同上处理。如果求最大值,可初始化为一个很小的数。,在此给出基于方法二的实现程序,程序如下: /*程序6-17,求一些数的最小值*/ main( ) float x;/*存放当前数*/ float min=1e30;/*最小值初始化成一个很大的数*/ do scanf(“%f“,&x); if (xmin) min=x; while (x1e30); /*假定要处理的数不会超过1e30,以一个更大的数如2e30终止循环*/ printf(“最小值=%f“,min); ,例 6-18 求两个整数的最大公约数。,算法提示: 采用辗转相除法求两数的最大公约数。 如两个整数为m、n,而且mn。将m除以n,如果余数为0,则n为所求。否则取n为除数,余数为被除数,继续相除。如此辗转,即可求出最大公约数。,/*程序6-18, 求两个整数的最大公约数 */ main( ) int m, n; int r; /*余数*/ printf(请输入两个整数m, n: ); scanf(%d, %d, ,说明: (1) 如果mn,需先交换m与n。 (2) 如果还要求最小公倍数,则m、n之值必须保留,要引入两个中间变量来进行辗转相除。最小公倍数等于m乘以n除以最大公约数。,例 6-19 求2n之间的所有素数, 假定每行输出 5 个素数。,数据分析: 输入量:n,int。 中间量:循环控制变量i,j,int。 标志变量p,int。 素数计数器count,int。 算法提示: (1) 用两重循环完成,内层循环完成一个数是否为素数的判断,外层循环完成所有数的处理。 (2) 引入素数计数器,用于每行输出5个素数的格式控制。,图6-3 求2n之间的素数的NS图,程序如下: /*程序6-19, 求2n之间的所有素数*/ main( ) int n; int i,j; int p,count=0; printf(“请输入n:“); scanf(“%d“,&n); printf(“2%d之间的素数如下:n“,n); for(i=2;i=n;i+) for(p=1,j=2;j=i/2;j+)/*判断i是否为素数*/,if (i%j= =0) p=0;break; if (p= =1) count+;/*素数计数*/ printf(“%6d“,i) if(count%5= =0) printf(“n“);/*输出五个后换行*/ ,例6-20 求Fibonacci数列的前60项。Fibonacci数列的第一项为1,第二项为1,从第三项开始,每项等于前二项之和。 算法提示: (1) 引入f1、f2、f分别存放前两项及当前项,f1、f2的初值为1,f=f1+f2。 (2) 求下一项时,f1=f2,f2=f 。,程序如下: /*程序6-20,求Fibonacci数列的前60项*/ main( ) int i; long int f1=1,f2=1; long int f; printf(“%12ld%12ld“,f1,f2); for(i=3;i=60;i+) f=f1+f2; printf(“%12ld“,f); f1=f2; f2=f; ,例6-21 设计能进行四则运算的计算器程序。 算法提示: (1) 两个数的四则运算参见例5-12,运算的选择用开关语句完成。 (2) 多个数的运算我们不考虑优先级,用条件循环完成,当运算符不等于“=”时,继续计算。,程序如下: /*程序 6-21, 四则运算计算器程序*/ main( ) float a, b; char op; float j; scanf(%f, /*输入下一个操作数*/ switch (op),case +: j=a+b; break; case : j=ab; break; case *: j=a*b; break; case /: j=a/b; break; /*假定b不为0*/ scanf(%c, ,例 6-22 假定有100个同学的C语言课程考试成绩, 计算这门课程的平均成绩和90100分、8089分、7079分、70分以下各个等级的人数。,数据分析: 输入量:当前学生的C语言成绩cj,float。 中间量:循环控制变量 i,int;总成绩tcj,float。 输出量:平均成绩av,float;相应等级的人数d9、d8、d7、d6,int。 如要保留100个同学的C语言课程成绩,需用第8章介绍的数组描述。从理论上讲,目前我们也可以定义100个简单变量来描述。 算法提示: (1) 求平均成绩前,先求出总成绩。 (2) 整个问题用for语句处理。 (3) 等级用if语句判断。,程序如下: /*程序 6-22, C语言成绩处理*/ main( ) float cj; int i; float t; float av; int d9, d8, d7, d6; t=0.0; d9=d8=d7=d6=0; for(i=1; i=100; i+),printf(请输入第%d个同学C语言成绩: , i); scanf(%f, ,例6-23 某人钱包里一共有x元,其中100元、50元、10元、5元的钞票各若干张,求其钱包里钱的可能张数。 算法提示: (1) 先输入钱包里的实际钱数。 (2) 100元最多有x/100张,50元最多有x/50张,10元最多有x/10张,5元最多有x/5张。,(3) 用四重for循环完成计算。 程序如下: /*计算钱包里钱的可能张数*/ main( ) int x; int n100,n50,n10,n5;/*相应面值的张数,循环控制变量*/ int i=0;/*种数*/ int n;/*可能张数*/ clrscr( ); printf(“输入实际钱数:“);scanf(“%d“,&x); for(n100=0;n100=x/100;n100+),for(n50=0;n50=x/50;n50+) for(n10=0;n10=x/10;n10+) for(n5=0;n5=x/5;n5+) if(100*n100+50*n50+10*n10+5*n5=X) n= n100+n50+n10+*n5; i+; printf(“第%d种可能张数=%dn“,i,n); printf(“100元张数=%d,50元张数=,10元张数=,5元张数=n“, n100,n50,n10,n5); ,习 题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学生物中考试题及答案
- 高层住宅工程施工方案
- svg施工方案介绍
- 居家团建活动方案策划
- 汽修志愿活动策划方案
- 厂区监控施工方案
- 生日晚会活动策划方案
- 广场硬化施工方案
- 直播电商互动购物平台创新创业项目商业计划书
- 智能工业自动化控制系统创新创业项目商业计划书
- 宠物旅游创业计划书
- 图表作文写作技巧与范文解析
- 中西翻译简史-研究的考试课题
- 静脉导管的维护
- 设备监理表格使用说明
- 文化创意公司章程范本
- 代谢性脑病的护理诊断与措施
- 五年级阅读理解(通用15篇)
- 2023-2024学年部编版七年级上册生物第三单元教案生物圈中的绿色植物生物学与文学 寄予植物的情怀
- 院内感染预防控制
- Unit 11 Lesson 1 课件-2023-2024学年高中英语北师大版(2019)选择性必修第四册
评论
0/150
提交评论