




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,综合训练一循环结构程序,项目一:图形编程项目二:学生成绩的分组汇总项目三:其他问题项目四:举一反三,2,项目一图形输出,项目要求给定图形,按照要求格式输出项目分析:分析图形的特点,包括行、列上字符的个数,通过多重循环控制图形的输出,3,*,使用双重循环实现,思路:,一共有4行,每行由星号组成:变量i控制输出行数,从1变化到4变量j控制输出每行的星号:j从1变化到4,每次输出一个星号,例1:编程序,输出以下图形,4,参考代码:,#includestdio.hmain()inti,j;for(i=1;i=4;i+)for(j=1;j=4;j+)printf(*);printf(n);,5,改写例1:,编程序,输出以下图形。,*,思路:,一共有4行,每行由星号组成:变量i控制输出行数,从1变化到4变量j控制输出每行的星号:j从1变化到i,每次输出一个星号,6,参考代码:,main()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);,7,再次改写例1:,编程序,输出以下图形。,*,思路:,一共有4行,每行由空格和星号组成:空格数按行增加,星号按行减少变量i控制输出行数,从1变化到4变量j控制输出每行的空格和星号:j从1变化到i,每次输出一个空格j从1变化到8-2*i1,每次输出一个星号,8,参考算法和程序:,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(n);,思考:如何输出10行图形?输出图形向右平移20个字符位置,应如何修改程序?,9,【反复训练】编程显示如下所示的图形,*,分析:题目要求的三角形由5行组成,因此程序中循环结构的循环次数应为5次,每一次输出一行。而“输出一行”又进一步分为三项工作。(1)输出若干个空格;(2)输出若干个星号;(3)回车换行,为新的一行的输出做准备。现在的问题是,如何确定每一行应输出的空格数和字符”*”的数目,以便分别通过循环来输出这两种字符。,#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(“n”);/换行,10,项目二学生成绩的分组汇总,项目要求一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。,项目分析在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项目可分成二个任务:任务一:求一个小组学生成绩的总分及平均分;任务二:求四个小组学生成绩的总分及平均分。,11,分析:如果本小组一共有十个同学,显然不可能定义十个变量x1,x2,x10,然后在程序中表示成sum=x1+x2+x3+x10。求一个小组的学生总成绩的步骤就是:先输入第一个学生的成绩,然后将这个成绩加到总分中,接下来,输入第二个学生的成绩,再将第二个学生的成绩加入到总分中,不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。重复执行就是循环。重复工作是计算机特别擅长的工作之一。,任务1求一个小组学生成绩的总分及平均分,一、问题情景一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。,二、具体实现#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(请输入本小组10个学生的成绩:);while(i=10)scanf(%d,while(i=10)scanf(“%d”,12,任务情景中的程序及流程图,#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(请输入本小组10个学生的成绩:);while(i=10)scanf(%d,13,While实例练习,【例2】本学期期末考试进行了三门课程的测试。成绩单下来后,8个室友兄弟要一比高低,这就要得到每个人三门课程的总分和平均分,用C语言实现之。,分析:(1)定义五个实型变量x,y,z,s和avg,依次放每一名学生的三门课程成绩、这三门课程的总成绩和平均分;(2)每次取出一名学生的三门课程成绩,依次给x,y,z,然后再一起放到s中,就可以得到该同学的三门课的总分和平均分。(3)以上步骤重复执行8次。,#includestdio.hmain()inti;floatx,y,z,sum,avg;i=1;while(i=8)printf(请输入第%d个同学三门课的成绩,i);scanf(%f%f%f,14,求一个小组学生成绩的总分及平均分的程序可改写为:,#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(请输入本小组10个学生的成绩:);doscanf(%d,15,将例2用dowhile语句来改进实现。,求8个室友兄弟每个人三门课程的总分和平均分#includestdio.hmain()inti;floatx,y,z,sum,avg;i=1;doprintf(请输入第%d个同学三门课的成绩,i);scanf(%f%f%f,16,求一个小组学生成绩的总分及平均分的程序可改写为:,#includestdio.hmain()intscore,i,sum=0;floatavg;printf(请输入本小组10个学生的成绩:);for(i=1;i=10;i+)scanf(%d,17,for的进一步练习,用for语句来改进实现例2。(求八位室友每个人三门课的总分及平均分)#includestdio.hmain()inti;floatx,y,z,sum,avg;for(i=1;i=8;i+)printf(请输入第%d个同学三门课的成绩,i);scanf(%f%f%f,18,任务2求每个小组学生成绩的总分及平均分,一、问题情景一个班进行了一次考试,现要输入全班四个小组的学生成绩,计算每一小组的总分与平均分,并按要求输出。,分析,在任务1中,所解决的问题是:一个小组学生成绩的总分及平均分。若现在一个班中有四个小组,现求每个小组的学生成绩的总分及平均分。也就是将任务1重复进行四次,显然写四段程序是不科学的,科学的方法是再嵌套一个循环。,具体实现:#includestdio.hmain()intscore,i,j=1,sum;floatavg;while(j=4)sum=0;i=1;printf(请输入第%d小组学生成绩:,j);while(i=10)scanf(%d,/下一个小组,程序运行结果,一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与if的嵌套相同,内嵌的循环中还可以嵌套循环,这就是多层循环。内层的优先级比外层的高,只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。三种循环(while循环、dowhile循环、for循环)可以互相嵌套。,19,本任务用dowhile循环嵌套dowhile循环的程序解决:,#includestdio.hmain()intscore,i,sum;floatavg;intj=1;dosum=0;i=1;printf(请输入第%d小组学生成绩:,j);doscanf(%d,黄色的循环包含在玫瑰色的循环中,20,本任务用for循环嵌套for循环:,#includestdio.hmain()intscore,i,sum;floatavg;intj=1;for(;j=4;j+)sum=0;printf(请输入第%d小组学生成绩:,j);for(i=1;i=10;i+)scanf(%d,黄色的循环包含在玫瑰色的循环中,21,本任务while循环嵌套dowhile循环,#includestdio.hmain()intscore,i,sum;floatavg;intj=1;while(j100。,#includemain()inti;i=1;while(i=100)if(i%3!=0)printf(“%3d”,i);i+;,程序如下,24,将【例3】用for语句来改进实现,将1100之间不能被3整除的数输出。#includemain()inti;for(i=1;i=100;i+)if(i%3!=0)printf(“%3d”,i);,25,将【例3】用dowhile语句来改进实现。,将1100之间不能被3整除的数输出。#includemain()inti;i=1;doif(i%3!=0)printf(“%3d”,i);i+;while(i=100);,26,【例4】编程实现百钱买百鸡,有一老大爷去集贸市场买鸡,他想用100元钱买100只鸡,而且要求所买的鸡有公鸡、母鸡、小鸡。已知公鸡2元一只,母鸡3元一只,小鸡0.5元一只。问老大爷要买多少只公鸡、母鸡、小鸡恰好花去100元钱,并且买到100只鸡?,分析,x+y+z=100 x+3y+0.5z=100,y=1.5z-100 x=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;z0,27,用双循环实现【例4】的百钱买百鸡。,分析:假设公鸡买x只,母鸡买y只,小鸡买z只,则:(1)y可以是1、2、333的一个值。(2)x可以是1、2、350的一个值。(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,小鸡数为%dn,x,y,z);,28,【例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,程序的运行结果为:请输入二个正整数56最大公约数为1,29,【例6】判断素数,【例5】在数学课上,李老师要同学们对给定的任意正整数进行判断,看是否为素数,这个数学问题,用C语言该如何解决?,分析:因为素数只能被1及本身整除,所以判断一个大于2的正整数x是否为素数,就让x按顺序除以i=2、3、x-1,若x能被它们中的任一个除尽,就可跳出循环。因为此数一定不是素数。所以判断x是不是素数,就可以用i的值来衡量,若i=x,则x一定是素数,否则就不是素数。,#includemain()inti,x;printf(请输入一个正整数);scanf(%d,30,【例7】显示如下的下三角九九乘法表,12436948121651015202561218243036714212835424981624324048566491827364554637281,分析:该乘法表要列出11,21,22,31,32,33,99的值,乘数的范围是19,针对每一个乘数,被乘数的范围是1到它本身,因此可以用两重循环解决问题。按乘数组织外层循环,i表示从19;按被乘数组织内层循环,j表示从1i,从而确定每一行输出的内容。,#includemain()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%-5d,i*j);printf(n);,31,相关知识,(一)常见的循环嵌套1.while循环嵌套while循环while()while()2.dowhile循环嵌套dowhile循环dodowhile();while();3.for循环嵌套for循环for(;)for(;),4.while循环嵌套dowhile循环while()dowhile();5.for循环嵌套while循环for(;)while()6.dowhile循环嵌套for循环dofor(;)while();,32,项目四举一反三,【例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;imax)max=x;if(xmin)min=x;printf(最高分为%.1f,最低分为%.1fn,max,min);,在if语句中比较两个数相等是“=”符号,而不是数学中的“=”符号,在C语言中“=”是赋值号。,33,【例9】程序功能:运行时输入整数n,输出n各位数字之和。(例如:n=1234,则输出10,n=-123,则输出6。,分析:若n的值为2345,则(1)个位数的取法是:(2)十位数的数字取法是:(3)百位数的数字的取法:(4)同理,要取得千位数的数字:,通过n%10就能获取个位数字“5”,如果能将2345化为234,则就能轻松地取到4,所以执行n=2345/10,再执行n=n%10就行,执行234/10,即n=n/10,新的n的值将成为23,然后再执行n%10就可获取数字“3”;,同理,要取得千位数的数字,只要执行23/10,即n=n/10,新的n的值将成为2,然后再执行n%10就可获取“2”;,总结以上各步骤,可以发现,对任意的一个数n,执行n%10,再执行n=n/10,然后不断的重复,就可以一个一个获取个位数字、十位数字、百位数字,所以可以用循环去执行以上的步骤,但是循环几次呢?仔细分析不难发现,经过若干次的执行n=n/10,则新的n的值肯定会成为0,所以可以得出结论:循环条件是n!=0。,程序的流程图为:,#include#includevoidmain()intn,s=0;printf(请输入一个数:);scanf(%d,34,【例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+1,t=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=%ldn,s);,35,分析:(1)首先认为最大值是当x=1时的函数值,即max=1*1-5*1+sin(1);(2)然后计算出x=2时的f(x)与前面的max相比,如果maxf(x),则max=f(x)(3)将x=3,4,.10不断重复步骤(2);(4)输出max。,【例10】对x=1,2,3,10,求f(x)=x*x-5*x+sin(x)的最大值,#include#includevoidmain()intx;floatmax;max=1*1-5*1+sin(1);for(x=2;x=10;x+)if(maxx*x-5*x+sin(x)max=x*x-5*x+sin(x);printf(%fn,max);,36,【例11】编程找出100999之间所有的水仙花数,分析:本题的编程思路是用枚举法:即对100999之间的每一个数,取出它的百位数a,十位数b,个位数c,如果a*a*a+b*b*b+c*c*c的值等于它自身,则输出这个数。显然a=i/100,b=(i-a*100)/10;c=i-a*100-b*10;,#include#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!n,i);,37,分析:因为要计算前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(“%fn”,s);,运行结果:121.33
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年营养师职业资格考试专项训练:营养师职业素养与沟通能力
- 民法典普法知识培训课件
- 2025年Python项目管理专项训练试卷 技能提升
- 试题山西省怀仁市重点中学2026届化学高一第一学期期中质量跟踪监视试题含解析
- 四川省会理县第一中学2026届化学高三上期末预测试题含解析
- 天津市蓟州等部分区2026届化学高一第一学期期末达标测试试题含解析
- 2025年校园食堂设备维护与食品安全管理服务合同范本
- 2025年智能化车位租赁与增值服务综合管理协议
- 2025年绿色餐饮理念推广与供应链管理服务合同
- 2025年公共图书馆装修改造合同及年度财务监控协议
- NB-T 10435-2020 电动汽车快速更换电池箱锁止机构通.用技术要求
- 中医医疗技术手册2013普及版汇编
- gcp机构办公室工作计划
- 1.1.3茶云纹叶枯病识别与防治
- MT-T 1199-2023 煤矿用防爆柴油机无轨胶轮运输车辆安全技术条件
- (高清版)TDT 1042-2013 土地整治工程施工监理规范
- 北师大版四年级下册数学计算题400道及答案
- 兰花主要病害的识别及防治
- 新能源汽车充电桩招商引资方案
- 药店各管理制度
- 幼儿园招生小组计划书
评论
0/150
提交评论