《第5章循环结构.ppt》由会员分享,可在线阅读,更多相关《第5章循环结构.ppt(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5章循环结构 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望5.1 while循环控制循环控制(P50)l l语句一般格式语句一般格式 while(表达式表达式)语句语句 l l一般为一般为一般为一般为关系关系关系关系表达式或表达式或表达式或表达式或逻辑逻辑逻辑逻辑表达式,也可以表达式,也可以表达式,也可以表达式,也可以是是是是C C语言其他类型的语言其他类型的语言其他类型的语言其他类型的合法表达式合法表达式合法表达式合法表达式 l l用来控制循环体是否用来控制
2、循环体是否用来控制循环体是否用来控制循环体是否执行执行执行执行l l称为称为称为称为内嵌语句内嵌语句内嵌语句内嵌语句,可以,可以,可以,可以是基本语句、控制语是基本语句、控制语是基本语句、控制语是基本语句、控制语句,也可以是复合语句,也可以是复合语句,也可以是复合语句,也可以是复合语句句句句l l是循环重复执行的部是循环重复执行的部是循环重复执行的部是循环重复执行的部分分分分 2功能:功能:l l计算表达式的值计算表达式的值计算表达式的值计算表达式的值,为非,为非,为非,为非0 0(逻辑真)时,重复执(逻辑真)时,重复执(逻辑真)时,重复执(逻辑真)时,重复执行行行行内嵌语句内嵌语句内嵌语句内
3、嵌语句,每执行一次,就判断一次表达式的,每执行一次,就判断一次表达式的,每执行一次,就判断一次表达式的,每执行一次,就判断一次表达式的值,直到表达式的值为值,直到表达式的值为值,直到表达式的值为值,直到表达式的值为0 0 时结束循环,转去执行时结束循环,转去执行时结束循环,转去执行时结束循环,转去执行whilewhile后面的语句。后面的语句。后面的语句。后面的语句。当表达式为真当表达式为真 语句语句N-SN-S结构图结构图结构图结构图N NY Y流程图流程图流程图流程图表表达达式式非非0?语句语句循环控制条件循环控制条件循环控制条件循环控制条件循环体循环体循环体循环体3例如:例如:【例【例】
4、编写程序,求编写程序,求100个自然数的和个自然数的和即:即:s=1+2+3+100 思路:寻找思路:寻找加数加数与与求和求和的规律的规律 加数加数i i从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到直到i的值超过的值超过100。i i的的初值初值初值初值设为设为1。求和求和设变量设变量 sum sum 存放和存放和,循环求,循环求sum=sum+isum=sum+i,直至直至i超过超过100。4算法和程序:算法和程序:main()int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);程序输出结果:
5、程序输出结果:sum=5050i i:循环控制变量循环控制变量sumsum:累加器累加器 i=1,sum=0 当当i=100 sum=sum+i i+输出输出sum5注意:注意:l l如果如果while的的(表达式表达式)值为值为0,则循环体,则循环体一次也不执行一次也不执行(例如当例如当i的初值的初值=101)。l l在循环体中必须有使循环趋向结束的操作,在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(否则循环将无限进行(死循环死循环)。)。l l在循环体中,语句的先后位置必须符合逻在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。辑,否则会影响运算结果。思考程序段的输出
6、?思考程序段的输出?while(i=100)i+;sum=sum+i;运行后,输出:运行后,输出:运行后,输出:运行后,输出:sum=5150sum=5150原因是什么?原因是什么?原因是什么?原因是什么?6注意(续):注意(续):l为了保证循环正常运行,应该特别为了保证循环正常运行,应该特别注意:注意:循环控制条件的描述循环控制条件的描述 控制条件的初始状态(初始值)控制条件的初始状态(初始值)循环体内部对控制条件的影响循环体内部对控制条件的影响7例例,显示显示110的平方的平方#include main()int i=1;while(i=10)printf(%d*%d=%dn,i,i,i*
7、i);i+;运行结果:运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=1008#include main()int i=0,sum=0;while(sum10000)sum+=i*i;i+;printf(“i=%d sum=%dn,i-1,sum);【例5.1】:编写程序,求122232n2,直到累加和大于或等于10000为止。程序运行结果:i31 sum=10416思考?思考?while(sum10000)i+;sum+=i*i;9程序运行结果:程序运行结果:i30 sum=10415#include main()i
8、nt i=1,sum=0;while(sum10000)i+;sum+=i*i;printf(“i=%d sum=%dn,i-1,sum);不符合题目不符合题目要求要求10思路:使用循环不断累加每项,每一项的分母思路:使用循环不断累加每项,每一项的分母比前一项比前一项 增加增加2,符号相反,符号相反设置:设置:l l设设s为符号位,为符号位,n为每项分母,为每项分母,t为每项值,为每项值,t=s/nl l每循环一次,每循环一次,s符号改变一次符号改变一次s=-s,分母加,分母加2,n=n+2l lpi为所求为所求 /4的值,的值,pi=pi+t例例例例5.2 5.2 用用用用 公式求公式求公式
9、求公式求 的近的近的近的近似值,直到最后一项的绝对值小于似值,直到最后一项的绝对值小于似值,直到最后一项的绝对值小于似值,直到最后一项的绝对值小于1010-6-6为止为止为止为止 11#include#include main()int s=1;float n=1.0,t=1.0,pi=0;while(fabs(t)=1e-6)pi=pi+t;n+=2.0;s=-s;t=s/n;pi=pi*4;printf(“pi=%fn,pi);执行结果:执行结果:pi=3.141594设设s为符号位,为符号位,n为每项为每项分母,分母,t为每项值,为每项值,pi为所求为所求 的值的值125.2 do-wh
10、ile语句语句(P53)l l语句一般格式语句一般格式 do 语句语句 while(表达式表达式);l l功能:功能:先执行内嵌语句先执行内嵌语句(循环体),之后计算(循环体),之后计算表达式的值,不为表达式的值,不为0(逻辑真)时,再(逻辑真)时,再执行循环体并判断条件,直到表达式的执行循环体并判断条件,直到表达式的值为值为 0 结束循环,转去执行结束循环,转去执行while下面下面的语句。的语句。13 do-while循环的算法循环的算法 循环体循环体当表达式为真当表达式为真N-S结构图结构图NY循环体循环体表达式非表达式非0?流程图流程图main()main()int i=1,sum=0
11、;int i=1,sum=0;do do sum=sum+i;sum=sum+i;i+;i+;while(i=100);while(i=100);printf(%dn,sum);printf(%dn,sum);用用用用do-whiledo-while语句语句语句语句求求求求100100个自然数的和个自然数的和个自然数的和个自然数的和 14说明:说明:l lwhile和和do-while都能实现循环控制,都能实现循环控制,while结构程序通常都可以转换成结构程序通常都可以转换成do-while结构结构l l区别:区别:do-while 语句语句先执行循环体再判断条先执行循环体再判断条件,循环体
12、件,循环体至少执行一次至少执行一次;while 语句语句先判断条件再执行循环体,先判断条件再执行循环体,循环体有可能一次也不执行循环体有可能一次也不执行l ldowhile循环体中一定要有能使表达式值循环体中一定要有能使表达式值趋于趋于0的操作的操作(如如i+),否则会出现否则会出现死循环死循环。15do-while语句的简单应用语句的简单应用【例【例】用辗转相除法求用辗转相除法求m和和n的最大公约数的最大公约数定义定义m、n、rmnT F m和和n交换交换r=m%nm=nn=r 当当r!=0时时输出最大公约数输出最大公约数m16算法和程序:算法和程序:main()int m,n,r;scan
13、f(%d,%d,&m,&n);if(m2n2)f fn n=l l设设设设变变变变量量量量f1f1、f2f2和和和和f f,并并并并为为为为f1f1和和和和f2f2赋赋赋赋值值值值为为为为0 0和和和和1 1,令令令令f=f1+f2f=f1+f2得到第得到第得到第得到第3 3项;项;项;项;l l将将将将f1f2f1f2,f2f f2f,再求再求再求再求f=f1+f2f=f1+f2得到第得到第得到第得到第4 4项;项;项;项;l l依此类推求第依此类推求第依此类推求第依此类推求第5 5项、第项、第项、第项、第6 6项项项项这是一种这是一种这是一种这是一种递推算法递推算法递推算法递推算法应采用循
14、环实现应采用循环实现应采用循环实现应采用循环实现18算法和程序算法和程序#includemain()int f1,f2,f;f1=0;f2=1;do f=f1+f2;f1=f2;f2=f;while(f2=1000);printf(“F=%dn“,f2);f1=0,f2=1 f=f1+f2 f1=f2 f2=f 当当f2=1000时时打印打印f2执行结果:执行结果:F=1597195.3 for语句语句(P55)l l语句一般格式语句一般格式 for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句 l l功能:功能:计算表达式计算表达式计算表达式计算表达式1 1的值,再的值,再的值,
15、再的值,再判断表达式判断表达式判断表达式判断表达式2 2,如果其,如果其,如果其,如果其值为非值为非值为非值为非0 0(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(循环循环循环循环体体体体),并,并,并,并计算表达式计算表达式计算表达式计算表达式3 3;之后再去判断表达式;之后再去判断表达式;之后再去判断表达式;之后再去判断表达式2 2,一直到其值为,一直到其值为,一直到其值为,一直到其值为0 0时结束循环,执行后续语句。时结束循环,执行后续语句。时结束循环,执行后续语句。时结束循环,执行后续语句。循环初始条件循环初始条件循环初始条件
16、循环初始条件循环控制条件循环控制条件循环控制条件循环控制条件循环体循环体循环体循环体20for语句的算法语句的算法N-S结构图结构图for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句NY流程图流程图计算表达式计算表达式1 语句语句计算表达式计算表达式3表达式表达式2为真为真?例如:例如:例如:例如:main()main()int i,sum;int i,sum;sum=0;sum=0;for(i=1;i=100;i+)for(i=1;i=100;i+)sum=sum+i;sum=sum+i;printf(sum=%dn,sum);printf(sum=%dn,sum);可部分或全
17、部省略,可部分或全部省略,可部分或全部省略,可部分或全部省略,但但但但“;”不可省略不可省略不可省略不可省略21for语句的简单应用语句的简单应用【例【例】求求n!,即计算即计算p=123n的值。的值。思路:求阶乘与求累加的运算处理过程类似,只要思路:求阶乘与求累加的运算处理过程类似,只要将将“+”变为变为“*”。设置:设置:乘数乘数乘数乘数i i,初值为,初值为1,终值为,终值为n(n是循环控制终是循环控制终值,需要从键盘输入)值,需要从键盘输入)累乘器累乘器累乘器累乘器 p p,每次循环令,每次循环令p=p*i22程序:程序:main()int i,n;long p;p=1;printf(
18、Enter n:);scanf(%d,&n);for(i=1;i=n;i+)p=p*i;printf(p=%ld n,p);思考:思考:思考:思考:如何输出如何输出如何输出如何输出1!,2!,1!,2!,n!n!?如何求如何求如何求如何求s=1!+2!+n!s=1!+2!+n!?23【例例例例5.65.6】计算半径为计算半径为计算半径为计算半径为0.5mm0.5mm、1.0mm1.0mm、1.5mm1.5mm、2.0mm2.0mm、2.5mm2.5mm时的圆面积时的圆面积时的圆面积时的圆面积#includemain()double r,s,Pi=3.1416;for(r=0.5;r2n2)f
19、fn n=l l设设设设 变变变变 量量量量 f1f1、f2f2和和和和 f3f3,并并并并 为为为为 f1f1和和和和 f2f2赋赋赋赋 初初初初 值值值值 1 1,令令令令f3=f1+f2f3=f1+f2得到第得到第得到第得到第3 3项;项;项;项;l l将将将将f1f2f1f2,f2f3 f2f3,再求再求再求再求f3=f1+f2f3=f1+f2得到第得到第得到第得到第4 4项;项;项;项;l l依此类推求第依此类推求第依此类推求第依此类推求第5 5项、第项、第项、第项、第6 6项项项项这是一种这是一种这是一种这是一种递推算法递推算法递推算法递推算法应采用循环实现应采用循环实现应采用循环
20、实现应采用循环实现25算法和程序算法和程序#define define N N 20 20main()main()int i,f1,f2,f3;int i,f1,f2,f3;f1=f2=1;f1=f2=1;printf(n%8d%8d,f1,f2);printf(n%8d%8d,f1,f2);for(i=3;i=for(i=3;i=N N;i+);i+)f3=f1+f2;f3=f1+f2;f1=f2;f1=f2;f2=f3;f2=f3;printf(%8d,f3);printf(%8d,f3);if(i%5=0)printf(n);if(i%5=0)printf(n);f1=1,f2=1并输出
21、并输出for(i=3;i=20;i+)f3=f2+f1 f1=f2,f2=f3 输出输出f3 输出输出输出输出5 5个数个数个数个数 T F 换行换行26省略省略for语句的表达式语句的表达式 表达式表达式表达式表达式1 1、2 2、3 3全省略,全省略,全省略,全省略,即:即:即:即:for(;)for(;)就等同于:就等同于:就等同于:就等同于:while(while(1)1),会无限循环(会无限循环(会无限循环(会无限循环(死循环死循环死循环死循环)注意:在省略某个表达式时,应在适当位置进行循注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行环控制的必要操
22、作,以保证循环的正确执行 省略表达式省略表达式省略表达式省略表达式1 1和表达式和表达式和表达式和表达式3 3,即:即:即:即:for for(;(;(;(;表达式表达式表达式表达式2 2;);););)就等同于:就等同于:就等同于:就等同于:whilewhile(表达式表达式表达式表达式2 2)省略表达式省略表达式省略表达式省略表达式2 2,即:即:即:即:forfor(表达式表达式表达式表达式1 1;表达式;表达式;表达式;表达式3 3)就等同于:就等同于:就等同于:就等同于:表达式表达式表达式表达式1;1;while(1while(1)表达式表达式表达式表达式3;3;27例如:例如:i=
23、1;for(;i100)for(i=1;i100)i+;28例:例:#include main()int i;for(i=0;i10;i+)putchar(a+i);运行结果:运行结果:abcdefghij例:例:#include main()int i=0;for(;i10;)putchar(a+(i+);例:例:#include main()int i=0;for(;i10;i+)putchar(a+i);例:例:#include main()int i=0;for(;i10;putchar(a+i),i+);29说明:说明:l l所有用所有用 while 语句语句实现的循环都可以用实现的
24、循环都可以用for 语句语句实现。实现。等价于:等价于:for(表达式表达式1;表达式表达式2;表达式表达式3)语句;语句;表达式表达式1;while(表达式表达式2)语句;语句;表达式表达式3;30熟悉几个循环语句熟悉几个循环语句l lwhile(!x)x+;while(!x)x+;当当当当 x=0 x=0 时,执行循环体时,执行循环体时,执行循环体时,执行循环体x+;x+;l lwhile(c=getchar()!=n)n=n+1;while(c=getchar()!=n)n=n+1;n n 称为称为称为称为计数器计数器计数器计数器,作用是统计输入字符的个数,作用是统计输入字符的个数,作用
25、是统计输入字符的个数,作用是统计输入字符的个数l lwhile(num+=2);printf(%dn,num);while(num+5);do x*=-3;while(x5);先执行循环体先执行循环体先执行循环体先执行循环体x*=-3x*=-3,再判断条件再判断条件再判断条件再判断条件(x5)(x5)l lfor(n=0;n26;n+)printf(%c ,n+A);for(n=0;n26;n+)printf(%c ,n+A);作用是作用是作用是作用是输出输出输出输出2626个大写字母个大写字母个大写字母个大写字母l lfor(sum=0,i=1;i=100;sum=sum+i,i+=2);f
26、or(sum=0,i=1;i=100;sum=sum+i,i+=2);作用是作用是作用是作用是计算计算计算计算100100以内的奇数和以内的奇数和以内的奇数和以内的奇数和 31几种循环语句的比较几种循环语句的比较l lwhilewhile和和和和do-whiledo-while语句的语句的语句的语句的表达式表达式表达式表达式只有只有只有只有一个一个一个一个,forfor语语语语句有句有句有句有三个三个三个三个。l lwhile while 和和和和forfor先判断先判断先判断先判断循环条件循环条件循环条件循环条件后执行后执行后执行后执行循环体,循环体,循环体,循环体,do-do-whilew
27、hile语句语句语句语句先执行先执行先执行先执行循环体循环体循环体循环体后判断后判断后判断后判断循环条件。循环条件。循环条件。循环条件。whilewhile语句多用于语句多用于语句多用于语句多用于循环次数不定循环次数不定循环次数不定循环次数不定的情况的情况的情况的情况do-whiledo-while语句多用于语句多用于语句多用于语句多用于至少要运行一次至少要运行一次至少要运行一次至少要运行一次的情况的情况的情况的情况forfor语句语句语句语句多用于要多用于要多用于要多用于要赋初值赋初值赋初值赋初值或或或或循环次数固定循环次数固定循环次数固定循环次数固定的情况的情况的情况的情况325.5 循环
28、结构中的跳转语句循环结构中的跳转语句(P59)l l有如下三种语句实现跳转:有如下三种语句实现跳转:break语句语句 continue语句语句在循环语句的循环体中使用,可以进在循环语句的循环体中使用,可以进行循环的流程控制行循环的流程控制33后续语句后续语句break;break;Y YN N表达式表达式表达式表达式?后续语句后续语句break;break;表达式表达式表达式表达式?Y YN N5.5.1循环中循环中break的应用的应用l l功能:功能:利用利用break语句能够语句能够强迫终止本循环强迫终止本循环,转到后续语句执行。转到后续语句执行。whilewhile语句语句语句语句d
29、o-whiledo-while语句语句语句语句后续语句后续语句计算表达式计算表达式计算表达式计算表达式3 3计算表达式计算表达式计算表达式计算表达式1 1break;break;表达式表达式表达式表达式2?2?Y YN Nforfor语句语句语句语句34 int x,n=0,s=0;int x,n=0,s=0;while(n5)while(n5)scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;n+;s+=x;n+;printf(“%d”,s);printf(“%d”,s);int x,n=0,s=0;int x,n=0,s=0;do
30、do scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;n+;s+=x;n+;while(n5);while(n5);for(n=0,s=0;n5;n+)for(n=0,s=0;n5;n+)scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;s+=x;35#include main()int i,s;for(i=1;i+)s=s+i;if(s5000)break;printf(“s=%d,i=%dn”,s,i);输出结果:输出结果:s=5050,i=100for(i=1;i+)
31、s=s+i s5000 T F 终止终止 循环循环 打印打印s,i值值【例例5.9】计算计算s=1+2+3+i,直到累加到直到累加到s大于大于5000为止,输出为止,输出s和和i的值的值36后续语句后续语句continue;continue;Y YN N表达式表达式表达式表达式?后续语句后续语句continue;continue;表达式表达式表达式表达式?Y YN N5.5.2 continue语句及应用语句及应用 l l功能:功能:中断循环体的本次执行(即跳过循环体中尚中断循环体的本次执行(即跳过循环体中尚中断循环体的本次执行(即跳过循环体中尚中断循环体的本次执行(即跳过循环体中尚未执行的语
32、句),未执行的语句),未执行的语句),未执行的语句),立即开始执行下一次循环。立即开始执行下一次循环。立即开始执行下一次循环。立即开始执行下一次循环。whilewhile语句语句语句语句do-whiledo-while语句语句语句语句后续语句后续语句计算表达式计算表达式计算表达式计算表达式3 3计算表达式计算表达式计算表达式计算表达式1 1continue;continue;表达式表达式表达式表达式2?2?Y YN Nforfor语句语句语句语句37例例5-5:int x,n=0,s=0;int x,n=0,s=0;while(n5)while(n5)scanf(%d,&x);scanf(%d
33、,&x);if(x0)continue;if(x0)continue;s+=x;n+;s+=x;n+;int x,n=0,s=0;int x,n=0,s=0;dodo scanf(%d,&x);scanf(%d,&x);if(x0)continue;if(x0)continue;s+=x;n+;s+=x;n+;while(n5);while(n5);for(n=0,s=0;n5;n+)for(n=0,s=0;n5;n+)scanf(%d,&x);scanf(%d,&x);if(x0)continue;if(x0)continue;s+=x;s+=x;38【例例5.10】#includemain
34、()int k=0,s=0,i;for(i=1;i5)printf(“*i=%d,s=%d,k=%dn,i,s,k);continue;k=k+s;printf(i=%d,s=%d,k=%dn,i,s,k);运算结果:运算结果:i=1,s=1,k=1i=2,s=3,k=4*i=3,s=6,k=4*i=4,s=10,k=4*i=5,s=15,k=4395.4.循环的嵌套循环的嵌套(P57)l l如果循环语句的循环体内又包含了另一条如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套循环语句,则称为循环的嵌套l l例如:例如:#include main()int i,j;for(i=1;
35、i10;i+)for(j=1;j=i;j+)printf(j=i)?%4dn:%4d,i*j);外循环语句外循环语句内循环语句内循环语句 for(j=1;j=i;j+)printf(%4d,i*j);printf(“n);if(j=i)printf(%4dn,i*j);else printf(%4d,i*j);40注意:注意:lwhile、do-while、for循环语句可以并列,循环语句可以并列,也可以相互嵌套,但也可以相互嵌套,但要层次清楚,不能出要层次清楚,不能出现交叉。现交叉。l l多多重重循循环环程程序序执执行行时时,外外层层循循环环每每执执行行一一次,内层循环都需要循环执行多次。次
36、,内层循环都需要循环执行多次。l l例如:例如:for(a=1;a=10;a+)for(b=0;b=5;b+)外循环外循环外循环外循环执行了执行了执行了执行了1010次,次,次,次,内循环内循环内循环内循环执行执行执行执行6 6次次次次循环正常结束时,内循环执行了循环正常结束时,内循环执行了循环正常结束时,内循环执行了循环正常结束时,内循环执行了106=60106=60次次次次 41【例【例5-24】编程序,输出以下图形。编程序,输出以下图形。*一共有一共有一共有一共有4 4 行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组
37、成:空格数按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少变量变量变量变量 i i 控制输出行数,控制输出行数,控制输出行数,控制输出行数,从从从从1 1变化到变化到变化到变化到4 4变量变量变量变量 j j 控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:j j 从从从从1 1变化到变化到变化到变化到 i i,每次输出一个空格每次输出一个空格每次输出一个空格每次输出一个空格 j j 从从从从1 1变化到变化到变化到变化到 8-28-2*i i1 1,每次输出一个星号每次输出一个星号每次输出一个星号
38、每次输出一个星号使用使用使用使用双重循环双重循环双重循环双重循环实现实现实现实现思路:思路:思路:思路:42算法和程序:算法和程序:main()main()int i,j;int i,j;for(i=1;i=4;i+)for(i=1;i=4;i+)for(j=1;j=i-1;j+)for(j=1;j=i-1;j+)printf();printf();for(j=1;j=8-(2*i-1);j+)for(j=1;j=8-(2*i-1);j+)printf(printf(*););printf(n);printf(n);for(i=1;i=4;i+)for(j=1;j=i-1;j+)输出一个空格输
39、出一个空格 for(j=1;j=8-(2*i-1);j+)输出一个星号输出一个星号 换行换行思考:思考:思考:思考:l l如何输出如何输出如何输出如何输出1010行行行行图形?图形?图形?图形?l l输出图形向右输出图形向右输出图形向右输出图形向右平移平移平移平移2020个字符个字符个字符个字符位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序?43思路:素数是指只能被思路:素数是指只能被思路:素数是指只能被思路:素数是指只能被1 1和它本身整除的数,如和它本身整除的数,如和它本身整除的数,如和它本身整除的数,如5 5、7 7、1111、1717、等。等。等
40、。等。分分别别用用2 2、3 3、,m-1(1m101)m-1(1m101)尝尝试试能能否否整整除除整整数数m m m m。如如如如果果果果mm能能能能被被被被某某某某个个个个数数数数整整整整除除除除,则则则则mm就就就就不不不不是素数是素数是素数是素数。l l这是一种这是一种这是一种这是一种穷举算法穷举算法穷举算法穷举算法l l设被除数为设被除数为设被除数为设被除数为i i,从,从,从,从2 2循环到循环到循环到循环到100100l l设除数为设除数为设除数为设除数为k k,从,从,从,从2 2循环到循环到循环到循环到i-1i-1【例例5.8】编写程序,找出编写程序,找出2100以内以内的所
41、有质数(素数)的所有质数(素数)44#include main()int k,i,tag;for(i=2;i=100;i+)tag=0;for(k=2;ki;k+)if(i%k=0)tag=1;if(tag=0)printf(“%d,”,i);程序:程序:45l l对于对于穷举法穷举法来说,为了提高程序的效率,就来说,为了提高程序的效率,就要减少要减少尝试次数尝试次数。比如在上例中:首先,在外循环中,偶数肯定不是素数,只需判断奇数。其次,在内循环中,只需判断到不能被 整除即可。程序的优化程序的优化程序优化为:#include math.h“#include main()int k,i,tag;
42、printf(“2,”);for(i=3;i=100;i+=2)tag=0;for(k=2;tag=0&ksqrt(i);k+)if(i%k=0)tag=1;if(tag=0)printf(“%d,”,i);465.6 循环结构程序举例循环结构程序举例【例例5.11】从输入的若干个大于零的从输入的若干个大于零的正整数中选出最大值。用正整数中选出最大值。用-1结束输入。结束输入。思路:1.用第一次循环处理输入的若干负整数,用第一次循环处理输入的若干负整数,2.用第二次循环从输入的正整数中找出最大用第二次循环从输入的正整数中找出最大值值47#include main()int x,max;prin
43、tf(“Enter-1 to end:n”);do printf(“Enter x:”);scanf(“%d”,&x);while(x0&xmax)max=x;if(max!=-1)printf(“max=%dn”,max);当输入以下数据时:当输入以下数据时:25-6 18 12 -9 45 12 42 -1输出结果如下:输出结果如下:max=4548方法方法2:#include void main()int i,max=0;do scanf(%d,&i);if(maxi)max=i;while(i!=-1);printf(%d,max);49【例例5.3】用迭代法求方程用迭代法求方程 的根
44、,的根,要求误差小于要求误差小于10-6l l此方程没有解析根,只有通过迭代法求数值根算法:1.x1=0,x2=cosx1.2.判|x2-x1|10-6,若小于则x1=x2,重复执行1,否则执行33.计算结果输出50#include#include void main()double x1=0.0,x2=cos(x1);while(fabs(x2-x1)1e-6)x1=x2;x2=cos(x1);printf(“x=%fn”,x2);执行结果:执行结果:X=0.739086程序:51【例例例例】:使用双重:使用双重:使用双重:使用双重forforforfor循环打印下面的图形循环打印下面的图形
45、循环打印下面的图形循环打印下面的图形.*#include include void main()void main()int k,i,j;int k,i,j;for(i=0;i=2;i+)for(i=0;i=2;i+)for(k=1;k=i;k+)printf(“”);for(k=1;k=i;k+)printf(“”);for(j=0;j=3;j+)printf(“*”);for(j=0;j=3;j+)printf(“*”);printf(“n”);printf(“n”);52【例】编写程序,求1-3+5-7+-99+101的值#include void main()int i=1,t,sum
46、=1;int s=1;while(i=99)i=i+2;s=-s;t=i/s;sum=sum+t;printf(%d,sum);53方法方法2:#include void main()int i,t,sum=0;int s=-1;for(i=1;i=101;i+=2)s=-s;t=i/s;sum=sum+t;printf(%d,sum);54编程练习:编程练习:l l请编写程序统计输入的一行中小写字母的个数。l l输出公元1600年至2000年所有闰年的年号l l请编写输出以下图案的程序,图案的行数由输入的值确定。A BBB CCCCCl l用一张五角的硬币换5分和1角的硬币(至少各一枚),问
47、有哪几种算法l l教材129页6.2、6.6、6.7、6.8、6.10、6.1461练习练习1.请编写程序统计输入的一行中小写请编写程序统计输入的一行中小写字母的个数。字母的个数。#include void main()char c;int i=0;while(c=getchar()!=n)if(ca&cz)i+;printf(%d,i);62练习练习2:打印闰年:打印闰年#include void main()int i,j=0;for(i=1600;i=2000;i+)if(i%4=0&i%100!=0|i%400=0)printf(%d ,i);j+;if(j%8=0)printf(n);63练习练习3:打印图形:打印图形void main()int i,j,k,n;char c=A;scanf(%d,&n);for(i=1;i=n;i+)for(j=1;j=n-i;j+)printf();for(k=1;k=2*i-1;k+)putchar(c);putchar(n);c=A+i;A BBB CCCCC64练习练习4:换钱:换钱#include void main()int x,y;for(y=1;y=0)printf(x=%d,y=%dn,x,y);65