《C语言:循环.ppt》由会员分享,可在线阅读,更多相关《C语言:循环.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1第六章第六章 判断与循环判断与循环(P141)(P141)计算机运算速度快,最适宜于重复性的工作。计算机运算速度快,最适宜于重复性的工作。2真真假假 3循环程序组成部分:循环程序组成部分:1.1.设置设置循环初值循环初值,即循环开始前的值;,即循环开始前的值;2.2.将需要反复执行的部分设置为将需要反复执行的部分设置为循环体循环体;3.3.设置设置测试条件测试条件(即即循环的条件循环的条件,满足条件时循,满足条件时循环环);4.4.循环体每执行一次后,改变某些变量的值使循循环体每执行一次后,改变某些变量的值使循环趋于结束(否则将成无限循环)环趋于结束(否则将成无限循环)4一、实现循环结构的
2、控制语句一、实现循环结构的控制语句 whilewhile语句、语句、do-whiledo-while语句、语句、forfor语句语句二、循环嵌套(循环中有循环)二、循环嵌套(循环中有循环)三、循环结构程序举例三、循环结构程序举例 5(一)(一)while语句语句 (二)(二)do-while语句语句(三)(三)for语句语句(四)(四)break、continue语句语句(五)几种循环的比较(五)几种循环的比较 6例例1.计算计算1+2+3+99+100,即求自然数,即求自然数1-100之和。之和。分析:分析:声明一个变量声明一个变量(sum)作为作为”容器容器”存放加法的和,并设置存放加法的
3、和,并设置初值为初值为0.1)将)将1加入加入sum2)将)将2加入加入sum。99)将)将99加入加入sum100)将)将100加入加入sum最后输出最后输出sum的值。的值。步骤步骤1)100)描述的是相同)描述的是相同的动作,可以描述为一个重复的动作,可以描述为一个重复的过程:的过程:将将n(初值为初值为1)加入加入sumn的值增加的值增加1 7求解过程:求解过程:1.声明一个变量声明一个变量sum,初值为初值为0。2.设置变量设置变量n表示每次加的值,表示每次加的值,初值为初值为1。3.将将n加入加入sum。4.n的值增加的值增加1。5.当当n100时,时,执行步骤执行步骤6)。6.输
4、出输出sum的值。的值。开始开始 sum=0 sum=0 n=1 n=1 将将n n加入加入sumsum n n增加增加1 1n=100n=100 输出输出sumsum 结束结束是是否否 8格式格式while(表达式表达式)循环体语句循环体语句 含义含义当表达式为真(非当表达式为真(非0值)时,执行值)时,执行while中中的循环体语句。的循环体语句。执行执行过程过程表达式表达式循环体语句循环体语句假假 真真(一一)while语句语句表示执行循环表示执行循环的条件的条件 9sum=5050实现实现1求求1100的累加和(用的累加和(用while实现)。实现)。void main()int n,
5、sum;n=1;sum=0;while (n=100)sum=sum+n;n+;printf(“sum=%dn”,sum);?1求求15的累加和的累加和.2求求110的奇数和的奇数和.3求求110的偶数和的偶数和.设置初始值设置初始值设置循环条件设置循环条件循环语句循环语句循环变量改变循环变量改变 11格式格式do 循环体语句循环体语句while(表达式表达式);含义含义表达式为真(非表达式为真(非0)时执行循环体语句,只不过是)时执行循环体语句,只不过是先执行一次。先执行一次。执行执行过程过程表达式表达式循环体语句循环体语句假假真真至少执至少执行一次行一次(二二)do-while语句语句表示
6、执行循环表示执行循环的条件的条件 12sum=5050实现实现2求求1100的累加和(用的累加和(用do-while实现)。实现)。void main()int n,sum;n=1;sum=0;do sum=sum+n;n+;while (n=100);printf(“sum=%dn”,sum);13格式格式for(表达式表达式1;表达式表达式2;表达式表达式3)循环体语句循环体语句 for(循环变量赋初值循环变量赋初值;循环条件循环条件;循环变量改变循环变量改变)循环体语循环体语句句 执行执行过程过程(1)先求解表达式先求解表达式1;(2)求解表达式求解表达式2,若其值为真,则,若其值为真,
7、则执行循环体语句,然后执行第(执行循环体语句,然后执行第(3)步)步;若为假,则结束循环,转到第;若为假,则结束循环,转到第(5)步;)步;(3)求解表达式求解表达式3;(4)转向步骤(转向步骤(2););(5)循环结束,执行循环结束,执行for语句下面的语句下面的一个语句。一个语句。表达式表达式2 2?循环体语句循环体语句假假 真真求解表达式求解表达式1 1执行表达式执行表达式3 3(三三)for语句语句 14sum=5050例例3:求求1100的累加和。(用的累加和。(用for循环实现)循环实现)void main()int n,sum;sum=0;for(n=1;n=100;n+)sum
8、=sum+n;printf(“sum=%5dn”,sum);1求求15的累加和的累加和.2求求110的奇数和的奇数和.3求求110的偶数和的偶数和.15注意注意1 1、循环体如果包含一个以上的语句,、循环体如果包含一个以上的语句,必须必须使使用用 括起来。括起来。2 2、在循环中,必须有使循环条件趋向于不满、在循环中,必须有使循环条件趋向于不满足(假)的语句,否则成为死循环无法结束。足(假)的语句,否则成为死循环无法结束。3 3、循环语法中的表达式部分可以是任意表达、循环语法中的表达式部分可以是任意表达式。式。16举例举例while和和do-while循环的比较。循环的比较。void main
9、()int i,sum=0;scanf(“%d”,&i);while(i=10)sum=sum+i;i+;printf(“sum=%dn”,sum);void main()int i,sum=0;scanf(“%d”,&i);do sum=sum+i;i+;while(i=10);printf(“sum=%dn”,sum);输入:输入:1 1 输入:输入:11 11 程序程序1:sum=55输出:输出:程序程序2:sum=55程序程序1:sum=0输出:输出:程序程序2:sum=11什么情什么情况下两况下两者结果者结果相同?相同?17结论:结论:当循环体内容一样时,如果循环条件当循环体内容一样
10、时,如果循环条件第一次为第一次为true时,时,两种循环结构的结果一两种循环结构的结果一样。样。18练习:执行以下程序的输出显示是:练习:执行以下程序的输出显示是:inti,x,y;i=x=y=0;do+i;if(i%2!=0)x=x+i;y=y+i;while(i5);printf(x=%d,y=%dn,x,y);答案是:答案是:x=9 y=15x=9 y=151循环循环:i=1if(true)因为因为1%2=1,x=1y=12循环:循环:i=2if(false)y=33循环:循环:i=3if(true)x=4y=64循环:循环:i=4if(false)y=105循环:循环:i=5if(tr
11、ue)x=9y=15 19例例6-1(书上(书上143页)页).计算一任意数的计算一任意数的n次方,即次方,即y=xn(n为一非负整数为一非负整数)20main()intcount,n;floatx,y;printf(Enterthevaluesofxandn:);scanf(%f%d,&x,&n);y=1.0;count=1;/*Initialisation*/while(count100)break;printf(“sum=%5dn”,sum);main()intn,sum,x;for(sum=0,n=1;n=100;n+)scanf(“%d”,&x);if(x=0)continue;su
12、m+=x;printf(“sum=%5dn”,sum);当从键盘上输入一个当从键盘上输入一个0或或负数的时候,负数的时候,continue将将提前结束本次循环(即跳提前结束本次循环(即跳过过sum+=x;)26举例举例 .for(i=1;i=10;i+)if(i=5)break;printf(“i=%5dn”,i);.for(i=1;i=10;i+)if(i=5)continue;printf(“i=%5dn”,i);.i=11i=5 27二、二、循循环环嵌嵌套套(1)while()while().(3)for(;)for(;).(5)for(;)while().(2)do do.while(
13、);while();(4)while()do.while();(6)do for(;).while();28作业6.4数列数列123581321称为斐波纳契数列。请编写一个使用循环的程序,称为斐波纳契数列。请编写一个使用循环的程序,计算并显示前计算并显示前m个斐波纳契数。(提示:从数个斐波纳契数。(提示:从数列的第三个数开始,每个数是前两个数之和。)列的第三个数开始,每个数是前两个数之和。)29例:读程序,指出运行结果。例:读程序,指出运行结果。voidmain()inti,a=0;for(i=1;i=5;i+)doi+;a+;while(i3);printf(a=%d,i=%dn,a,i);
14、printf(“endn);答案答案:a=2,i=3a=3,i=5end 30最小成本(书上最小成本(书上164页)页)某单位的运营成本由某单位的运营成本由C1和和C2两部分组成,它们可用参两部分组成,它们可用参数数p的函数来表示:的函数来表示:C1=30-8pC2=10+p2参数参数p的范围为的范围为010。请确定当。请确定当运营成本最小运营成本最小时的时的p值值(精确度为(精确度为+0.1)总成本总成本=C1+C2=40-8p+p2 31#includemain()floatp,cost,p1,cost1;/cost1存储当前最小的成本存储当前最小的成本for(p=0;p=10;p=p+0
15、.1)cost=40-8*p+p*p;/最新计算的成本值最新计算的成本值if(p=0)cost1=cost;elseif(cost=cost1)cost1=cost;p1=p;printf(nMINIMUMCOST=%.2fATp=%.1fn,cost1,p1);32最最小小成成本本解解法法2main()floatp,cost,p1,cost1;for(p=0;p=cost1)break;cost1=cost;p1=p;p=(p+p1)/2.0;cost=40-8*p+p*p;printf(nMINIMUMCOST=%.2fATp=%.1fn,cost,p);33例例输入一个正整数输入一个正整
16、数m,判断其是否为素数。,判断其是否为素数。(只能被只能被1和它本身整除的数为素数和它本身整除的数为素数)。判别方法:判别方法:57:若:若57 除以除以256之间的每一个数之间的每一个数都都不能整不能整除,则除,则57为素数,否则为素数,否则57不是素数。不是素数。判断判断m:k=m-1,i=2k:若若m除以每一个除以每一个 i 的值的值都都不能整除不能整除,则则m为素数为素数,否则否则m不是素数。不是素数。34void main()int m,k,i,flag;scanf(“%d”,&m);flag=1;k=m-1;for(i=2;i=k;i+)if (m%i=0)flag=0;if(fl
17、ag=1)printf(“yes!”);else printf(“no!”);k=m-1;k=m/2;k=sqrt(m);实现实现1:break;flag表示是否为素表示是否为素数,数,1(是是)0(否否)35#include void main()int m,k,i;scanf(“%d”,&m);k=sqrt(m);for(i=2;ik)printf(“yes!”);else printf(“no!”);实现实现2:36例例:百钱买百鸡百钱买百鸡公元前五世纪公元前五世纪,我国古代数学家张丘建在算经我国古代数学家张丘建在算经一书中提出一书中提出“百钱买百鸡百钱买百鸡”问题问题:“鸡翁一值钱五鸡
18、翁一值钱五,鸡母一值钱三鸡母一值钱三,鸡雏三值钱鸡雏三值钱一一,百钱买百鸡百钱买百鸡,问鸡翁问鸡翁,鸡母鸡母,鸡雏各几何鸡雏各几何?”?”基本思路基本思路:这是一个不定方程的问题这是一个不定方程的问题.cocks+hens+chicks=100 cocks+hens+chicks=100 (百鸡百鸡)-)-5*cocks+3*hens+chick5*cocks+3*hens+chicks s/3=100/3=100(百钱百钱)-)-37cocks:0 20 的整数的整数.hens:0 33 的整数的整数.大致的范围大致的范围chicks:100-cocks-hens 的整数的整数.穷举法穷举法
19、:穷举法是编程中常用到的一种方法,对可能是解的众多穷举法是编程中常用到的一种方法,对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。些符合要求的候选解作为问题的解。38void main()int cocks,hens,chicks;for(cocks=0;cocks=20;cocks+)for(hens=0;hens=33;hens+)chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0=100.0)printf(%d%d%dn,cocks,hens,
20、chicks);运行结果运行结果:0 25 75:0 25 75 4 18 78 4 18 78 8 11 81 8 11 81 12 4 84 12 4 84 39例例 :每个苹果:每个苹果0.80.8元,第一天买元,第一天买2 2个苹果,第二天个苹果,第二天开始,每天买前一天的开始,每天买前一天的2 2倍,倍,直到某天直到某天(当天当天)购买购买苹果的个数达到不超过苹果的个数达到不超过100100的最大值的最大值。编写程序求。编写程序求平均每天花多少钱。平均每天花多少钱。提示:给出如下变量:提示:给出如下变量:buybuy:购买的个数,初值为:购买的个数,初值为2 2。totaltotal
21、:购买的总和,初值为:购买的总和,初值为0 0,还没开始买。,还没开始买。dayday:已购买的天数,初值为:已购买的天数,初值为0 0。avgavg:平均每天花的钱数。平均每天花的钱数。可以使用可以使用whilewhile语句,循环继续的条件是语句,循环继续的条件是 buy=100buy=100。40voidmain()intbuy=2,day=0,total=0;floatavg;while(buy=100)total=total+buy;day+;buy*=2;avg=total*0.8/day;printf(%.2fn,avg);41书上其他例题自己看!书上其他例题自己看!42抓交通肇
22、事犯抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。现场有三人一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;的后两位数字是相同的,但与前两位不同;丙是数学丙是数学家,他说:四位的车号刚好是一个整数的平方。请根家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。据以上线索求出车号。*问题分析与算法设计问题分析与算法设计 按照题目的要求造出一个前两位数相同、后两位数相
23、按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。整数的平方。43总总结结所学的控制语句:所学的控制语句:if()elseswitchwhile()dowhile();for()continuebreakgoto 446.13请编写一个程序来计算欧拉数请编写一个程序来计算欧拉数e的值,该数用作自然的值,该数用作自然对数的底。计算公式如下:对数的底。计算公式如下:e=1+1/1!+1/2!+1/3!+1/n!请使用一种合适的循环结构。当请使用一种合适的循环结构。当连续两个连续两个e值之差小
24、于值之差小于0.00001时循环终止。时循环终止。6.15请编写一个程序,给定原始价值、折旧率和请编写一个程序,给定原始价值、折旧率和已使用已使用的年限的年限,计算出报废价值计算出报废价值。补充:补充:36块砖,块砖,36人搬,男搬人搬,男搬4,女搬,女搬3,两个小孩抬一砖,要,两个小孩抬一砖,要求一次全搬完,问男、女、小孩需若干?求一次全搬完,问男、女、小孩需若干?作业:作业:45作业作业:1.1.输入输入1010个数,计算它们的平均值。个数,计算它们的平均值。2.2.猜数游戏。系统随机产生一个数,用户猜并输入所猜猜数游戏。系统随机产生一个数,用户猜并输入所猜数,若猜的数大了,提示数,若猜的
25、数大了,提示“太大了太大了”;若猜的数小了,;若猜的数小了,提示提示“太小了太小了”。猜。猜5 5次不正确即退出。次不正确即退出。产生随机数:产生随机数:srand(unsigned)time(NULL);num=rand()%50;/产生一个产生一个0 490 49的数,保存到的数,保存到numnum 46上机作业:上机作业:4.4.输入一行字符,分别统计其中英文字母、空格、数字输入一行字符,分别统计其中英文字母、空格、数字和其它字符的个数。和其它字符的个数。5 5.打印输出九九乘法表。格式如下:打印输出九九乘法表。格式如下:1 1 2 4 2 4 3 6 9 3 6 9 4 8 12 16 4 8 12 16 5 10 15 20 25 5 10 15 20 25 6 12 18 24 30 36 6 12 18 24 30 36 7 14 21 28 35 42 49 7 14 21 28 35 42 49 8 26 24 32 40 48 56 64 8 26 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 9 18 27 36 45 54 63 72 81
限制150内