《大学C语言第4章(改).ppt》由会员分享,可在线阅读,更多相关《大学C语言第4章(改).ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章章.循环结构程序循环结构程序 1.1.概述概述2.2.用用 gotogoto 语句和语句和 if if 语句构成循环语句构成循环 例例:intint i=1,sum=0;i=1,sum=0;loop:if(i=100)loop:if(i=100)sum=sum+i;sum=sum+i;i+;i+;gotogotoloop;loop;PANAPN14.1 循环结构引例循环结构引例引例:求引例:求s=1+2+3+100的和。的和。这个问题看似简单,但如果限制使用非结构化的这个问题看似简单,但如果限制使用非结构化的goto语句,语句,迄今也只能使用如下编程思路:迄今也只能使用如下编程思路
2、:s=1;s=s+2;/s为为1+2s=s+3;/s为为1+2+3s=s+99;/s为为1+2+3+99s=s+100;/s为为1+2+3+99+1002循环结构基本思路为:循环结构基本思路为:第第1步:步:s=0;j=1;第第2步:步:s=s+j;j=j+1;第第3步:如果步:如果j100,继续第,继续第2步,否则结束。步,否则结束。上述上述3步操作,第步操作,第2步是关键,它是循环的主体,称循环体;第步是关键,它是循环的主体,称循环体;第1步是循环的初始条件,第步是循环的初始条件,第3步是循环的终止条件。循环体、步是循环的终止条件。循环体、初始条件、终止条件是设计循环程序的三要素初始条件、
3、终止条件是设计循环程序的三要素 34.2.1 while语句语句(当型)(当型)一般形式:一般形式:while(while(表达式)表达式)循环体语句循环体语句先判表达式,若非先判表达式,若非0,0,执行执行循环体语句,再判表达式循环体语句,再判表达式例:例:求求 main()main()intint i,sum=0;i,sum=0;i=1;i=1;while(i=100)while(i=100)sum=sum+i;sum=sum+i;i+;i+;printf(“sumprintf(“sum=%d”,sum);=%d”,sum);注:循环体中必须有使循环测试条件变化的语句。注:循环体中必须有使
4、循环测试条件变化的语句。i sum1 12 1+23 1+2+3.100 1+2+3+100表达式循环体图4-while循环0非04【例例4.2】输入若干名学生成绩,求最高分、最低分,直到输输入若干名学生成绩,求最高分、最低分,直到输入成绩为入成绩为0止。止。算法分析:该问题只知道成绩输入的结束条件,并不知道要输算法分析:该问题只知道成绩输入的结束条件,并不知道要输入多少个成绩,这是当型循环问题。另外,求若干个数的最入多少个成绩,这是当型循环问题。另外,求若干个数的最大值、最小值也是经常遇到的问题,解决的基本思想是:先大值、最小值也是经常遇到的问题,解决的基本思想是:先将第一个数既放在变量将第
5、一个数既放在变量max中,也放在中,也放在min中;再将第二个中;再将第二个数分别与数分别与max和和min比较,这样就可以求出前比较,这样就可以求出前2个数中最大的个数中最大的和最小的数,分别将它们放到和最小的数,分别将它们放到max和和min中,依次类推;最中,依次类推;最后,变量后,变量max和和min的值就是最大数和最小数。程序如下:的值就是最大数和最小数。程序如下:5#include void main()float x,max,min;scanf(%f,&x);/先输入第一个数据先输入第一个数据 max=min=x;/第一个数据可能最大也可能最小第一个数据可能最大也可能最小 whi
6、le(x!=0)/判断数据是否输入完毕判断数据是否输入完毕 if(xmax)max=x;/x是否比已求得的最大数还大是否比已求得的最大数还大 if(xmin)min=x;/x是否比已求得的最小数还小是否比已求得的最小数还小 scanf(%f,&x);/读取下一个数据继续比较读取下一个数据继续比较 printf(max=%f,min=%fn,max,min);64.2.2 do-while语句语句(直到型直到型)一般形式:一般形式:dodo 语句语句 while(while(表表达式达式););先先执行语句,然后判断表达式,当非执行语句,然后判断表达式,当非0 0时,返回重时,返回重新执行,直到
7、表达式为新执行,直到表达式为0 0时结束。时结束。例:例:main()main()intint i,sum=0;i,sum=0;i=1;i=1;do do sum=sum+i;i+;sum=sum+i;i+;while(i=100)while(i=100)printf(“sumprintf(“sum=%d”,sum);=%d”,sum);非0表 达式循环体图4-2 do-while循环07【例例4.3】输入若干名学生成绩,统计各分数段人数(输入若干名学生成绩,统计各分数段人数(90,8090,7080,6070,60),总人数及求平均成绩,直到输入成),总人数及求平均成绩,直到输入成绩为绩为0
8、止。止。算法分析:这是分类计数问题,根据成绩所处的分数段,相应的变算法分析:这是分类计数问题,根据成绩所处的分数段,相应的变量加量加1,直到所有成绩都处理完为止。设变量,直到所有成绩都处理完为止。设变量c1、c2、c3、c4、c5分别表示各分数段人数,分别表示各分数段人数,c1、c2等称为计数变量。假设成绩输入等称为计数变量。假设成绩输入的个数由直到型循环控制,程序如下:的个数由直到型循环控制,程序如下:8#include void main()float x,sum=0,aver;/变量分别表示成绩、总成绩、平均成绩变量分别表示成绩、总成绩、平均成绩 int c1,c2,c3,c4,c5,c
9、;/计数变量代表各分数段人数和总人数计数变量代表各分数段人数和总人数 c1=c2=c3=c4=c5=c=0;/从从0开始计数开始计数 scanf(%f,&x);/输入第输入第1个成绩个成绩 do sum+=x;/将成绩加到总成绩中将成绩加到总成绩中 c+;/总人数加总人数加1 if(x=90)c1+;/判断成绩并修改相应的计数变量判断成绩并修改相应的计数变量 else if(x=80)c2+;else if(x=70)c3+;else if(x=60)c4+;else c5+;scanf(%f,&x);/输入下一个成绩输入下一个成绩 while(x!=0);/判断成绩是否输入完毕判断成绩是否输
10、入完毕 aver=sum/c;printf(各分数段人数:各分数段人数:%d,%d,%d,%d,%dn,c1,c2,c3,c4,c5);printf(总人数:总人数:%d,平均成绩:,平均成绩:%fn,c,aver);9【例例4.4】从键盘上输入若干字符,以换行为结束符,统计输入字符从键盘上输入若干字符,以换行为结束符,统计输入字符的个数。的个数。#include void main()int s;char c;s=-1;/存放统计结果变量的初值存放统计结果变量的初值 do s+;while(c=getchar()!=n);/判断是否为换行符判断是否为换行符 printf(字符数为:字符数为:
11、%dn,s);本程序中,换行结束符本程序中,换行结束符n也被统计在内,所以将也被统计在内,所以将s的初值设置为的初值设置为-1。在循环中通过函数在循环中通过函数getchar()从键盘读取从键盘读取1个字符并赋给变量个字符并赋给变量c,然,然后判断变量后判断变量c是否不等于换行符是否不等于换行符n。104.2.3 for语句语句While While 和和 do.do.whilewhile一般在循环次数不确定的情况下使用,一般在循环次数不确定的情况下使用,forfor循环是循环是C C语言中使用最为灵活的语句。语言中使用最为灵活的语句。一般形式:一般形式:for(for(表达式表达式1;1;表
12、达式表达式2;2;表达式表达式3)3)循环体语句循环体语句执行过程:执行过程:先求表达式先求表达式1 1(一般是(一般是循环控制变量循环控制变量赋初值)赋初值)求表达式求表达式2 2,若非,若非0 0,则执行循环体语句,则执行循环体语句,再转到第再转到第步,否则循环结束。步,否则循环结束。求表达式求表达式3 3(一般是(一般是循环控制变量循环控制变量增值)增值)转回到第转回到第步继续执行。步继续执行。非0 图4-3 for循环0表达式2表达式1语句表达式311例:例:求求main()main()intint i,sum=0;i,sum=0;for(i=1;i=100;i+)sum=sum+i;
13、for(i=1;i=100;i+)sum=sum+i;printf(“sumprintf(“sum=%d”,sum);=%d”,sum);注:注:for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3);循环体是空语句。循环体是空语句。表达式表达式1 1,表达式,表达式2 2,表达式,表达式3 3,都省略,死循环。,都省略,死循环。for(;).for(;).表达式表达式1 1和表达式和表达式3 3也可以是逗号表达式。也可以是逗号表达式。表达式表达式2 2一般是关系或逻辑表达式,也可以是数值或字符表达式,一般是关系或逻辑表达式,也可以是数值或字符表达式,只要非只要非0 0,
14、就执行循环体。,就执行循环体。12例:例:for(i=0;(c=for(i=0;(c=getchargetchar()!=n;i+=c);()!=n;i+=c);不断地输入一个字符,将它们的不断地输入一个字符,将它们的ASCIIASCII码相加,直到码相加,直到输入一个回车键。输入一个回车键。for(;(c=for(;(c=getchargetchar()!=n;)()!=n;)printf(“%c”,cprintf(“%c”,c););从键盘输入一个字符,再输出,直到输入一个回车键。从键盘输入一个字符,再输出,直到输入一个回车键。【例例4.5】用用for语句编写程序求语句编写程序求6的阶乘。
15、的阶乘。#include void main()int k,p;p=1;for(k=1;k7;k+)p=p*k;/循环执行循环执行6次次 printf(6!=%dn,p);printf(k=%dn,k);运行结果如图所示。运行结果如图所示。13【例【例4.6】统计统计222到到333之间能同时被之间能同时被3和和5整除的数的个数。整除的数的个数。#include void main()int k,s;for(s=0,k=222;k=333;k+)if(k%3=0&k%5=0)s+;printf(s=%d,s);s=0,k=222是逗号表达式,完成给变量是逗号表达式,完成给变量s、k赋初值,赋初
16、值,if语句的条件语句的条件(k%3=0&k%5=0)运算优先级是先计算,后算,最)运算优先级是先计算,后算,最后再算后再算&,等价于(,等价于(k%3=0)&(k%5=0),加括号后条),加括号后条件表达式更加清晰,可读性更好。件表达式更加清晰,可读性更好。144.3 breakbreak和和continuecontinue语句语句(1).break(1).break语句:语句:跳出跳出switchswitch结构、循环体。结构、循环体。【例例4.7】阅读分析下列程序,理解并掌握阅读分析下列程序,理解并掌握break和和continue语句的功语句的功能与区别。能与区别。#include v
17、oid main()int k;for(k=1;k=8;k+)if(k%4=0)break;/终止循环终止循环 printf(k=%dn,k);printf(退出退出for循环时:循环时:k=%dn,k);15 (2).continue(2).continue语句:结束本次循环,即跳过循环中语句:结束本次循环,即跳过循环中 continue continue 语句之后的语句,转去执行循环体语句之后的语句,转去执行循环体后面后面的操作。的操作。若将上述程序改用若将上述程序改用continue语句,程序代码如下:语句,程序代码如下:#include void main()int k;for(k=1
18、;k=8;k+)if(k%4=0)continue;/只退出本次循环只退出本次循环 printf(k=%dn,k);printf(退出退出for循环时:循环时:k=%dn,k);164.4循环的嵌套循环的嵌套循环体内包含另一个循环结构。循环体内包含另一个循环结构。【例例4.8】用用for语句编写程序输出乘法九九表语句编写程序输出乘法九九表#include void main()int k,j,m;printf(t乘法九九表乘法九九表n);for(k=1;k=9;k+)/k为外循环控制变量为外循环控制变量 /外循环体开始外循环体开始 for(j=1;j=9;j+)/j为内循环控制变量为内循环控制
19、变量 /内循环体开始内循环体开始 m=k*j;/共执行共执行81次次 printf(%d*%d=%2d,k,j,m);/内循环体结束内循环体结束 printf(n);/共共9次换行次换行 /外循环结束外循环结束 0k=1k=9j=1输出k*jj=9j=j+1k=k+1 非0 0 非017思考:要输出如图思考:要输出如图4.9形式的乘法九九表,如何修改程序?形式的乘法九九表,如何修改程序?18【例例4.9】用用while语句编程序输出乘法九九表。语句编程序输出乘法九九表。#include void main()int k,j,m;k=1;/外层循环控制变量赋初值外层循环控制变量赋初值 while
20、(k=9)/外层循环共执行外层循环共执行9次次 j=1;/内层循环控制变量赋初值内层循环控制变量赋初值 while(j=9)/判断内层循环执行判断内层循环执行9次次 m=k*j;/内循环体共执行内循环体共执行81次次 printf(%d*%d=%d,k,j,m);j=j+1;/修改内层循环控制变量修改内层循环控制变量 printf(n);/9次换行次换行 k=k+1;/修改外层循环控制变量修改外层循环控制变量 19下面输出图形形状,也是多重循环问题。程序功能:输入下面输出图形形状,也是多重循环问题。程序功能:输入n(0n10)后,输)后,输出一个数字金字塔。例如输入出一个数字金字塔。例如输入n
21、为为4时,输出形状如下,阅读并分析该程序。时,输出形状如下,阅读并分析该程序。1 222 33333 4444444#include void main()int i,j,n;scanf(%d,&n);for(i=1;i=n;i+)/共输出共输出n行行 for(j=1;j=n+1-i;j+)putchar();/输出空格字符输出空格字符 for(j=1;j=2*i-1;j+)/控制每行输出的字符数控制每行输出的字符数 putchar(char)(i+48);/ASCII码对应的字符码对应的字符 putchar(n);/每行结束输出换行符每行结束输出换行符 204.5 应用举例应用举例【例例3.
22、10】判断判断m是否为素数。是否为素数。算法描述:素数就是质数。它除了能表示为它自身和算法描述:素数就是质数。它除了能表示为它自身和1的乘积以外,的乘积以外,不能表示为任何其它两个整数的乘积。要判断正整数不能表示为任何其它两个整数的乘积。要判断正整数m是否是素数,是否是素数,用用m分别除以分别除以2到到m/2间的整数,如果间的整数,如果2到到m/2间的整数没有一个数能间的整数没有一个数能将将m整除,则整除,则m是素数,否则是素数,否则m不是素数。不是素数。在循环中用在循环中用2到到m/2间的整数间的整数k去除去除m,若,若k能整除能整除m,用,用break语句终语句终止循环。程序可止循环。程序
23、可根据循环控制变量根据循环控制变量k的值的值是否超过是否超过m/2,来判断,来判断m是是否为素数。否为素数。即循环是正常结束即循环是正常结束,还是用还是用break语句终止语句终止。程序如下:程序如下:21#include void main()int k,m;scanf(%d,&m);for(k=2;km/2)/条件成立表示没有出现过整除情况条件成立表示没有出现过整除情况 printf(%d 是素数是素数,m);else printf(%d 不是素数不是素数,m);读者思考:要求读者思考:要求100200间的全部素数,如何编写程序?间的全部素数,如何编写程序?22【例例4.11】求求3位的水
24、仙花数。位的水仙花数。水仙花数是指一个水仙花数是指一个n位整数,它的每个位上的数字的位整数,它的每个位上的数字的n次幂之和等于它本身。次幂之和等于它本身。例如例如3位数位数153是水仙花数,各位数字的立方和是水仙花数,各位数字的立方和135333153。分析:通过取整、求余等运算,把分析:通过取整、求余等运算,把3位整数的每一位数字分离出来,将他们的位整数的每一位数字分离出来,将他们的立方和与该整数比较即可。立方和与该整数比较即可。#include void main()int x,j,k,m;printf(100到到999间的水仙花数有:间的水仙花数有:n);for(x=100;x1000;
25、x+)j=x/100;/分离出高位分离出高位 k=(x/10)%10;/分离出中间位分离出中间位 m=x%10;/分离出低位分离出低位 if(j*j*j+k*k*k+m*m*m=x)printf(%dn,x);23【例例4.12】假设有假设有10位裁判给运动员评分,去掉最高分、最低位裁判给运动员评分,去掉最高分、最低分,剩余分,剩余8位裁判的平均分为运动员最后得分。位裁判的平均分为运动员最后得分。该问题的数学描述为:求该问题的数学描述为:求10个数的最大值、最小值和其余个数的最大值、最小值和其余8个数的平均值。个数的平均值。求最大值求最大值max的方法是先假定第一个数为最大值,然后将该的方法是
26、先假定第一个数为最大值,然后将该数与下一个数进行比较,若下一个数大于数与下一个数进行比较,若下一个数大于max,则修改,则修改max的值为新的数,如此重复,直到与最后一个数比较完毕,的值为新的数,如此重复,直到与最后一个数比较完毕,max就是最大值。类似地可求最小值。就是最大值。类似地可求最小值。24#include void main()int c;float x,max,min,s,aver;scanf(%f,&x);/输入第一个分数输入第一个分数 s=x;max=min=x;/第一个分数可能是最高分也可能是最低分第一个分数可能是最高分也可能是最低分 for(c=1;cmax)max=x;
27、/是否要修改是否要修改max if(xmin)min=x;/是否要修改是否要修改min s+=x;aver=(s-max-min)/8.0;/剩余剩余8位裁判的平均分位裁判的平均分 printf(max=%f,min=%f,aver=%f,max,min,aver);25【例例4.13】用下列公式计算圆周率用下列公式计算圆周率 的值。的值。精度要求为精度要求为 分析:分析:循环次数不知,用循环次数不知,用whilewhile或或do-whiledo-while比较好。比较好。在循环中要产生级数的当前项,需要找出它的规律。当前项分母在循环中要产生级数的当前项,需要找出它的规律。当前项分母是前一项
28、分母加是前一项分母加2;用;用f存放为项的符号,存放为项的符号,f=-f;可实现项的符号交可实现项的符号交替改变;替改变;t存放当前项,存放当前项,pi存放存放 /4的值。的值。26#include#include#define EPS 1.0e-6void main()float pi=0.0,n=1.0,f=1.0,t;do t=f/n;pi+=t;f=-f;n+=2;while(fabs(t)=EPS);pi=4*pi;printf(=%fn,pi);pi n f t 1 1 1 11-1/3 3 -1 -1/31-1/3+1/5 5 1 1/5 27【补充例补充例 】求求Fibonac
29、ciFibonacci数列前数列前4040个数。个数。1,1,2,3,5,8,13,21,.1,1,2,3,5,8,13,21,.#include void main()int i;long int f1=1,f2=1;for(i=1;i=20;i+)printf(“%12ld%12ld”,f1,f2);if(i%2=0)printf(“n”);f1=f1+f2;f2=f1+f2;284.6 自主学习自主学习1枚举法枚举法 枚举法也称穷举法,就是将所有可能出现的情况都测试一遍,枚举法也称穷举法,就是将所有可能出现的情况都测试一遍,从中找出满足条件的答案。从中找出满足条件的答案。【例例4.14】
30、填数字游戏。求满足下列加法算式的数字。填数字游戏。求满足下列加法算式的数字。算式中要求求出满足算式中要求求出满足ABCCB=BCA的数字的数字A、B和和C。分析:用枚举法将所有可能出现的分析:用枚举法将所有可能出现的3位数位数ABC与与2位数位数CB的和,与的和,与3位数位数BCA比较,如果相等就是需要的算式。比较,如果相等就是需要的算式。A B C C B B C A29#include void main()int a,b,c;for(a=1;a10;a+)/不考虑不考虑000 for(b=1;b10;b+)for(c=1;c10;c+)if(a*100+b*10+c+c*10+b=b*1
31、00+c*10+a)printf(“%d+%d=%d”,a*100+b*10+c,c*10+b,b*100+c*10+a);30牛顿牛顿迭代法迭代法的基本思想:的基本思想:选一个近似根选一个近似根x x0 0由由x x0 0求求f(xf(x0 0),),得交点得交点p p0 0通过通过p p0 0点作点作f(xf(x)的切线的切线交交x x轴于轴于x x1 1,x x1 1=x=x0 0-f(x-f(x0 0)/f(x)/f(x0 0)由由x x1 1求求f(xf(x1 1),),得交点得交点p p1 1再通过再通过p p1 1点作点作f(x)f(x)的的 切线切线交交x x轴于轴于x x2
32、2,x x2 2=x=x1 1-f(x-f(x1 1)/f(x)/f(x1 1)再由再由x x2 2求求f(xf(x2 2),),得交得交 点点p p2 2 重复下去重复下去 直到直到|x|xn+1n+1-x-xn n|取取x xn+1n+1作为近似根。作为近似根。x2 x1 x0p0p1YX31#include#include#define EPS 1.0e-6void main()double x0,x1,fx,f1x;x1=1.0;/迭代初始值迭代初始值 do x0=x1;/迭代迭代 fx=3*x0*x0*x0-4*x0*x0-5*x0+13;f1x=9*x0*x0-8*x0-5;x1=x0-fx/f1x;while(fabs(x1-x0)EPS);printf(方程的根方程的根%lfn,x1);3233