《循环结构程序设计小结.ppt》由会员分享,可在线阅读,更多相关《循环结构程序设计小结.ppt(65页珍藏版)》请在三一办公上搜索。
1、2023/6/28,1,在C语言中可以用以下语句来实现循环:1.用while语句;2.用do-while语句;3.用for语句。,循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。,2023/6/28,2,S=1+2+3+100,0,S,1,2,100,S+1,S,S+2,S,S+100,S,作100次加法,S+i,S,累加器,计数器,2023/6/28,3,1 while语句,真(非零),循环体,假(零),1、while 语句的形式:while(表达式)循环体;,2、while 语句 常称为“当型”循环语句。,2023/6/28,4,3、说明:,先判断表达式,后执
2、行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。,2023/6/28,5,i=1;s=0;while(i=100)s=s+i;i+;printf(“n1+2+3+100=%d”,s);,循环变量的初始化计数器的初始化,累加器的初始化,循环控制条件,累加,修改循环变量,循环语句的三要素,循环次数固定的循环语句,2023/6/28,6,#include stdio.h int main()float x;scanf(%f,【例1】输入一系列整数,判断其正负号,当输入
3、0时,结束循环。,输入数据,为第一次判断做准备,while(x!=0),判断是否结束,if(x0)printf(+);else printf(-);scanf(%f,判断正负号,2023/6/28,7,#include stdio.h int main()char ch;int num=0;ch=getchar();,【例2】统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,while(ch!=n),判断是否输入结束,num+;ch=getchar();printf(“%dn”,num);return 0;,2023/6/28,8,注意,表达式在判断前,必须要有明确的值。,循环体中
4、一般有改变条件表达式的语句。,while(表达式)后面没有分号。,#include stdio.h int main()char ch;int num=0;ch=getchar();,while(ch!=n),num+;ch=getchar();printf(“%dn”,num);,2023/6/28,9,2 do-while语句,1)、do-while的形式:do 循环体;while(表达式);,2)、do-while语句 常称为“直到型”循环语句。,真(非零),循环体,假(零),2023/6/28,10,3)、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-whil
5、e等价;第一次条件为假时,二者不同。,2023/6/28,11,【例3】用do-while语句编写程序统计从键盘输入的一行非空字符的个数(以回车键作为输入结束标记)。,#include stdio.h int main()char ch;int num=0;ch=getchar();do num+;ch=getchar();while(ch!=n);printf(num=%dn,num);,2023/6/28,12,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件。,20
6、23/6/28,13,3 for语句,for的形式:for(初始表达式1;条件表达式2;循环表达式3)循环体;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句:被重复执行的语句。,2023/6/28,14,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,执行过程,2023/6/28,15,for(i=1;i=100;i+)sum=sum+i;,例如:,它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;,表达式1;,while(表达式2),表达式3;,2023/6
7、/28,16,3、说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后分号间隔符不能省略。,2023/6/28,17,for语句中表达式省略的形式,(1)for语句一般形式中的“表达式1”可以省略;如:sum=0;i=1;for(;i=100;i+)sum=sum+i;,2023/6/28,18,(2)表达式2省略,即不判断循环条件,循环无终止地进行下去;如:for(sum=0,i=1;i+)if(i100)break;sum=sum+i;,2023/6/28,19,(3)表达式3也可以省略,但此时保证循环能正常结束如:for(sum=0,i=1;i=1
8、00;)sum=sum+i;i+;,2023/6/28,20,(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;for(;i=100;)sum=sum+i;i+;,i=1;sum=0;while(i=100)sum=sum+i;i+;,相当于,2023/6/28,21,while(1)循环体;即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。,(5)三个表达式都可省略,如 for(;)循环体;,如:sum=0,i=1;for(;)if(i100)break;sum=sum+i;i+;,相当于,2023/6/28,22,(6)循环体为空语句 对for语句,循环体为
9、空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i+);,要在显示器上复制输入的字符,输入的字符为.时,结束循环。输入abcdefg.输出abcdefg.while(putchar(getchar()!=.);,2023/6/28,23,(1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。累加器当前值=累加器原值+循环变量当前值;,典型例题分析,【例4】求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,2023
10、/6/28,24,累加器赋初值,求偶数和?奇数和?2+4+6+1+3+5+,参考程序:,void main()long int k,s;,s=0;,for(k=1;k=1000;k+)s=s+k;,printf(s=%ld,s);,累加,思考,for(s=0,k=1;k=1000;k+,s=s+k);,2023/6/28,25,(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。累乘器当前值=累乘器原值*循环变量当前值;,例5:求累乘积。如:123.100,基本方法:,属于“累乘器”类型问题。,2023/6/28,26
11、,累乘器赋初值,求n!=1 2 3 n,参考程序:,void main()double s=1;,int k;,for(k=1;k=100;k+)s=s*k;,printf(s=%lf,s);,累乘,思考,2023/6/28,27,例6 判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),主要编程方法:循环变量终值法、标记变量法,2023/6/28,28,#include math.h void main()int x,k;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,循环变量终值法,for(k=2;k=sqrt(x);k+)if(x%
12、k=0)break;,if(ksqrt(x)printf(%d is a prime,x);else printf(%d is not a prime,x);,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,2023/6/28,29,#include math.h void main()int x,k,f=1;scanf(%d,排除法:如果有因子,不再往下判断是否是素数,for(k=2;k=sqrt(x);k+)if(x%k=0)f=0;break;,if(f=1)printf(%d is a prime,x);else printf(%d is not a prime,x);,在判
13、断范围内无因子,程序正常终止,有因子,程序非正常终止,标记变量法,2023/6/28,30,例7 用0-9这十个数字可以组成多少无重复的三位数?,编程方法:“枚举法”按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。,2023/6/28,31,#include stdio.hvoid main()/*a,b,c代表百位、十位、个位*/int x,a,b,c,num=0;/*num存放满足条件的数的个数,注意num要赋初值*/for(x=100;x=999;x+)a=x/
14、100;b=x/10%10;c=x%10;if(a!=b,2023/6/28,32,编程方法:“递推法”,例8 裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。,所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。,2023/6/28,33,f1-第一个数 f2-第二个数 f3-第三个数 f1=1;f2=1;f3=f1+f2;,以后只要改变f1,f2的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;,递推,2023/6/28,34,voi
15、d main()long f1=1,f2=1,f3;int k;,参考程序:,printf(%ldt%ldt,f1,f2);,for(k=3;k=30;k+)f3=f1+f2;printf(%ldt,f3);f1=f2;f2=f3;,递推,2023/6/28,35,问题:如果要求每行输出5项,且每项的输出宽度等宽,程序应如何改写?,#include void main()long f1=1,f2=1,f3;int k;printf(%12ld%12ld,f1,f2);for(k=3;k=30;k+)f3=f1+f2;printf(%12ld,f3);f1=f2;f2=f3;,if(k%5=0)
16、printf(“n”);,2023/6/28,36,4.循环语句的选择,if(循环次数已知)使用for语句else/*循环次数未知*/if(循环条件在进入循环时明确)使用while语句else/*循环条件需要在循环体中明确*/使用do-while语句,2023/6/28,37,1).break语句,(1)语句形式:break;,(2)作用:结束break所在的 switch语句。结束当前循环,跳出break所在的循 环结构。,5.break语句和continue语句,2023/6/28,38,【例10】求300以内能被17整除的最大的数。,#include stdio.hvoid main()
17、int x,k;for(x=300;x=1;x-)if(x%17=0)break;printf(x=%dn,x);,找到满足条件的最大数,结束循环,2023/6/28,39,(1)语句形式:continue;,(2)语句作用:结束本次循环。,2)、continue 语句,(3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,2023/6/28,40,【例11】求300以内能被17整除的所有整数。,#include stdio.hvoid main()int x,k;for(x=1;x=300;x+)if(
18、x%17!=0)continue;printf(%dt,x);,2023/6/28,41,while(条件)语句A;break;语句 B;,真,语句B,条件,语句A,break,假,结束循环,6.break语句与continue语句的区别,至此位置,2023/6/28,42,while(条件)语句A;continue;语句 B;,真,语句B,条件,语句A,continue,假,结束循环,至此位置,2023/6/28,43,#include stdio.hvoid main()int a,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf
19、(%dn,a);,【例12】分析以下程序的运行结果。,程序运行结果:4,2023/6/28,44,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,7.循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while、do-while、for三种循环都可以互相嵌套。,2023/6/28,45,循环语句之间的关系,for(.).for(.).,内循环,外循环,并列循环,嵌套循环,错误,2023/6/28,46,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环
20、循环条件,循环结束,二重循环嵌套结构执行流程,2023/6/28,47,例13:输出图形:,*,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。1)光标定位,3)每输完一行光标换行(n),2)输出图形。例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,2023/6/28,48,#include stdio.h“void main()int k1,k2;for(k1=1;k1=4;k1+)putchar(t);for(k2=1;k2=k1;k2+)putchar(b);,for(k2=1;k2=k1*2-1;k2+)putchar(*);,putchar(n);
21、,定位(还可以用空格的方法),输出,2023/6/28,49,#include stdio.hvoid main()int k1,k2,k3;for(k1=1;k1=1;k1-)for(k2=1;k2=8-2*k1;k2+)printf();for(k3=1;k3=k1*2-1;k3+)printf(*);printf(n);,控制行数,控制每行的起始位,控制每行要输出的个数,*,2023/6/28,50,8.循环结构程序设计举例,【例14】求,#include stdio.hvoid main()float s=0,f1=2,f2=1,f=1,t,n;/*累加器赋初值*/for(n=1;n=
22、10;n+)s=s+f*f1/f2;/*累加器当前值=累加器原来的值+新的要加的数据*/f=f*(-1);t=f2;f2=f1;f1=f1+t;/*为求下一个要加的数据做准备*/printf(s=%fn,s);,2023/6/28,51,循环程序设计,循环程序的实现要点:归纳出哪些操作需要反复执行?循环体这些操作在什么情况下重复执行?循环条件选用合适的循环语句for while do-while循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件控制循环,考虑while或do-while,2023/6/28,52,#include void main()int i,mark
23、,max,n;printf(Enter n:);scanf(%d,【例15】输入一批学生的成绩,求最高分(for),max,mark,Enter n:5Enter 5 maks:67 88 73 54 82Max=88,Enter n:0,2023/6/28,53,#include void main()int mark,max;printf(“Enter marks:);scanf(%d,输入一批学生的成绩,求最高分(while),Enter marks:67 88 73 54 82-1Max=88,Enter marks:-1,2023/6/28,54,【例16】将一个正整数逆序输出,确定
24、:循环条件和循环体(循环不变式),12345 5 4 3 2 112345%10=5 12345/10=1234 1234%10=4 1234/10=123 123%10=3 123/10=12 12%10=2 12/10=1 1%10=1 1/10=0 结束,循环体 x%10 x=x/10循环结束条件 x=0,scanf(“%d”,用do-while实现?,2023/6/28,55,循环程序设计习题,输入一个整数,从高位开始逐个数字输出。,12345/10000=1 12345%10000=23452345/1000=2 2345%1000=345345/100=3 345%100=4545
25、/10=4 45%10=55/1=5 5%1=0,(1)如何得到10000 找输入数据对应的幂 pow=1;temp=x;while(x!=0)pow=pow*10;x=x/10;pow=pow/10;(2)每次循环pow缩小1/10(3)pow=0 结束,2023/6/28,56,#include void main()int x,pow,temp,y;scanf(%d,参考程序:,2023/6/28,57,【例17】古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?,for(men=0;men=45;men+)
26、for(women=0;women=45;women+)for(child=0;child=45;child+)if(men+women+child=45),2023/6/28,58,for(men=0;men=15;men+)for(women=0;women=22;women+)child=45 women men;if(men*3+women*2+child*0.5=45)printf(men=%d women=%d child=%dn,men,women,child);,for(men=0;men=45;men+)for(women=0;women=45;women+)for(chil
27、d=0;child=45;child+)if(men+women+child=45),比较循环次数,2023/6/28,59,1、写出程序运行结果:(1)void main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)continue;x+;x+;printf(“x=%dn”,x);,运行结果:x=8,练 习,2023/6/28,60,(2)void main()int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;
28、b+;break;case 3:a+;b+;printf(“a=%d,b=%dn”,a,b);,运行结果:a=2,b=1,2023/6/28,61,(3)执行下现程序时输入Adescriptor的结果为:void main()char c;int v0=0,v1=0,v2=2;do switch(c=getchar()case a:case A:case e:case E:case i:case I:case o case O:case u case U:v1+=1;default:v0+=1;v2+=1;while(c!=n);printf(“v0=%d,v1=%d,”,v0,v1);pri
29、ntf(“v2=%dn”,v2);,运行结果:V0=12,v1=4,v2=14,2023/6/28,62,2.以下程序可判断输入的一个整数是否能被3或7整除,若能整除,输出“YES”,若不能整除,输出”NO“。请填空。int main()int k;printf(“Enter a int number:”);scanf(“%d”,能有几种填写方法?,K%3=0|k%7=0,!(k%3)|!(k%7),2023/6/28,63,3.将程序补充完整。以下程序从输入数据中统计正整数和负整数的个数。用输入0来结束输入.变量i存放正整数个数,变量j存放负整数的个数.void main()1 i,j,n;i=j=0;scanf(“%d”,2023/6/28,64,3.百钱买百鸡.公鸡5元一只,母鸡3元一只,小鸡1元三只;一百元买一百只鸡,且公鸡,母鸡,小鸡都要有.有几种买法?void main()int i,j,k,n=0;for(i=1)for(j=2)k=100-i-j;if(3=100)n+;printf(i=%d,j=%d,k=%dn”,i,j,k);printf(“n n=%d”,n);,2023/6/28,65,本 章 小 结,1.掌握while,do-while,for及循环嵌套,注意!,2.掌握典型例题及方法(1)累加、累乘、判断素数、费氏数列等(2)枚举、递推方法,