1、C语言程序设计语言程序设计第五章第五章 循循 环环 结结 构构whilefordo-while循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。gotogoto 语句o一般格式:ogoto 语句标号语句标号 o由if goto 构成循环o例4-1:omain()oint x=0,y=0;ostar:if(x=3)oy=x+1;o x=x+1;ogoto star;printf(“%d”,y);分析输出结果。v一般形式:while()v执行流程:while语句循环体:被重复执行的部分表达式循环体假(0)真(非0)whilev 特点:先判断表达式
2、,后执行循环体v 说明:l 循环体有可能一次也不执行l 循环体可为任意类型语句l 下列情况,可退出while循环u 条件表达式不成立(为零)u 循环体内遇break,return,goto while语句特点和说明while()o例4-2:omain()oo int count=1;o while(count5)o o printf(”good morning!n”);o count+;o ogood morning!good morning!good morning!good morning!#includemain()int n=9;while(n6)n-;printf(“%d”,n);8
3、76main()int n=9;while(n6)n-;printf(“%dn”,n);6例例4-3:用用while循环求循环求sum=1+2+3+100#include main()int sum=0;int i=1;while(i=100)sum+=i;i+;printf(“sum=%d,sum);循环初值循环终值循环变量增值循环条件循环体如何求sum=1*2*3*100?【例【例5-13】猴子吃桃问题。】猴子吃桃问题。猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后
4、每个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉前一天剩下的一半零一个。到第天早上都吃掉前一天剩下的一半零一个。到第1010天早上再想吃时,天早上再想吃时,就只剩一个桃子了。问第一天共摘了多少个桃子?就只剩一个桃子了。问第一天共摘了多少个桃子?迭代法迭代法设第设第n天为天为xn个,第个,第n+1天为天为xn+1则:则:xn+1=xn/2-1可得递推公式:可得递推公式:xn=(xn+1+1)*2 1n9 x10=1 n=10即:即:x10=1 x9=(x10+1)*2=4 x8=(x9+1)*2=10 x1=(x2+1)*2=1534算法分析:算法分析:倒推倒推#incl
5、ude main()int p2=1,p1;intn=9;while(n0)p1=2*(p2+1);p2=p1;n-;printf(“the total is%dn”,p1);#include main()int n=0;long t=1;printf(“n n!n”);while(n8)n+;t*=n;printf(%d%ld n,n,t);运行结果:n n!1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 求n!(n=18)do-while语句v一般形式:do while();v执行流程:do循环体expr假(0)真(非0)while“;”不能少exp
6、r循环体假(0)真(非0)循环体while循环v 特点:先执行循环体,后判断表达式v 说明:l 至少执行一次循环体l dowhile可转化成while结构dowhile语句特点和说明do while();omain()o int x=3;o doo o printf(“%d”,x-=2);o while(x=0);o1-1x=x-2;printf(“%d”,x);求1+2+3+100#include main()int sum=0,i;i=1;do sum=sum+i;i+;while(i=100);printf(”sum=%dn”,sum);#include main()int sum=0;
7、int i=1;while(i=100)sum=sum+i;i+;printf(“sum=%d,sum);main()int i=1,s=0;while(i1)s=s+i;i=i+1;printf(s=%dn,s);s=0main()int i=1,s=0;do s=s+i;i=i+1;while(i1);printf(s=%dn,s);s=1do-while与与while的区别的区别v 一般形式:for(表达1;表达式2;表达式3)v 执行流程:expr2循环体假(0)真(非0)forexpr1expr3for语句v 一般应用形式:for(初始化表达式;条件表达式;修正表达式)v 说明:l
8、for语句中expr1,expr2,expr3 类型任意,都可省略,但分号;不可省l for语句可以转换成while结构表达式1;while(表达式2)表达式3;for语句for(for(表达表达1;1;表达式表达式2;2;表达式表达式3)3)形式:形式:#includemain()int i=0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij形式:形式:#includemain()int i=0;for(;i10;i+)putchar(a+i);形式:形式:#includemain()int i=0;for(;i10;)putchar(a+(i+);形
9、式:形式:#includemain()int i=0;for(;i10;putchar(a+i),i+);例:for语句形式的多样性omain()oint i;o for(i=0;i10;i+)o i+;o printf(“%d”,i);o omain()int i;for(i=1;i5;i+);printf(“%d”,i);513579空语句求1+2+3+100main()int sum=0,i;for(i=1;i=100;i+)sum=sum+i;printf(”sum=%dn”,sum);几种循环的比较oowhile(表达式)o 语句;oodo 语句while(表达式);循环控制条件循环
10、控制条件循环条件初始化循环条件初始化循环修改条件循环修改条件也可在也可在forfor前前也可在循环体内也可在循环体内for(表达式1;表达式2;表达式3)语句 几种循环的比较123循环体的执行:先判断条件,循先判断条件,循环体可能一次也环体可能一次也不执行。不执行。while(表达式表达式)语句语句;后判断条件,后判断条件,循环体至少执循环体至少执行一次行一次.do 语句语句while(表达式表达式);for循环功能强,循环功能强,两者界限不清,两者界限不清,使用较随意。使用较随意。for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句界限不清界限不清界限不清界限不清小结小结v 循环
11、控制有两种方法:循环控制有两种方法:计数法计数法和和标志法标志法。能确定循环次数时,采用计数法,用能确定循环次数时,采用计数法,用for语句比较清晰;语句比较清晰;不能确定循环次数时,采用标志法,设法找出循环终不能确定循环次数时,采用标志法,设法找出循环终止条件,用止条件,用while或或do-while语句来实现。语句来实现。v 用用while与与do-while语句能实现的程序,用语句能实现的程序,用for语句未必可以语句未必可以实现。实现。v while语句是先判断后执行,语句是先判断后执行,do-while语句是先执行后判断。语句是先执行后判断。在循环体至少执行一次的情况下两者等价。在
12、循环体至少执行一次的情况下两者等价。#include main()int i,s;s=0;i=1;while(i=100)s=s+i;i+;printf(s=%dn,s);计算计算s=1+2+3+100s=1+2+3+100#include main()int i,s;s=0;i=1;do s=s+i;i+;while(i=100);printf(s=%dn,s);#include main()int i,s=0;for(i=1;i=100;i+)s=s+i;printf(s=%dn,s);i=1;i=1;for(;i=100;)for(;i=100;)s=s+i;s=s+i;i+;i+;om
13、ain()o int i;o for(i=1;i=0);去掉分号,结果是?例例:求:求Fibonacci数列第数列第40项。又叫项。又叫兔子繁殖问题(兔子繁殖问题(Fibonacci提出的)提出的)main()int n,m;long f1=1,f2=1,f3;printf(“%ld%ld”,f1,f2);for(m=3;m=40;m+)f3=f1+f2;f1=f2;f2=f3;printf(“%d”,f3);p r i n t f(“n”);设有一对新生兔子,从第设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多
14、少对兔子?规律,若所有兔子都不死,问一年后共有多少对兔子?迭代法迭代法算法分析:算法分析:月月:1 2 3 4 5 6 7 8:1 2 3 4 5 6 7 8 1 1-1 11 11 11 11 11-11-1 1 1 1 1-1 1 1 11 1-1 1 1 1 1 11 11 1-1 1 1 1 1 1-1 1 1 11 11 11 11 1 1 1 1 1-1 1 1 11 11 1 1 1兔兔:1 1 2 3 5 8 13 21f1 f21 1 f3=f1+f2 2 f1 f2 f3=f1+f2 3 f1 f2 f3=f1+f2 5 f1 f2 f3=初始条件初始条件终止条件终止条件迭
15、代公式迭代公式思考:思考:f1=f2和和f2=f3能否对换能否对换位置?不位置?不例例:打印出所有的水仙花数。一个打印出所有的水仙花数。一个3位数,其各位数字的位数,其各位数字的立方和等于它本身。立方和等于它本身。分析:百位数i=m/100;十位数:j=m/10%10;个位数k=m%10;判断m=i3+j3+k3main()int i,j,k,m;for(m=100;m1000;m+)i=m/100;j=m/10%10;k=m%10;if(m=i*i*i+j*j*j+k*k*k)printf(%5d,m);穷举法穷举法计数法计数法统计从键盘输入一行字符的个数.omain()oo int cou
16、nt=0;o while(getchar()!=n)o count+;o printf(%d,count);o标志法:标志法:循环终止条件循环终止条件main()int x,max,i;scanf(“%d”,&x);max=x;for(i=2;imax)max=x;printf(“max=%dn”,max);依次输入依次输入10个数,找出最大数。个数,找出最大数。分析:分析:输入输入x1x1 max输入输入x2若若x2max则则x2 max输入输入x3若若x3mx则则x3 max输入输入x4打擂方式打擂方式有一个分数序列有一个分数序列2/1,3/2,5/3,8/5,21/13求该数例前求该数例
17、前20项之和项之和main()int n,t;float a=2,b=1,s=0;for(n=1;n=a&c=A&c=0&c=9)digit+;elseothers+;printf(all in all:char=%d space=%d digit=%d others=%dn,letters,space,digit,others);v 循环的嵌套:循环体本身包含循环语句v 三种循环可互相嵌套,层数不限v 外层循环可包含两个以上内循环,但不能相互交叉(1)while()while().(2)do do while();.while();(3)while()do while();.(4)for(;
18、)do while();while().内循环外循环内循环循环的嵌套for(i=1;i5;i+)j=1;while(j4)printf(i=%d,j=%dn,i,j);j+;for(j=1;j4:j+)printf(i=%d,j=%dn,i,j);i=1,j=1i=1,j=2i=1,j=3i=2,j=1i=2,j=2i=2,j=3i=3,j=1i=3,j=2i=3,j=3i=4,j=1i=4,j=2i=4,j=3 形状形状 形状形状main()int i,j;for(i=1;i=9;i+)printf(“%4d”,i);printf(“n”);for(i=1;i=9;i+)printf(“%c
19、”,-);printf(“n”);for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%4d”,i*j);printf(“n”);P71例例12:打印九九乘法表:打印九九乘法表 形状形状1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 打印表头打印表头9个数字个数字打印虚线打印虚线打印打印表体表体for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%4d”,i*j);printf(“n”);打印打印表体表体for(i=1;i=9;i+)for(j=0;j=i-1;j+
20、)printf(“%4c”,);for(j=i;j=9;j+)printf(“%4d”,i*j);printf(“n”);打印打印表体表体打印打印空格空格例:百马百担例:百马百担有有100匹马,驮匹马,驮100担货,大马驮担货,大马驮3担,中马驮担,中马驮2担,两匹小担,两匹小马驮马驮1担。问有大、中、小马各多少?担。问有大、中、小马各多少?算法分析:算法分析:main()int a,b,c;for(a=0;a33;a+)for(b=0;b50;b+)c=100-a-b;if(3*a+2*b+c/2.0=100)printf(“a=%d”,a);printf(“b=%d”,b);printf(
21、“c=%dn”,c);设大、中、小马各为设大、中、小马各为a a、b b、c c,则:,则:3a+2b+c/2=100 a+b+c=100可得:可得:0a33 0b50 0c200穷举法穷举法若问有几种解决方法,若问有几种解决方法,则应如何修改程序?则应如何修改程序?用变量用变量k作为计数作为计数器,在器,在if语句中增语句中增加加“k+;”语句语句例例:打印图形。打印图形。1 23 456789 0 1*算法分析:算法分析:第第1行:行:1个个*,6个个空格空格,换行,换行第第2行:行:3个个*,4个个空格空格,换行,换行第第3行:行:5个个*,1个个空格空格,换行,换行第第4行:行:7个个
22、*,0个个空格空格,换行,换行第第i(14)行:行:2i-1个个*,8-2i个个空格空格,换行换行main()int i,j;for(i=1;i=4;i+)for(j=1;j=2*i-1;j+)printf(“*”);for(k=1;k=8-2*i;k+)printf(“”);printf(“n”);2i-1个个*8-2i个个空格空格换行换行补充举例:打印图形。补充举例:打印图形。1 23 45 6 78 9 1011*算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*号,换行号,换行第第2行:行:2个空格,个空格,5个个*号,换行号,换行第第3行:行:3个空格,个空格,5个个*号,
23、换行号,换行第第4行:行:4个空格,个空格,5个个*号,换行号,换行第第5行:行:5个空格,个空格,5个个*号,换行号,换行第第i(15)行:行:i个空格,个空格,5个个*号,换行号,换行main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“”);for(j=1;j=5;j+)printf(“*”);printf(“n”);i个空格个空格5个个*号号换行换行循环语句嵌套时,当外层循环语句嵌套时,当外层循环变量取循环变量取1个值时,内个值时,内层循环变量要取遍所有值层循环变量要取遍所有值补充举例(续):打印图形。补充举例(续):打印图形。1 23
24、 45678 90 1*1 23 45 6 78 90 11223334444555551 23 45 6 78 901*算法分析:算法分析:第第1行:行:5个空格,个空格,1个个*_,换行,换行第第2行:行:4个空格,个空格,2个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:2个空格,个空格,4个个*_,换行,换行第第5行:行:1个空格,个空格,5个个*_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个*_,换行,换行main()int i,j;for(i=1;i=5;i+)for(j=1;j=6-i;j+)printf(“”);for(
25、j=1;j=i;j+)printf(“*_”);printf(“n”);6-i个空格个空格i个个*_换行换行算法分析:算法分析:第第1行:行:5个空格,个空格,1个个1_,换行,换行第第2行:行:4个空格,个空格,2个个2_,换行,换行第第3行:行:3个空格,个空格,3个个3_,换行,换行第第4行:行:2个空格,个空格,4个个4_,换行,换行第第5行:行:1个空格,个空格,5个个5_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个i_,换行,换行main()int i,j;for(i=1;i=5;i+)for(j=1;j=6-i;j+)printf(“”);for(j=1;j=i
26、;j+)printf(“%d_”,i);printf(“n”);6-i个空格个空格i个个i_换行换行算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*_,换行,换行第第2行:行:2个空格,个空格,4个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:4个空格,个空格,2个个*_,换行,换行第第5行:行:5个空格,个空格,1个个*_,换行,换行第第i(15)行:行:i个空格,个空格,6-i个个*_,换行,换行main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“”);for(j=1;j3是否是否为素数
27、为素数main()int n,m;scanf(%d,&m);for(n=2;nm-1)printf(the%d is a primern,m);else printf(the%d is not a primern,m);例:验证素数例:验证素数 素数是除了素数是除了1 1和它自身外,和它自身外,再也找不到能被它整除的数。再也找不到能被它整除的数。即:若即:若m m不能被不能被2 2到到m-1m-1中中所有整数整除,则所有整数整除,则n n为素数。为素数。已证明只要从已证明只要从2 2判断到判断到m/2m/2或或 即可。即可。算法分析:算法分析:m求求100200间的全部素数间的全部素数?也可用
28、也可用m/2或或sqrt(m)与break语句退出循环不同的是,continue语句只结束本次循环,忽略循环体中剩下的语句,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。例:输出100以内的偶数main()int i;for(i=1;i=100;i+)if(i%2!=0)continue;printf(%d ,i);本次循环结束,循环体中剩余语句被忽略,执行达式3.进入下一循环.continue做if的内嵌语句if(i%2=0)if(i%2=0)printf(%d,i);(%d,i);continue语句例例:打印打印3-100内的素数。内的素数。main()int n,
29、m;scanf(“%d”,&m);for(m=3;m=100;m+)for(n=2;nm/2;n+)if(m%n=0)break;if(nm/2)continue;printf(“%5d”,m);#include main()()int i,s;s=0;for(i=1;i=10;i+)if(i%2=0)continue;if(i%10=7)break;s=s+i;printf(s=%dn,s);阅读下面程序,写出运行结果阅读下面程序,写出运行结果 结果:结果:S=9return和gotomain()int sum=0,i=1;Loop:if(ib)max=a;else max=b;return
30、 max;main()int a,b;scanf(“%d%d”,&a,&b);printf(“MAX is%dn”,max(a,b);omain()ooint x,y,z;ox=2;y=7;z=5;oswitch(x0)oo case 1:switch(y10)o case 1:printf();break;o case 0:printf(!);break;oo case 0:switch(z=5)oocase 0:printf(*);break;ocase 1:printf(#);break;odefault:printf(%);break;oo default:printf(&);ooprintf(n);o 思考运行结果是什么?小结o 前五章主要讲了C语言的基础知识,3种基本的数据类型和几种运算符及表达式,C语言中3种基本的结构以及简单的编程思想。o要求:通过这几章的学习,要求学生掌握C的编程思想以及算法的制定,同时要求掌握调试程序的方法
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。