循环结构训练.ppt

循环结构训练.ppt

ID:52236565

大小:612.50 KB

页数:41页

时间:2020-04-03

上传者:U-140596
循环结构训练.ppt_第1页
循环结构训练.ppt_第2页
循环结构训练.ppt_第3页
循环结构训练.ppt_第4页
循环结构训练.ppt_第5页
资源描述:

《循环结构训练.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

综合训练一循环结构程序项目一:图形编程项目二:学生成绩的分组汇总项目三:其他问题项目四:举一反三 项目一图形输出项目要求给定图形,按照要求格式输出项目分析:分析图形的特点,包括行、列上字符的个数,通过多重循环控制图形的输出 ****************使用双重循环实现思路:一共有4行,每行由星号组成:变量i控制输出行数,从1变化到4变量j控制输出每行的星号:j从1变化到4,每次输出一个星号例1:编程序,输出以下图形 参考代码:#include"stdio.h"main(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=4;j++)printf("*");printf(" ");}} 改写例1:编程序,输出以下图形。**********思路:一共有4行,每行由星号组成:变量i控制输出行数,从1变化到4变量j控制输出每行的星号:j从1变化到i,每次输出一个星号 参考代码:main(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=i;j++)printf("*");printf(" ");}} 再次改写例1:编程序,输出以下图形。****************思路:一共有4行,每行由空格和星号组成:空格数按行增加,星号按行减少变量i控制输出行数,从1变化到4变量j控制输出每行的空格和星号:j从1变化到i,每次输出一个空格j从1变化到8-2*i+1,每次输出一个星号 参考算法和程序:main(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=i;j++)printf("");for(j=1;j<=8-(2*i-1);j++)printf("*");printf(" ");}}for(i=1;i<=4;i++)for(j=1;j<=i;j++)输出一个空格for(j=1;j<=8-(2*i-1);j++)输出一个星号换行思考:如何输出10行图形?输出图形向右平移20个字符位置,应如何修改程序? 【反复训练】编程显示如下所示的图形*************************分析:题目要求的三角形由5行组成,因此程序中循环结构的循环次数应为5次,每一次输出一行。而“输出一行”又进一步分为三项工作。(1)输出若干个空格;(2)输出若干个星号;(3)回车换行,为新的一行的输出做准备。现在的问题是,如何确定每一行应输出的空格数和字符”*”的数目,以便分别通过循环来输出这两种字符。行号应输出的空格应输出的“*”151243335427519i6-i2*i-1#includemain(){inti,j;for(i=1;i<=5;i++)//一共输出5行{for(j=1;j<=6-i;j++)printf("");//输出空格数for(j=1;j<=2*i-1;j++)printf("*");//输出”*”的数目printf(“ ”);//换行}} 项目二学生成绩的分组汇总项目要求一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。项目分析在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项目可分成二个任务:任务一:求一个小组学生成绩的总分及平均分;任务二:求四个小组学生成绩的总分及平均分。 分析:如果本小组一共有十个同学,显然不可能定义十个变量x1,x2,……x10,然后在程序中表示成sum=x1+x2+x3+……+x10。求一个小组的学生总成绩的步骤就是:先输入第一个学生的成绩,然后将这个成绩加到总分中,接下来,输入第二个学生的成绩,再将第二个学生的成绩加入到总分中,不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。重复执行就是循环。重复工作是计算机特别擅长的工作之一。任务1求一个小组学生成绩的总分及平均分一、问题情景一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。二、具体实现#include"stdio.h"main(){intscore,i,sum=0;floatavg;i=1;printf("请输入本小组10个学生的成绩:");while(i<=10){scanf("%d",&score);sum=sum+score;i=i+1;}avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);}while(i<=10){scanf(“%d”,&score);sum=sum+score;i=i+1;} 任务情景中的程序及流程图#include"stdio.h"main(){intscore,i,sum=0;floatavg;i=1;printf("请输入本小组10个学生的成绩:");while(i<=10){scanf("%d",&score);sum=sum+score;i=i+1;}avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);} While实例练习【例2】本学期期末考试进行了三门课程的测试。成绩单下来后,8个室友兄弟要一比高低,这就要得到每个人三门课程的总分和平均分,用C语言实现之。分析:(1)定义五个实型变量x,y,z,s和avg,依次放每一名学生的三门课程成绩、这三门课程的总成绩和平均分;(2)每次取出一名学生的三门课程成绩,依次给x,y,z,然后再一起放到s中,就可以得到该同学的三门课的总分和平均分。(3)以上步骤重复执行8次。#include"stdio.h"main(){inti;floatx,y,z,sum,avg;i=1;while(i<=8){printf("请输入第%d个同学三门课的成绩",i);scanf("%f%f%f",&x,&y,&z);sum=x+y+z;avg=sum/3;printf("第%d个同学的总分为%.2f,平均分%.2f ",i,sum,avg);i=i+1;}} 求一个小组学生成绩的总分及平均分的程序可改写为:#include"stdio.h"main(){intscore,i,sum=0;floatavg;i=1;printf("请输入本小组10个学生的成绩:");do{scanf("%d",&score);sum=sum+score;i=i+1;}while(i<=10);avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);} 将例2用do…while语句来改进实现。求8个室友兄弟每个人三门课程的总分和平均分#include"stdio.h"main(){inti;floatx,y,z,sum,avg;i=1;do{printf("请输入第%d个同学三门课的成绩",i);scanf("%f%f%f",&x,&y,&z);sum=x+y+z;avg=sum/3;printf("第%d个同学的总分为%.2f,平均分%.2f ",i,sum,avg);i=i+1;}while(i<=8);} 求一个小组学生成绩的总分及平均分的程序可改写为:#include"stdio.h"main(){intscore,i,sum=0;floatavg;printf("请输入本小组10个学生的成绩:");for(i=1;i<=10;i++){scanf("%d",&score);sum=sum+score;}avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);} for的进一步练习用for语句来改进实现例2。(求八位室友每个人三门课的总分及平均分)#include"stdio.h"main(){inti;floatx,y,z,sum,avg;for(i=1;i<=8;i++){printf("请输入第%d个同学三门课的成绩",i);scanf("%f%f%f",&x,&y,&z);sum=x+y+z;avg=sum/3;printf("第%d个同学的总分为%.2f,平均分%.2f ",i,sum,avg);}} 任务2求每个小组学生成绩的总分及平均分一、问题情景一个班进行了一次考试,现要输入全班四个小组的学生成绩,计算每一小组的总分与平均分,并按要求输出。分析在任务1中,所解决的问题是:一个小组学生成绩的总分及平均分。若现在一个班中有四个小组,现求每个小组的学生成绩的总分及平均分。也就是将任务1重复进行四次,显然写四段程序是不科学的,科学的方法是再嵌套一个循环。具体实现:#include"stdio.h"main(){intscore,i,j=1,sum;floatavg;while(j<=4){sum=0;i=1;printf("请输入第%d小组学生成绩:",j);while(i<=10){scanf("%d",&score);sum=sum+score;i=i+1;//本小组学生数增加1}//注意输入方式(空格)avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);j++;//下一个小组}}定义变量及赋初值score,i,sum定义平均分floatavg;定义变量j并赋初值1//j代表小组数,先从第一小组开始j<=4赋初值i=1,sum=0//每个小组刚开始总分为零提示请输入本小组10个学生的成绩:i的初值为1i<=10输入成绩scoresum=sum+score;//将成绩累加到总分sum中i++;//学生人数增加1计算平均分输出总分及平均分j++;程序运行结果一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与if的嵌套相同,内嵌的循环中还可以嵌套循环,这就是多层循环。内层的优先级比外层的高,只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。三种循环(while循环、do…while循环、for循环)可以互相嵌套。 本任务用do…while循环嵌套do…while循环的程序解决:#include"stdio.h"main(){intscore,i,sum;floatavg;intj=1;do{sum=0;i=1;printf("请输入第%d小组学生成绩:",j);do{scanf("%d",&score);sum=sum+score;i=i+1;//本小组学生数增加1}while(i<=10);avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);j++;//下一个小组}while(j<=4);}黄色的循环包含在玫瑰色的循环中 本任务用for循环嵌套for循环:#include"stdio.h"main(){intscore,i,sum;floatavg;intj=1;for(;j<=4;j++){sum=0;printf("请输入第%d小组学生成绩:",j);for(i=1;i<=10;i++){scanf("%d",&score);sum=sum+score;}avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);}}黄色的循环包含在玫瑰色的循环中 本任务while循环嵌套do…while循环#include"stdio.h"main(){intscore,i,sum;floatavg;intj=1;while(j<=4){sum=0;printf("请输入第%d小组学生成绩:",j);i=1;do{scanf("%d",&score);sum=sum+score;i++;}while(i<=10);avg=sum/10.0;printf("本小组10个学生的总分为:%d ",sum);printf("本小组10个学生的平均分为:%.2f ",avg);j++;}}黄色的循环包含在玫瑰色的循环中思考:用for循环嵌套while循环、do…while循环嵌套for循环编程解决任务2。 项目三:其他问题例如:百钱买百鸡、水仙花、求素数…… 【例3】将1~100之间不能被3整除的数输出。分析:定义变量i其初值为1,验证1是否能被3整除?若不能整除,则输出i,然后将i累加到2,再次验证2是否被被3整除?若不能整除,则输出i,这样一直重复,直到i值>100。#includemain(){inti;i=1;while(i<=100){if(i%3!=0)printf(“%3d”,i);i++;}}程序如下 将【例3】用for语句来改进实现将1~100之间不能被3整除的数输出。#includemain(){inti;for(i=1;i<=100;i++)if(i%3!=0)printf(“%3d”,i);}} 将【例3】用do…while语句来改进实现。将1~100之间不能被3整除的数输出。#includemain(){inti;i=1;do{if(i%3!=0)printf(“%3d”,i);i++;}while(i<=100);} 【例4】编程实现百钱买百鸡有一老大爷去集贸市场买鸡,他想用100元钱买100只鸡,而且要求所买的鸡有公鸡、母鸡、小鸡。已知公鸡2元一只,母鸡3元一只,小鸡0.5元一只。问老大爷要买多少只公鸡、母鸡、小鸡恰好花去100元钱,并且买到100只鸡?分析x+y+z=100x+3y+0.5z=100y=1.5z-100x=200-2.5z假设公鸡买x只,母鸡买y只,小鸡买z只,则由题意可得:(1)当z=2时,计算y与x的值(2)当z=4时,计算y与x的值(3)当z=8时,计算y与x的值(4)一直计算到z=98时,计算y与x的值显然,如果x,y的值都大于零,则输出x,y,z。所以用for循环的程序如左:#includemain(){intx,y,z;for(z=2;z<=100;z=z+2){y=1.5*z-100;x=200-2.5*z;if(x>0&&y>0)printf(“公鸡数为%d,母鸡数为%d,小鸡数为%d ",x,y,z);}} 用双循环实现【例4】的百钱买百鸡。分析:假设公鸡买x只,母鸡买y只,小鸡买z只,则:(1)y可以是1、2、3……33的一个值。(2)x可以是1、2、3……50的一个值。(3)然后由y及x,显然可解得z=100-x-y。(4)如果所花的钱刚好是100,则输出x,y,z。程序如下:#includemain(){intx,y,z;for(x=1;x<=50;x++)for(y=1;y<=33;y++){z=100-x-y;if(2*x+3*y+0.5*z==100)printf(“公鸡数为%d,母鸡数为%d,小鸡数为%d ",x,y,z);}} 【例5】输入二个正整数,求它们的最大公约数分析(1)若输入二个正整数分别为a,b,它的最大公约数为k,k的值应小于等于a,b中的一个相对小数;(2)然后进行a%k及b%k的运算,若它们的余数为零,则k就是最大公约数。(3)若a%k及b%k中至少有一个的余数不为零,则k=k-1,然后再执行(2)。#includemain(){inta,b,k;printf("请输入二个正整数");scanf("%d%d",&a,&b);if(a=1){if(a%k==0&&b%k==0)break;k--;}printf("最大公约数为:%d ",k);}}程序的运行结果为:请输入二个正整数56最大公约数为1 【例6】判断素数【例5】在数学课上,李老师要同学们对给定的任意正整数进行判断,看是否为素数,这个数学问题,用C语言该如何解决?分析:因为素数只能被1及本身整除,所以判断一个大于2的正整数x是否为素数,就让x按顺序除以i=2、3、…、x-1,若x能被它们中的任一个除尽,就可跳出循环。因为此数一定不是素数。所以判断x是不是素数,就可以用i的值来衡量,若i=x,则x一定是素数,否则就不是素数。#includemain(){inti,x;printf("请输入一个正整数");scanf("%d",&x);for(i=2;i<=x-1;i++)if(x%i==0)break;if(i==x)printf("%d是素数 ",x);elseprintf("%d不是素数 ",x);} 【例7】显示如下的下三角九九乘法表12436948121651015202561218243036714212835424981624324048566491827364554637281分析:该乘法表要列出1×1,2×1,2×2,3×1,3×2,3×3…,9×9的值,乘数的范围是1~9,针对每一个乘数,被乘数的范围是1到它本身,因此可以用两重循环解决问题。按乘数组织外层循环,i表示从1~9;按被乘数组织内层循环,j表示从1~i,从而确定每一行输出的内容。#includemain(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%-5d",i*j);}printf(" ");}} 相关知识(一)常见的循环嵌套1.while循环嵌套while循环while(){…while(){…}}2.do…while循环嵌套do…while循环do{…do{…}while();}while();3.for循环嵌套for循环for(;;){…for(;;){…}}4.while循环嵌套do…while循环while(){…do{…}while();…}5.for循环嵌套while循环for(;;){…while(){…}…}6.do…while循环嵌套for循环do{…for(;;){…}…}while(); 项目四举一反三【例8】程序功能:运行时输入10个数,然后分别输出其中的最大值、最小值。分析:(1)输入第一个数x,并假定第一个数既是十个数中的最大值max,也是十个数中的最小值min;(2)然后输入下一个数x,将最大值max及最小数min与x分别相比,若max小于x,则max=x;若min大于x,则min=x;(3)不断重复步骤(2),直到第10个数比完为止;类似10个壮士打擂台,第一个壮士先上场,认为自已是“老大”,然后第二个壮士再上场,与前面的“老大”比武,赢者才是真的“老大”,一直到第十个壮士比完为止。#includevoidmain(){floatx,max,min;inti;printf("请输入十个同学的成绩:");for(i=1;i<=10;i++){scanf("%f",&x);if(i==1){max=x;min=x;}if(x>max)max=x;if(x#includevoidmain(){intn,s=0;printf("请输入一个数:");scanf("%d",&n);n=fabs(n);while(n!=0){s=s+n%10;n=n/10;}printf(“这个数的绝对值的各位数字的和为:%d ",s);} 【例10】编程求:s=3+33+333+3333+33333+333333+3333333+33333333分析:可以将本题化为:s=3(1+11+111+1111+11111+111111+1111111+11111111),所以只要求出了s=1+11+111+1111+11111+111111+1111111+11111111,然后再执行s=s*3,就能达到题目的要求。而s=1+11+111+1111+11111+111111+1111111+11111111是一道累加题,只要执行8次的s=s+t即可,只不过第一次循环中的t是1,第二次是11,第三次是111,分析后项与前项的关系是:前项的10倍加1等于后项,即t=10*t+1t=0;for(i=1;i<=8;i++){t=10*t+1;s=s+t;}#includevoidmain(){inti,t=0;longs=0;for(i=1;i<=8;i++){t=t*10+1;s=s+t;}s=s*3;printf("3+33+333+3333+33333+333333+3333333+33333333=%ld ",s);} 分析:(1)首先认为最大值是当x=1时的函数值,即max=1*1-5*1+sin(1);(2)然后计算出x=2时的f(x)与前面的max相比,如果max#includevoidmain(){intx;floatmax;max=1*1-5*1+sin(1);for(x=2;x<=10;x++)if(max#includevoidmain(){inti,a,b,c;for(i=100;i<=999;i++){a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;if(i==a*a*a+b*b*b+c*c*c)printf("%disaArmstrongnumber! ",i);}} 分析:因为要计算前30项之和,可以用一个循环:(1)将a累加到s中,然后新的a变为sqrt(a);(2)重复多次(1)即可;当前30项的和算完后,则输出。【例12】数列第一项为81,此后各项均为它前1项的正平方根,统计该数列前30项之和。#include#includevoidmain(){floats=0,a=81,i;for(i=1;i<=30;i++){s=s+a;a=sqrt(a);}printf(“%f ”,s);}运行结果:121.335854 分析:用一个循环,将每一项累加到一个变量中,因为它需要有效位数保留10位,所以要定义一个双精度型变量。【例13】编写程序,完成以下功能:计算2的平方根、3的平方根、……10的平方根之和,要求计算结果具有小数点后10位有效位数。#include#includevoidmain(){inti;doubles=0;for(i=2;i<=10;i++)s+=sqrt(i);printf("%.10lf ",s);}程序的运行结果为:21.46828781868 【例14】a、b、c为区间[1,100]的整数,统计使等式c/(a*a+b*b)=1成立的所有解的个数,(若a=1、b=3、c=10是1个解,则a=3、b=1、c=10也是解)#includevoidmain(){intn=0,a,b,c;for(a=1;a<=100;a++)for(b=1;b<=100;b++)for(c=1;c<=100;c++)if((a*a+b*b)==c)n+=1;//注意:不要写成c/(a*a+b*b)==1printf("%d",n);}程序的运行结果为:69 【例15】韩信点兵:相传汉高祖刘邦问大将军韩信现在统御兵士多少,韩信答,每3人一列余1人、5人一列余2人、7人一列余4人、13人一列余6人、17人一列余2人、19人一列余10人。  刘邦茫然而不知其数。你呢? 你是一位优秀的程序员,请你帮刘邦解决这一问题,韩信至少统御了多少兵士。分析:这道题的本质就是;“一个正整数,被3除时余1,被5除时余2,被7除时余4,被13除时余6,被17除时余2,被19除时余10,求这个数。”所以,我们可以从最小自然数出发,一个一个地累加,如果它满足条件,则退出循环。#includevoidmain(){longi;for(i=1;;i++)if(i%3==2&&i%5==2&&i%7==4&&i%13==6&&i%17==2&&i%19==10)break;printf("韩信统领的兵数有:%ld ",i);}程序运行结果为:韩信统领的兵数有:131072 思考:现在你对循环结构掌握的怎样?多读多写,把C当做你的朋友,他也会将你当做朋友!加油!

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭