1、第1页,共51页。提出问题提出问题提问:提问:打印打印10行行“*”,怎么编程,怎么编程?回答:回答:写写10个个printf(“*”);语句。语句。提问:提问:打印打印500行,怎么编程?行,怎么编程?回答:回答:这个,嗯这个,嗯?不会让我写不会让我写500个个.注意:注意:让我们换一个角度来看待这些问题,让我们换一个角度来看待这些问题,以上问题实质是:将以上问题实质是:将printfprintf函数重复执行函数重复执行N N遍。遍。printf(“*”);2第2页,共51页。循环循环 反复执行同一段程序,直到满足一反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。定的条件后才停止
2、执行该段程序。C语言中控制循环的语句:语言中控制循环的语句:while do-while do-while for for3第3页,共51页。while语句格式语句格式while(while(表达式表达式 )语句语句;说明:语句说明:语句部分可以是部分可以是简单语句简单语句,也可,也可以是以是复合语句复合语句。whilewhile语句的执行流程语句的执行流程表达式表达式?执行语句语句成立成立不成立不成立执行while循环之后的语句循环控制条件循环控制条件循环体循环体4第4页,共51页。例例:从键盘输入从键盘输入1010个整数,求这个整数,求这1010个整数的和。个整数的和。#include#i
3、nclude main()main()int count,num,total;int count,num,total;/*count:count:计数器,计数器,num:num:输入的整数输入的整数 */count=0;count=0;total=0;total=0;/*total:total:存放累加和存放累加和 */while while(count10count10)/*循环控制条件循环控制条件 */count+;count+;/*循环体循环体 */printf(Enter the No.%d=,count);printf(Enter the No.%d=,count);scanf(%d
4、,&num);scanf(%d,&num);total+=num;total+=num;/*计算累加和计算累加和 */printf(Total=%dn,total);printf(Total=%dn,total);5第5页,共51页。例:例:分析程序的运行结果分析程序的运行结果#include#include main()main()int n=0;int n=0;while(n3)while(n3)printf(”n is%dn”,n);printf(”n is%dn”,n);n+;n+;printf(”Thats all this program printf(”Thats all thi
5、s program does.n”);does.n”);结果:结果:程序将不停的打印程序将不停的打印“n is 0”,直至终止程序,直至终止程序无法正常终止的程序,称为无法正常终止的程序,称为“死循环死循环”。结论:结论:在在while语句语句循环体循环体中,一定要有能够中,一定要有能够对循环控制条件产对循环控制条件产生影响的语句生影响的语句。避免出现。避免出现“死循环死循环”现象。现象。6第6页,共51页。例例1:分析下列程序段分析下列程序段 index=1;index=1;while(while(index index 5)5)printf(”Good morning!n”);printf
6、(”Good morning!n”);分析:分析:程序段将无限制打印字符串。因为循环中没有任何语句可以程序段将无限制打印字符串。因为循环中没有任何语句可以改变循环控制变量改变循环控制变量index的初值的初值1例例2:分析下列程序段分析下列程序段 index=1;index=1;while(while(-index index 5)5)printf(”Good morning!n”);printf(”Good morning!n”);分析:分析:仍有问题,程序改变了仍有问题,程序改变了index的值,但方向错了。的值,但方向错了。在在index达到系统能够处理的最大负数时,将会产生下溢而达到系
7、统能够处理的最大负数时,将会产生下溢而终止程序。终止程序。结论:结论:循环体中必须有能够使循环循环体中必须有能够使循环正常停止正常停止的条件。的条件。7第7页,共51页。【例【例6.16.1】求】求1001nnmain()int i,sum0;i=1;while(i100)sum=sum+i;i=i+1;printf(“d”,sum);8第8页,共51页。【例【例6.26.2】求前】求前n n个数的平方的和:个数的平方的和:n1i2i根据上例写出程序如下:main()int i=1,sum=0,n;scanf(“%d”,&n);while(i=n)sum=sum+i*i;i+;printf(“
8、i=%d,n=%d,sum=%dn”,i,n,sum);9第9页,共51页。该例也可以写成如下:该例也可以写成如下:main()int i=1,sum0,n;scanf(“%d”,&n);while(n)sum=sum+n*n;n-;printf(“i=%d,n=%d,sum=%dn”,i,n,sum);10第10页,共51页。l【例【例6.36.3】将输入的字符原样输出,以】将输入的字符原样输出,以“#”号结束。号结束。#include main()char c;c=getchar();while(c!=#)putchar(c);c=getchar();11第11页,共51页。上述程序也可以
9、写为:上述程序也可以写为:#include“stdio.h”main()char c;while(c=getchar()!=#)putchar(c);12第12页,共51页。【例【例6.46.4】统计从键盘输入的以】统计从键盘输入的以nn结束的字符中英文字母结束的字符中英文字母的个数。的个数。#include main()int n=0;char c;while(c=getchar()!=n)if(c=a&c=A&c=Z)n+;printf(%dn,n);Ab2!Ab2!*ABAB 4 413第13页,共51页。while使用注意使用注意 1.while(1.while(0 0).).由于循环
10、的条件表达式恒等于由于循环的条件表达式恒等于0 0,循环体永远也不会执行。循环体永远也不会执行。2.while(2.while(1 1).).由于循环的条件表达式恒等于由于循环的条件表达式恒等于1 1,所以不可能通过循环控制条件来结束循环体的执行,所以不可能通过循环控制条件来结束循环体的执行,称为称为“死循环死循环”。3.3.为了保证循环正常运行,应该特别注意:为了保证循环正常运行,应该特别注意:循环控制条件循环控制条件 控制条件的初始状态(初始值)控制条件的初始状态(初始值)循环体内部对控制条件的影响循环体内部对控制条件的影响14第14页,共51页。do-while语句格式语句格式 dodo
11、 语句语句 while (while (表达式表达式 );do-whiledo-while语句的执行流程语句的执行流程表达式表达式?执行语句语句成立成立不成立不成立执行while子句之后的语句循环控制条件循环控制条件循环体循环体15第15页,共51页。do-while语句特点语句特点do-whiledo-while与与whilewhile的最大区别:的最大区别:do-whiledo-while语句语句先执行循环体先执行循环体然后然后再判断再判断循环循环控制条件控制条件,而,而whilewhile却是先判断条件之后再执却是先判断条件之后再执行循环体。行循环体。使用使用do-whiledo-whi
12、le构成的循环,循环体构成的循环,循环体至少要执至少要执行一次行一次;而采用;而采用whilewhile构成的循环,循环体有构成的循环,循环体有可能一次也不会执行。可能一次也不会执行。16第16页,共51页。【例【例6.66.6】用】用do-whiledo-while语句求语句求1001nnmain()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d”,sum);17第17页,共51页。/*ex4-11-1.cex4-11-1.c*/#include#include main()main()int i,sum=0;int i,sum
13、=0;scanf(%d,&i);scanf(%d,&i);do do sum+=i;sum+=i;i+;i+;while(i=10);while(i=10);printf(“sum=%d,sum);printf(“sum=%d,sum);/*ex4-11-2.c ex4-11-2.c*/#include#include main()main()int i,sum=0;int i,sum=0;scanf(%d,&i);scanf(%d,&i);while(i=10)while(i=10)sum+=i;sum+=i;i+;i+;printf(“sum=%d,sum);printf(“sum=%d,
14、sum);1 sum=55sum=551 sum=55sum=5511 sum=11sum=1111 sum=0sum=018第18页,共51页。【例【例6.86.8】输入一个整数,计算它的位数】输入一个整数,计算它的位数.并反向输并反向输出出.main()long num;int count=0;printf(“输入一个整数:”);scanf(“%ld”,&num);do printf(“%d”,num%10);num=num/10;count+;while(num);printf(“该整数是%d 位数.”,count);19第19页,共51页。for语句格式语句格式for(for(表达式表
15、达式1 1;表达式表达式2 2;表达式表达式3 3)语句;语句;forfor语句的执行流程语句的执行流程循环初始条件循环初始条件循环控制条件循环控制条件表达式表达式2?执行语句语句成立成立不成立不成立执行for循环之后的语句执行表达式表达式3执行表达式表达式1循环体循环体forfor语句等价于下列语句:语句等价于下列语句:表达式表达式1 1;while while(表达式表达式2 2)语句语句;表达式表达式3 3;20第20页,共51页。例:例:求一个数的阶乘。求一个数的阶乘。#include#include main()main()long int jc=1;long int jc=1;in
16、t i,n;int i,n;scanf(scanf(“%d%d”,&n);,&n);forfor (i=1i=1;i=ni=n;i+i+)jc=jc jc=jc*i;i;printf(%d!=%ldn,n,jc);printf(%d!=%ldn,n,jc);for语句最常用的形式for(初值;控制条件;增量)语句;3 3 3!=6=621第21页,共51页。forfor语句的变化形式语句的变化形式forfor语句中的三个表达式中的任意一个都是可以省略的,语句中的三个表达式中的任意一个都是可以省略的,但是但是分号分号不能省略。不能省略。1.1.省略表达式省略表达式2 2,则:,则:forfor(
17、表达式(表达式1 1;表达式;表达式3 3)就形成了一个就形成了一个死循环死循环。2.2.省略表达式省略表达式1 1和表达式和表达式3 3,则:,则:forfor(;表达式(;表达式2 2;);)就等同于:就等同于:whilewhile(表达式表达式 )据此结论:所有用据此结论:所有用whilewhile语句实现的循环都可以用语句实现的循环都可以用forfor语语句实现。句实现。3.3.表达式表达式1 1、2 2、3 3全省略全省略,则:,则:forfor (;)(;)就等同于:就等同于:whilewhile (1)(1)22第22页,共51页。【例【例6.96.9】输入】输入2020个个0
18、09 9的数字字符,计算有多少奇数,偶数和零。的数字字符,计算有多少奇数,偶数和零。#define M 20main()int i,k,n1=0,n2=0,n3=0;char ch;printf(“输入数字字符输入数字字符20个:个:n”);for(k=1;k=M;k+)scanf(“%c”,&ch);i=ch-0;if(i=0)n3+;/*零零*/else if(i%2=0)n1+;/*偶数偶数*/else n2+;/*奇数奇数*/printf(“有有%2d 个偶数个偶数,%2d 个奇数个奇数,%2d 个零个零”,n1,n2,n3);23第23页,共51页。外层循环可包含两个以上内循环,但不
19、能相互交叉循环的嵌套循环的嵌套三种循环可互相嵌套三种循环可互相嵌套,层数不限层数不限内循环内循环外循环外循环相互交叉相互交叉的嵌套的嵌套24第24页,共51页。的嵌套的嵌套【例【例6.23】打印九九表。】打印九九表。main()main()int i,j;int i,j;for(i=1;i10;i+)for(i=1;i10;i+)for(j=1;j=i;j+)for(j=1;j=i;j+)printf(%d printf(%d*%d=%dt,j,i,i%d=%dt,j,i,i*j);j);printf(n);printf(n);25第25页,共51页。的嵌套的嵌套【例【例6.106.10】写出
20、运行结果。】写出运行结果。main()int i,j,k;printf(i j kn);for(i=0;i2;i+)for(j=0;j2;j+)for(k=0;k=100;j-)(j=999;j=100;j-)if if(n%j(n%j=0)/0)/*若能够整除若能够整除j j,则,则j j是约数是约数 */printf(printf(”3 digits in%ld=%dn3 digits in%ld=%dn”,n,j);,n,j);breakbreak;/;/*控制退出循环控制退出循环 */32第32页,共51页。【例【例6.11】求面积不大于】求面积不大于100的半径为自然数的圆面积。的半
21、径为自然数的圆面积。r=1,area=3.14r=1,area=3.14r=2,area=12.57r=2,area=12.57r=3,area=28.27r=3,area=28.27r=4,area=50.27r=4,area=50.27r=5,area=78.54r=5,area=78.5433第33页,共51页。breakbreak语句使用注意:语句使用注意:1 1、在嵌套循环中,、在嵌套循环中,breakbreak语句仅能退出一层语句仅能退出一层(当前当前)循环。循环。2 2、若在循环语句中包含了、若在循环语句中包含了switchswitch语句,那么语句,那么switchswitch
22、语语句中的句中的breakbreak语句仅能使控制退出语句仅能使控制退出switchswitch语句。语句。3 3、breakbreak语句并不是程序设计中必不可少的语句,可以通过语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。改变程序的结构去掉。34第34页,共51页。continue语句格式语句格式continuecontinue;continuecontinue语句的功能语句的功能 continuecontinue语句仅能在循环语句中使用语句仅能在循环语句中使用.它的作用不是结束循环,而是开始一次新的循环。它的作用不是结束循环,而是开始一次新的循环。对于对于forfor语
23、句,将控制转到语句,将控制转到执行表达式执行表达式3 3和和条件测试条件测试部分部分 对于对于whilewhile和和do-whiledo-while语句,将控制转到语句,将控制转到条件测试条件测试部分部分 从逻辑上讲,改变从逻辑上讲,改变ifif语句的条件表达式所表示的条件,语句的条件表达式所表示的条件,就可以不需要使用就可以不需要使用continuecontinue语句。语句。35第35页,共51页。continue语句的执行流程语句的执行流程表达式2?continue成立成立不成立不成立执行后续语句执行表达式3执行表达式1表达式?continue成立成立不成立不成立执行后续语句表达式?c
24、ontinue成立成立不成立不成立执行后续语句36第36页,共51页。例:输入例:输入1010个整数,求其中正数的个数及平均值,精确到小数点个整数,求其中正数的个数及平均值,精确到小数点后两位。后两位。main()main()int i,count=0,j,sum=0;int i,count=0,j,sum=0;for for(i=1;i=10;i+)(i=1;i=10;i+)printf(Input integer:);printf(Input integer:);scanf(%d,&j);scanf(%d,&j);ifif(j=0)(j=0)continuecontinue;/*结束本次循
25、环,不进行后续操作结束本次循环,不进行后续操作 */count+;count+;/*计数器计数器 */sum+=j;sum+=j;/*求累加和求累加和 */if if(count)(count)printf(Plus numer:%d,average value:%.2f,printf(Plus numer:%d,average value:%.2f,count,1.0 count,1.0*sum/count);sum/count);elseelse printf(Plus numer:0,average value:0);printf(Plus numer:0,average value:0
26、);改变改变ifif语句的语句的条件表条件表达式达式,可以,可以不需要使不需要使用用continuecontinue。37第37页,共51页。【例【例6.126.12】输出输出100200100200之间的不能被之间的不能被3 3整除的数。整除的数。main()main()int n;int n;for(n=100;n=200;n+)for(n=100;n=200;n+)if(n%3=0)if(n%3=0)continue;continue;printf(“%d”,n);printf(“%d”,n);38第38页,共51页。goto语句格式语句格式gotogoto 标号标号;gotogoto语
27、句的功能语句的功能1 1、将控制转移到标号所指定的语句处继续执行。、将控制转移到标号所指定的语句处继续执行。2 2、标号的唯一功能就是作为、标号的唯一功能就是作为gotogoto语句的目标。标号语句的目标。标号的作用域是它所在的整个函数的作用域是它所在的整个函数,标号必须是合法的标标号必须是合法的标识符。识符。gotogoto语句的使用说明语句的使用说明在在C C语言中,语言中,gotogoto语句并不是必不可少的,使用语句并不是必不可少的,使用gotogoto语句语句的地方都可以用的地方都可以用C C的其他控制流程语句改写。的其他控制流程语句改写。39第39页,共51页。/*ex4-8.ce
28、x4-8.c*/#include#include main()main()int i,sum=0;int i,sum=0;i=1;i=1;loop:loop:if(i=100)if(i=100)sum+=i;sum+=i;i+;i+;goto loop;goto loop;printf(%d,sum);printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循环初值循环初值循环变量增值循环变量增值循环条件循环条件例例 用用if 和和goto语句构成循环,求语句构成循环,求循环终值循环终值循环体循环体1001nn40第40页
29、,共51页。retunrn语句格式语句格式格式一:格式一:returnreturn;格式二:格式二:return(return(表达式);表达式);returnreturn语句的功能语句的功能 1.1.returnreturn语句使程序从被调用函数中返回到语句使程序从被调用函数中返回到调用函数的调用处继续运行。调用函数的调用处继续运行。2.2.如果如果returnreturn后跟一表达式,则该表达式的后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,值会从被调用函数中带回到调用它的函数,称为称为返回值返回值。41第41页,共51页。穷举法穷举法穷举法穷举法例例6.146.14】将
30、】将2 2角钱换成角钱换成1 1分、分、2 2分和分和5 5分的硬币,列出所有可能的分的硬币,列出所有可能的换法。换法。main()main()int x int x,y y,z z,k=0k=0;for(z=0for(z=0;z=4 z=4;z+)z+)for(y=0 for(y=0;y=(20-5y=3n=3)为求出第为求出第N N项的值,请编写程序。项的值,请编写程序。根据递推通项公式,可用根据递推通项公式,可用递推法递推法编写程序,计算第编写程序,计算第N N项的项的值。值。递推法递推法:由初始的已知条件开始,由初始的已知条件开始,先计算出第先计算出第(N(N1)1)步的结步的结果,果
31、,再再利用前面已知的利用前面已知的(N(N1)1)项结果,按照递推公式项结果,按照递推公式(或遵照递推规则),(或遵照递推规则),推出第推出第N N步结果步结果。递推法递推法是程序设计中最常用的方法之一,使用递推法必是程序设计中最常用的方法之一,使用递推法必须有明确的须有明确的递推初始值递推初始值和和递推规则递推规则(递推公式)。(递推公式)。43第43页,共51页。main()main()int n,i,un1,un2,un;int n,i,un1,un2,un;for for(;)printf(Input n=?);printf(Input n=?);scanf(%d,&n);scanf(
32、%d,&n);ifif(n=3)(n=3)breakbreak;/*退出退出forfor循环循环 */elseelse printf(nInput n is error!n);printf(nInput n is error!n);/*控制输入正确的控制输入正确的N N值值 */un1=un2=1;un1=un2=1;/*设置递推初始值设置递推初始值 */forfor(i=3;i=n;i+)(i=3;i=n;i+)/*用递推法计算第用递推法计算第N N项的值项的值 */un=un1+un2;un1=un2;un2=un;un=un1+un2;un1=un2;un2=un;printf(No.%
33、d is%dn,n,un);printf(No.%d is%dn,n,un);44第44页,共51页。)3()2(12)1(1112nFFFnFnFnnn例例6.17 求求Fibonacci斐波纳契数列斐波纳契数列 的前的前40个数个数45第45页,共51页。辗转相除法辗转相除法main()main()int x,y,a,b,t;int x,y,a,b,t;printf(printf(输入两个整数输入两个整数x,y:);x,y:);scanf(%d,%d,&x,&y);scanf(%d,%d,&x,&y);a=x;b=y;/a=x;b=y;/*保存保存x,yx,y以便求它们的最小公倍数以便求它
34、们的最小公倍数 */t=a%b;t=a%b;while(t!=0)/while(t!=0)/*余数不为余数不为0 0,继续相除,直到余数为,继续相除,直到余数为0 0*/a=b;b=t;t=a%b;a=b;b=t;t=a%b;printf(x=%d,y=%d%d,%dn,x,y,b,x printf(x=%d,y=%d%d,%dn,x,y,b,x*y/b);y/b);/*用乘积除以最大公约数得到最小公倍数用乘积除以最大公约数得到最小公倍数*/【例【例6.186.18】求两个整数的最大公约数和最小公倍数。】求两个整数的最大公约数和最小公倍数。46第46页,共51页。【例【例6.19】用】用 公式
35、求公式求 的近似值,的近似值,直到某一项的绝对值小于直到某一项的绝对值小于 为止为止 71513114 61047第47页,共51页。的整数的整数mk 【例【例6.206.20】判断】判断m m是否素数。是否素数。48第48页,共51页。【例【例6.216.21】求】求100100至至200200间的全部素数。间的全部素数。49第49页,共51页。【例【例6.226.22】用循环输出如下图案:】用循环输出如下图案:*main()main()int i,m,n;int i,m,n;for(i=1;i=5;i+)/for(i=1;i=5;i+)/*行数的控制行数的控制*/for(m=1;m=5-i
36、;m+)for(m=1;m=5-i;m+)printf(“”);/printf(“”);/*空格的控制空格的控制*/for(n=1;n=i;n+)for(n=1;n=i;n+)printf(“printf(“*”);/”);/*输出输出*个数的控制个数的控制*/printf(“n”);/printf(“n”);/*每一行要有回车换行每一行要有回车换行*/50第50页,共51页。【例【例6.24】打印所有】打印所有“水仙花数水仙花数”(三位数:(三位数:153135333)。)。main()int i,ge,shi,bai;for(i=100;i=999;i+)bai=i/100;shi=i/10%10;ge=i%10;if(i=ge*ge*ge+shi*shi*shi+bai*bai*bai)printf(%6d,i);printf(n);51第51页,共51页。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。