某高校循环程序设计基础系课件_第1页
某高校循环程序设计基础系课件_第2页
某高校循环程序设计基础系课件_第3页
某高校循环程序设计基础系课件_第4页
某高校循环程序设计基础系课件_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5第五章循环程序设计

12/26/202215第五章循环程序设计12/21/20221

在C语言中可用以下语句构成循环:

if…gotowhiledo…whilefor其中if…goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。12/26/20222重庆理工大学计算机学院基础教研室在C语言中可用以下语句构成循环:12/2循环结构两大要素:循环条件p结束循环的条件表达式循环体

A

循环执行的语句或语句组设置循环条件要特别注意确定:循环变量的初值循环变量的终值循环变量的变化规律名词解释无限循环死循环名词解释空循环12/26/20223重庆理工大学计算机学院基础教研室循环结构两大要素:名词解释名词解释12/21/20223【例二】main(){intn=0,sum=0;loop:if(sum>=10000)

gotoend;sum+=n;++n;

gotoloop;end:printf(“n=%d\n”,n);}直到型当型1、if…goto语句循环结构【例一】main(){intn=0,sum=0;loop:sum+=n;++n;if(sum<=10000)

gotoloop;printf(“n=%d\n”,n);}12/26/20224重庆理工大学计算机学院基础教研室【例二】直到型当型1、if…goto语句循环结构【2、while语句循环结构【例三】main(){intn=0,sum=0;while

(sum<=10000)

{

sum+=n;++n;}printf(“n=%d\n”,n);}当型一般形式

while(条件表达式)

循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。12/26/20225重庆理工大学计算机学院基础教研室2、while语句循环结构【例三】当型一般形式12/3、do…while语句循环结构

【例四】main(){intn=0,sum=0;do{

sum+=n;++n;}while

(sum<=10000)

printf(“n=%d\n”,n);}一般形式

do{

循环语句(组)

}while(条件表达式);

用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。直到型直到sum超过10000为止12/26/20226重庆理工大学计算机学院基础教研室3、do…while语句循环结构【例四】一般形式直【例五】从键盘输入一个整数12456,分析以下程序运行结果。main(){intnum,c;

printf(“请输入一个整数:“);scanf(“%d”,&num);

do{c=num%10;printf(“%d”,c);}while((num/=10)>0);

printf(“\n”);}

/*取得num的个位数*/

/*输出num的个位数*/

/*直到num/10为0*/

结果:

65421将各位数字反序显示出来3、do…while语句循环结构

示例

12/26/20227重庆理工大学计算机学院基础教研室【例五】从键盘输入一个整数12456,分析以下程序运行结果。4、for语句循环结构一般形式for(表达式1;条件表达式;表达式3)循环语句(组);用于构成计数型当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。表达式1:整个循环中只执行1次,常用来对循环变量设置初值条件表达式(表达式2):其值为真(非0)时继续执行循环语句(组),否则结束循环表达式3:常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次)【例六】求∑i=1+2+3+4…+99+100(i=1~100)main(){inti,s=0;

for(i=1;i<=100;i++)

s=s+i;printf(“Sum=%d\n”,s);}12/26/20228重庆理工大学计算机学院基础教研室4、for语句循环结构一般形式【例六】12/21/202285、其他循环控制结构main(){inta,y;a=10,y=0;

do{

a+=2;y+=a;if(y>50)break;

}while(a=14);printf("a=%d,y=%d\n",a,y);}结果:a=16,y=60

变量跟踪ay10012 1214+212+16=2814+216+28=4414+216+44=60变量跟踪分析法break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!基础系12/26/20229重庆理工大学计算机学院基础教研室5、其他循环控制结构main()结果:a=16,y=605、其他循环控制结构break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!基础系求以下程序段执行后x和i的值。inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;

continue;}x-=3;}结果:x的值为10,i的值为6

变量跟踪ix

11→626→333→848→555→10612/26/202210重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环求以下程序段执行5、其他循环控制结构break结束循环

在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti=1;

while(i<=15)if(++i%3!=2)

continue;elseprintf("%d",i);printf("\n");}结果:2581114

变量跟踪

i++i%3输出i

1→2222→303→414→5255→60……12/26/202211重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环main()结果5、其他循环控制结构break结束循环

在switch中退出switch结构;在循环中结束循环。

continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti,k=0;for(i=1;;i++){k++;

while(k<i*i){k++;if(k%3==0)

goto

loop;

}}

loop:printf("%d,%d",i,k);}结果:2,3

12/26/202212重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环main()结果循环常用算法1、枚举法(穷举法)

“笨人之法”:

把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。

【例一】百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:这是个不定方程——三元一次方程组问题(三个变量,两个方程)

x+y+z=100

5x+3y+z/3=100设公鸡为x只,母鸡为y只,小鸡为z只。12/26/202213重庆理工大学计算机学院基础教研室循环常用算法1、枚举法(穷举法)12/21/202213重庆百元买百鸡问题分析12/26/202214重庆理工大学计算机学院基础教研室百元买百鸡问题分析12/21/202214重庆理工大学计算main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++){if(x+y+z==100&&5*x+3*y+z/3.0==100)

printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}结果:x=0,y=25,z=75x=4,y=18,z=78x=8,y=11,z=81x=12,y=4,z=84【讨论

此为“最笨”之法——要进行101×101×101=1030301次(100多万次)运算。百元买百鸡问题分析12/26/202215重庆理工大学计算机学院基础教研室main()结果:x=0,y=25,z=75【讨论百元买百鸡百元买百鸡问题分析main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++){

z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}【讨论】

令z=100-x-y只进行101×101=10201次运算(前者的1%)

取x<=19,y<=33只进行20×34=680次运算(第1种运算的6.7%)

12/26/202216重庆理工大学计算机学院基础教研室百元买百鸡问题分析main()【讨论】取x<=19,y<=【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?

[□×(□3+□)]2=8□□9分析设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为2~9,其余取值范围为0~9。条件表达式即为给定算式。12/26/202217重庆理工大学计算机学院基础教研室【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个main(){intA,B,C,D,E;for(A=2;A<=9;A++)for(B=0;B<=9;B++)for(C=0;C<=9;C++)for(D=0;D<=9;D++)for(E=0;E<=9;E++)if(A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)printf(“%2d%2d%2d%2d%2d\n”,A,B,C,D,E);}结果:32864

【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?

[□×(□3+□)]2=8□□912/26/202218重庆理工大学计算机学院基础教研室main(){结果:32864【例二】雨水淋湿了【例三】

求100~200之间不能被3整除也不能被7整除的数。

分析:求某区间内符合某一要求的数,可用一个变量“穷举”。所以可用一个独立变量x,取值范围100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n”,x);如果是求指定条件的奇数呢?

如果是求指定条件的偶数呢?

x=101;x<=200;x=x+2

x=100;x<=200;x=x+2

12/26/202219重庆理工大学计算机学院基础教研室【例三】

求100~200之间不能被3整除也不能被7整除的2、归纳法(递推法)

“智人之法”

:通过分析归纳,找出从变量旧值出发求新值的规律。【例一】编程求∑i=1+2+3+4…+99+100(i=0~100)分析

i=0

S0=0(初值)

i=1

S1=0+1=S0+1i=2

S2=1+2=S1+2i=3

S3=1+2+3=S2+3i=4

S4=1+2+3+4=S3+4

………i=nSn=1+2+3+4+…+n=Sn-1+n12/26/202220重庆理工大学计算机学院基础教研室2、归纳法(递推法)【例一】分析12/21/202220重【例一】编程求∑i=1+2+3+4…+n(n≤100)程序:main(){inti,n,s=0;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s+i;printf("Sum=%d\n",s);}运行结果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n

呢?12/26/202221重庆理工大学计算机学院基础教研室【例一】程序:运行结果:如果是12/21/202221重庆理算法类型小结:累加型【累加型】类型诸如

□+□+□+□+……+□+□求其前n项之和的编程题。累加型算法若设i为循环变量,s为前n项累加之和,则程序的基本结构为:

s=0;for(i=1;i<=n;i++)s=s+□;12/26/202222重庆理工大学计算机学院基础教研室算法类型小结:累加型【累加型】类型诸如累加型算法12/21【例二】

编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母为奇数时,相加分母为偶数时,相减法1:从变化规律分析……程序:main(){inti;floats=0;for(i=1;i<=100;i++)if(i%2)s=s+1/i;elses=s-1/i;printf("Sum=%f\n",s);}运行结果:Sum=1.000000错在哪里?12/26/202223重庆理工大学计算机学院基础教研室【例二】

编程求1-1/2+1/3-1/4+1/5-…【例二】

编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100法2:这是个累加型算法的编程题……程序:#include<math.h>main();{inti;floats=0;for(i=1;i<=100;i++)s=s+pow(-1,i+1)/i;printf("Sum=%f\n",s);}

程序:#include<math.h>main(){inti,k=1;floats=0;for(i=1;i<=100;i++){s=s+

k/i;k=-k;}printf("Sum=%f\n",s);}累加型算法程序基本结构为:

s=0;for(i=1;i<=n;i++)s=s+□;错在哪里?(如何检查程序错误?)运行结果:Sum=0.688172运行结果:Sum=1.00000012/26/202224重庆理工大学计算机学院基础教研室【例二】

编程求1-1/2+1/3-1/4+1/5-…【例三】编程求n!(n由键盘输入)

分析

i=0

S0=

1=S0(初值)

i=1

S1=0×1=S0×1i=2

S2=1×2=S1×2i=3

S3=1×2×3=S2×3i=4

S4=1×2×3×4=S3×4

………i=nSn=1×2×3×4×…×n=Sn-1×n12/26/202225重庆理工大学计算机学院基础教研室【例三】分析12/21/202225重庆理工大学计算机学院【例三】编程求n!(n由键盘输入)

程序:main(){inti,n,s=1;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s*i;printf("Sum=%d\n",s);}运行结果:n=5Sum=120运行结果:n=8Sum=-25216Why?12/26/202226重庆理工大学计算机学院基础教研室【例三】程序:运行结果:运行结果:Why?12/21/202算法类型小结:阶乘型【阶乘型】类型诸如

□×□×□×□×……×□×□求其前n项之积的编程题。阶乘型算法若设i为循环变量,s为前n项相乘之积,则程序的基本结构为:

s=1;for(i=1;i<=n;i++)s=s*□;12/26/202227重庆理工大学计算机学院基础教研室算法类型小结:阶乘型【阶乘型】类型诸如阶乘型算法12/21【例四】

编程求∑i!=1!+2!+3!…+n!(n由键盘输入)外循环为累加型内循环为阶乘型法1:从变化规律分析……程序:main(){inti,j,n;floats,s1;

printf("请输入n=");scanf("%d",&n);

s=0;for(i=1;i<=n;i++){

s1=1;

for(j=1;j<=i;j++)s1=s1*j;s=s+s1;}

printf("Sum=%.0f\n",s);}运行结果:n=5Sum=153/*如果n值较大,可改为printf(“Sum=%e\n”,s);*/

12/26/202228重庆理工大学计算机学院基础教研室【例四】

编程求∑i!=1!+2!+3!…+n!(n【例四】

编程求∑n!=1!+2!+3!…+n!(n由键盘输入)在同一个循环中先阶乘,后累加法2:通过单循环实现……程序:main(){inti,n;floats,s1;

printf("请输入n=");scanf("%d",&n);s=0,s1=1;for(i=1;i<=n;i++){s1=s1*i;s=s+s1;}printf("Sum=%.0f\n",s);}运行结果:n=5Sum=15312/26/202229重庆理工大学计算机学院基础教研室【例四】

编程求∑n!=1!+2!+3!…+n!(n【例五】

兔子繁殖问题(斐波那契数列问题)

著名意大利数学家斐波那契(Fibonacci)1202年提出一个有趣的问题。某人想知道一年内一对兔子可以生几对兔子。他筑了一道围墙,把一对大兔关在其中。已知每对大兔每个月可以生一对小兔,而每对小兔出生后第三个月即可成为“大兔”再生小兔。问一对小兔一年能繁殖几对小兔?分析:▲表示大兔,△表示小兔由分析可以推出,每月新增兔子数Fn={1,1,2,3,5,8,13,21,34,…}(斐波那契数列)月份n兔子数Fn1F1=12F2=13F3=2=F1+F24F4=3=F2+F35F5=5=F3+F4…nFn=Fn-1+Fn-212/26/202230重庆理工大学计算机学院基础教研室【例五】

兔子繁殖问题(斐波那契数列问题)

【例五】

例5.12

兔子繁殖问题(斐波那契数列问题)main(){intf1=1,f2=1,f,i,s,n;clrscr();printf("请输入月数:");scanf("%d",&n);for(s=2,i=3;i<=n;i++){f=f1+f2;s=s+f;f1=f2;f2=f;}printf("%d个月的兔子数是%d\n",n,s);}12/26/202231重庆理工大学计算机学院基础教研室【例五】例5.12

兔子繁殖问题(斐波那契数列问题)m【例六】编程显示以下图形(共N行,N由键盘输入)。

*************************此类题目分析的要点是:通过分析,找出每行空格、*与行号i、列号j及总行数N的关系。其循环结构可用右图表示。分析:(设N=5)第1行4个空格=5-11个“*”=2*行号-1第2行3个空格=5-23个“*”=2*行号-1第3行2个空格=5-35个“*”=2*行号-1第4行1个空格=5-47个“*”=2*行号-1第5行0个空格=5-59个“*”=2*行号-1由此归纳出:第i行的空格数N-i个;第i行的“*”数是2i-1个。

12/26/202232重庆理工大学计算机学院基础教研室【例六】此类题目分析的要点是:分析:(设N=5)由此归纳出:【例六】main(){inti,j,N;clrscr();printf("请输入N=");scanf("%d",&N);for(i=1;i<=N;i++){for(j=1;j<=N-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}}

*************************12/26/202233重庆理工大学计算机学院基础教研室【例六】main()*12/除了以上例题,要求根据教材掌握:1、求按指定精度近似值问题(例6.6)2、判断一个数是否素数问题(例6.8)3、密码问题(例6.10)12/26/202234重庆理工大学计算机学院基础教研室除了以上例题,要求根据教材掌握:12/21/202234重庆判断一个数是否素数问题(例6.8另一种解法)#include<math.h>main(){intm,k,i;clrscr();printf("x=");scanf("%d",&m);for(i=2;i<m-1;i++)if(m%i==0){printf("%disnotaprimenumber\n",m);exit(0);}printf("i=%d,%disaprimenumber\n",i,m);}把i<m-1改为i<sqrt(m-1)比较i的值12/26/202235重庆理工大学计算机学院基础教研室判断一个数是否素数问题(例6.8另一种解法)#includ小结循环是一组语句,计算机反复执行这组语句直到满足终止条件为止。while,do….while和for三种循环语句可以相互转化。for适用于循环次数已知的循环。while先判定循环条件,可能一次都不执行循环体。do…while后判定循环条件,至少保证执行一次循环体。while和do…while中都有改变循环控制变量的语句。可以通过循环变量来控制循环,在循环体中通过条件判定产生中间跳转的方法,终止循环。

12/26/202236重庆理工大学计算机学院基础教研室小结12/21/202236重庆理工大学计算机学院基5第五章循环程序设计

12/26/2022375第五章循环程序设计12/21/20221

在C语言中可用以下语句构成循环:

if…gotowhiledo…whilefor其中if…goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。12/26/202238重庆理工大学计算机学院基础教研室在C语言中可用以下语句构成循环:12/2循环结构两大要素:循环条件p结束循环的条件表达式循环体

A

循环执行的语句或语句组设置循环条件要特别注意确定:循环变量的初值循环变量的终值循环变量的变化规律名词解释无限循环死循环名词解释空循环12/26/202239重庆理工大学计算机学院基础教研室循环结构两大要素:名词解释名词解释12/21/20223【例二】main(){intn=0,sum=0;loop:if(sum>=10000)

gotoend;sum+=n;++n;

gotoloop;end:printf(“n=%d\n”,n);}直到型当型1、if…goto语句循环结构【例一】main(){intn=0,sum=0;loop:sum+=n;++n;if(sum<=10000)

gotoloop;printf(“n=%d\n”,n);}12/26/202240重庆理工大学计算机学院基础教研室【例二】直到型当型1、if…goto语句循环结构【2、while语句循环结构【例三】main(){intn=0,sum=0;while

(sum<=10000)

{

sum+=n;++n;}printf(“n=%d\n”,n);}当型一般形式

while(条件表达式)

循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。12/26/202241重庆理工大学计算机学院基础教研室2、while语句循环结构【例三】当型一般形式12/3、do…while语句循环结构

【例四】main(){intn=0,sum=0;do{

sum+=n;++n;}while

(sum<=10000)

printf(“n=%d\n”,n);}一般形式

do{

循环语句(组)

}while(条件表达式);

用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。直到型直到sum超过10000为止12/26/202242重庆理工大学计算机学院基础教研室3、do…while语句循环结构【例四】一般形式直【例五】从键盘输入一个整数12456,分析以下程序运行结果。main(){intnum,c;

printf(“请输入一个整数:“);scanf(“%d”,&num);

do{c=num%10;printf(“%d”,c);}while((num/=10)>0);

printf(“\n”);}

/*取得num的个位数*/

/*输出num的个位数*/

/*直到num/10为0*/

结果:

65421将各位数字反序显示出来3、do…while语句循环结构

示例

12/26/202243重庆理工大学计算机学院基础教研室【例五】从键盘输入一个整数12456,分析以下程序运行结果。4、for语句循环结构一般形式for(表达式1;条件表达式;表达式3)循环语句(组);用于构成计数型当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。表达式1:整个循环中只执行1次,常用来对循环变量设置初值条件表达式(表达式2):其值为真(非0)时继续执行循环语句(组),否则结束循环表达式3:常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次)【例六】求∑i=1+2+3+4…+99+100(i=1~100)main(){inti,s=0;

for(i=1;i<=100;i++)

s=s+i;printf(“Sum=%d\n”,s);}12/26/202244重庆理工大学计算机学院基础教研室4、for语句循环结构一般形式【例六】12/21/202285、其他循环控制结构main(){inta,y;a=10,y=0;

do{

a+=2;y+=a;if(y>50)break;

}while(a=14);printf("a=%d,y=%d\n",a,y);}结果:a=16,y=60

变量跟踪ay10012 1214+212+16=2814+216+28=4414+216+44=60变量跟踪分析法break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!基础系12/26/202245重庆理工大学计算机学院基础教研室5、其他循环控制结构main()结果:a=16,y=605、其他循环控制结构break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!基础系求以下程序段执行后x和i的值。inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;

continue;}x-=3;}结果:x的值为10,i的值为6

变量跟踪ix

11→626→333→848→555→10612/26/202246重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环求以下程序段执行5、其他循环控制结构break结束循环

在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti=1;

while(i<=15)if(++i%3!=2)

continue;elseprintf("%d",i);printf("\n");}结果:2581114

变量跟踪

i++i%3输出i

1→2222→303→414→5255→60……12/26/202247重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环main()结果5、其他循环控制结构break结束循环

在switch中退出switch结构;在循环中结束循环。

continue结束本次循环循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti,k=0;for(i=1;;i++){k++;

while(k<i*i){k++;if(k%3==0)

goto

loop;

}}

loop:printf("%d,%d",i,k);}结果:2,3

12/26/202248重庆理工大学计算机学院基础教研室5、其他循环控制结构break结束循环main()结果循环常用算法1、枚举法(穷举法)

“笨人之法”:

把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。

【例一】百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:这是个不定方程——三元一次方程组问题(三个变量,两个方程)

x+y+z=100

5x+3y+z/3=100设公鸡为x只,母鸡为y只,小鸡为z只。12/26/202249重庆理工大学计算机学院基础教研室循环常用算法1、枚举法(穷举法)12/21/202213重庆百元买百鸡问题分析12/26/202250重庆理工大学计算机学院基础教研室百元买百鸡问题分析12/21/202214重庆理工大学计算main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++){if(x+y+z==100&&5*x+3*y+z/3.0==100)

printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}结果:x=0,y=25,z=75x=4,y=18,z=78x=8,y=11,z=81x=12,y=4,z=84【讨论

此为“最笨”之法——要进行101×101×101=1030301次(100多万次)运算。百元买百鸡问题分析12/26/202251重庆理工大学计算机学院基础教研室main()结果:x=0,y=25,z=75【讨论百元买百鸡百元买百鸡问题分析main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++){

z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}【讨论】

令z=100-x-y只进行101×101=10201次运算(前者的1%)

取x<=19,y<=33只进行20×34=680次运算(第1种运算的6.7%)

12/26/202252重庆理工大学计算机学院基础教研室百元买百鸡问题分析main()【讨论】取x<=19,y<=【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?

[□×(□3+□)]2=8□□9分析设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为2~9,其余取值范围为0~9。条件表达式即为给定算式。12/26/202253重庆理工大学计算机学院基础教研室【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个main(){intA,B,C,D,E;for(A=2;A<=9;A++)for(B=0;B<=9;B++)for(C=0;C<=9;C++)for(D=0;D<=9;D++)for(E=0;E<=9;E++)if(A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)printf(“%2d%2d%2d%2d%2d\n”,A,B,C,D,E);}结果:32864

【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?

[□×(□3+□)]2=8□□912/26/202254重庆理工大学计算机学院基础教研室main(){结果:32864【例二】雨水淋湿了【例三】

求100~200之间不能被3整除也不能被7整除的数。

分析:求某区间内符合某一要求的数,可用一个变量“穷举”。所以可用一个独立变量x,取值范围100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n”,x);如果是求指定条件的奇数呢?

如果是求指定条件的偶数呢?

x=101;x<=200;x=x+2

x=100;x<=200;x=x+2

12/26/202255重庆理工大学计算机学院基础教研室【例三】

求100~200之间不能被3整除也不能被7整除的2、归纳法(递推法)

“智人之法”

:通过分析归纳,找出从变量旧值出发求新值的规律。【例一】编程求∑i=1+2+3+4…+99+100(i=0~100)分析

i=0

S0=0(初值)

i=1

S1=0+1=S0+1i=2

S2=1+2=S1+2i=3

S3=1+2+3=S2+3i=4

S4=1+2+3+4=S3+4

………i=nSn=1+2+3+4+…+n=Sn-1+n12/26/202256重庆理工大学计算机学院基础教研室2、归纳法(递推法)【例一】分析12/21/202220重【例一】编程求∑i=1+2+3+4…+n(n≤100)程序:main(){inti,n,s=0;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s+i;printf("Sum=%d\n",s);}运行结果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n

呢?12/26/202257重庆理工大学计算机学院基础教研室【例一】程序:运行结果:如果是12/21/202221重庆理算法类型小结:累加型【累加型】类型诸如

□+□+□+□+……+□+□求其前n项之和的编程题。累加型算法若设i为循环变量,s为前n项累加之和,则程序的基本结构为:

s=0;for(i=1;i<=n;i++)s=s+□;12/26/202258重庆理工大学计算机学院基础教研室算法类型小结:累加型【累加型】类型诸如累加型算法12/21【例二】

编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母为奇数时,相加分母为偶数时,相减法1:从变化规律分析……程序:main(){inti;floats=0;for(i=1;i<=100;i++)if(i%2)s=s+1/i;elses=s-1/i;printf("Sum=%f\n",s);}运行结果:Sum=1.000000错在哪里?12/26/202259重庆理工大学计算机学院基础教研室【例二】

编程求1-1/2+1/3-1/4+1/5-…【例二】

编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100法2:这是个累加型算法的编程题……程序:#include<math.h>main();{inti;floats=0;for(i=1;i<=100;i++)s=s+pow(-1,i+1)/i;printf("Sum=%f\n",s);}

程序:#include<math.h>main(){inti,k=1;floats=0;for(i=1;i<=100;i++){s=s+

k/i;k=-k;}printf("Sum=%f\n",s);}累加型算法程序基本结构为:

s=0;for(i=1;i<=n;i++)s=s+□;错在哪里?(如何检查程序错误?)运行结果:Sum=0.688172运行结果:Sum=1.00000012/26/202260重庆理工大学计算机学院基础教研室【例二】

编程求1-1/2+1/3-1/4+1/5-…【例三】编程求n!(n由键盘输入)

分析

i=0

S0=

1=S0(初值)

i=1

S1=0×1=S0×1i=2

S2=1×2=S1×2i=3

S3=1×2×3=S2×3i=4

S4=1×2×3×4=S3×4

………i=nSn=1×2×3×4×…×n=Sn-1×n12/26/202261重庆理工大学计算机学院基础教研室【例三】分析12/21/202225重庆理工大学计算机学院【例三】编程求n!(n由键盘输入)

程序:main(){inti,n,s=1;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s*i;printf("Sum=%d\n",s);}运行结果:n=5Sum=120运行结果:n=8Sum=-25216Why?12/26/202262重庆理工大学计算机学院基础教研室【例三】程序:运行结果:运行结果:Why?12/21/202算法类型小结:阶乘型【阶乘型】类型诸如

□×□×□×□×……×□×□求其前n项之积的编程题。阶乘型算法若设i为循环变量,s为前n项相乘之积,则程序的基本结构为:

s=1;for(i=1;i<=n;i++)s=s*□;12/26/202263重庆理工大学计算机学院基础教研室算法类型小结:阶乘型【阶乘型】类型诸如阶乘型算法12/21【例四】

编程求∑i!=1!+2!+3!…+n!(n由键盘输入)外循环为累加型内循环为阶乘型法1:从变化规律分析……程序:main(){inti,j,n;floats,s1;

printf("请输入n=");scanf("%d",&n);

s=0;for(i=1;i<=n;i++){

s1=1;

for(j=1;j<=i;j++)s1=s1*j;s=s+s1;}

printf("Sum=%.0f\n",s);}运行结果:n=5Sum=153/*如果n值较大,可改为printf(“Sum=%e\n”,s);*/

12/26/202264重庆理工大学计算机学院基础教研室【例四】

编程求∑i!=1!+2!+3!…+n!(n【例四】

编程求∑n!=1!+2!+3!…+n!(n由键盘输入)在同一个循环中先阶乘,后累加法2:通过单循环实现……程序:main(){inti,n;floats,s1;

printf("请输入n=");scanf("%d",&n);s=0,s1=1;for(i=1;i<=n;i++){s1=s1*i;s=s+s1;}printf("Sum=%.0f\n",s);}运行结果:n=5Sum=15312/26/202265重庆理工大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论