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