循环结构训练课件_第1页
循环结构训练课件_第2页
循环结构训练课件_第3页
循环结构训练课件_第4页
循环结构训练课件_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、综合训练一 循环结构程序,项目一:图形编程 项目二:学生成绩的分组汇总 项目三:其他问题 项目四:举一反三,1,PPT学习交流,项目一 图形输出,项目要求 给定图形,按照要求格式输出 项目分析: 分析图形的特点,包括行、列上字符的个数,通过多重循环控制图形的输出,2,PPT学习交流,* * * *,使用双重循环实现,思路:,一共有4 行,每行由星号组成: 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的星号: j 从1变化到 4,每次输出一个星号,例1:编程序,输出以下图形,3,PPT学习交流,参考代码:,#includestdio.h main( ) int i,j; for

2、 (i=1; i=4; i+) for (j=1; j=4; j+) printf(*); printf(n); ,4,PPT学习交流,改写例1:,编程序,输出以下图形。,* * * *,思路:,一共有4 行,每行由星号组成: 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的星号: j 从1变化到 i,每次输出一个星号,5,PPT学习交流,参考代码:,main( ) int i,j; for (i=1; i=4; i+) for (j=1; j=i; j+) printf(*); printf(n); ,6,PPT学习交流,再次改写例1:,编程序,输出以下图形。,* * * *

3、,思路:,一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的空格和星号: j 从1变化到 i,每次输出一个空格 j 从1变化到 8-2*i1,每次输出一个星号,7,PPT学习交流,参考算法和程序:,main( ) int i,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个字符位置,应如何修改程序?,8,PPT学习

4、交流,【反复训练】编程显示如下所示的图形,* * * * *,分析:题目要求的三角形由5行组成,因此程序中循环结构 的循环次数应为5次,每一次输出一行。而“输出一行”又进 一步分为三项工作。 (1) 输出若干个空格; (2) 输出若干个星号; (3) 回车换行,为新的一行的输出做准备。 现在的问题是,如何确定每一行应输出的空格数和字符”*”的数 目,以便分别通过循环来输出这两种字符。,#include main() int i,j; for(i=1;i=5;i+) /一共输出5行 for(j=1;j=6-i;j+) printf( ); /输出空格数 for(j=1;j=2*i-1;j+) p

5、rintf(*); /输出”*”的数目 printf(“n”); /换行 ,9,PPT学习交流,项目二 学生成绩的分组汇总,项目要求 一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。,项目分析 在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项目可分成二个任务: 任务一:求一个小组学生成绩的总分及平均分; 任务二:求四个小组学生成绩的总分及平均分。,10,PPT学习交流,分析:如果本小组一共有十个同学,显然不可能定义十个变量 x1,x2,x10,然后在程 序中表示成sum=x1+x2+x3+x10。 求一个小组的学生总成绩的步骤就是:

6、先输入第一个学生的成绩,然后将这个成绩加到总分中, 接下来,输入第二个学生的成绩,再将第二个学生的成绩加入到总分中, 不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。 重复执行就是循环。重复工作是计算机特别擅长的工作之一。,任务1 求一个小组学生成绩的总分及平均分,一、问题情景 一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。,二、具体实现 #include stdio.h main() int score,i,sum=0; float avg; i=1; printf( 请输入本小组10个学生的成绩:); while(i=10) sca

7、nf(%d, ,while(i=10) scanf(“%d”, ,11,PPT学习交流,任务情景中的程序及流程图,#include stdio.h main() int score,i,sum=0; float avg; i=1; printf( 请输入本小组10个学生的成绩:); while(i=10) scanf(%d, ,12,PPT学习交流,While实例练习,【例2】本学期期末考试进行了三门课程的测试。成绩单下来后,8个室友兄弟要一比高低,这就要得到每个人三门课程的总分和平均分,用C语言实现之。,分析: (1)定义五个实型变量x,y,z,s和avg, 依次放每一名学生的三门课程成绩、

8、 这三门课程的总成绩和平均分; (2)每次取出一名学生的三门课程成绩, 依次给x,y,z,然后再一起放到s中, 就可以得到该同学的三门课的总分和平均分。 (3)以上步骤重复执行8次。,#include stdio.h main() int i; float x,y,z,sum,avg; i=1; while(i=8) printf(请输入第%d个同学三门课的成绩,i); scanf(%f%f%f, ,13,PPT学习交流,求一个小组学生成绩的总分及平均分的程序可改写为:,#include stdio.h main() int score,i,sum=0; float avg; i=1; pri

9、ntf( 请输入本小组10个学生的成绩:); do scanf(%d, ,14,PPT学习交流,将例2用do while语句来改进实现。,求8个室友兄弟每个人三门课程的总分和平均分 #include stdio.h main() int i; float x,y,z,sum,avg; i=1; do printf(请输入第%d个同学三门课的成绩,i); scanf(%f%f%f, ,15,PPT学习交流,求一个小组学生成绩的总分及平均分的程序可改写为:,#include stdio.h main() int score,i,sum=0; float avg; printf( 请输入本小组10个

10、学生的成绩:); for(i=1;i=10;i+) scanf(%d, ,16,PPT学习交流,for的进一步练习,用for语句来改进实现例2 。(求八位室友每个人三门课的总分及平均分) #include stdio.h main() int i; float x,y,z,sum,avg; for(i=1;i=8;i+) printf(请输入第%d个同学三门课的成绩,i); scanf(%f%f%f, ,17,PPT学习交流,任务 2 求每个小组学生成绩的总分及平均分,一、问题情景 一个班进行了一次考试,现要输入全班四个小组的学生成绩,计算每一小组的总分与平均分,并按要求输出。,分析,在任务1

11、中,所解决的问题是:一个小组学生成绩的总分及平均分。 若现在一个班中有四个小组,现求每个小组的学生成绩的总分及 平均分。也就是将任务1重复进行四次,显然写四段程序是不科学 的,科学的方法是再嵌套一个循环。,具体实现: #include stdio.h main() int score,i,j=1,sum; float avg; while(j=4) sum=0; i=1; printf( 请输入第%d小组学生成绩:,j); while(i=10) scanf(%d, /下一个小组 ,程序运行结果,一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与if的嵌套相同, 内嵌的循环中还可以嵌套循

12、环,这就是多层循环。内层的优先级比外层的高, 只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。 三种循环(while循环、dowhile循环、for循环)可以互相嵌套。,18,PPT学习交流,本任务用do while循环嵌套do while循环的程序解决:,#include stdio.h main() int score,i,sum; float avg; int j=1; do sum=0; i=1; printf( 请输入第%d小组学生成绩:,j); do scanf(%d, ,黄色的循环包含在玫瑰色的循环中,19,PPT学习交流,本任务用for循环嵌套for循环:,

13、#include stdio.h main() int score,i,sum; float avg; int j=1; for(;j=4;j+) sum=0; printf( 请输入第%d小组学生成绩:,j); for(i=1;i=10;i+) scanf(%d, ,黄色的循环包含在玫瑰色的循环中,20,PPT学习交流,本任务while循环嵌套do while循环,#include stdio.h main() int score,i,sum; float avg; int j=1; while(j=4) sum=0; printf( 请输入第%d小组学生成绩:,j); i=1; do sc

14、anf(%d, ,黄色的循环包含在玫瑰色的循环中,思考:用for循环嵌套while循环、do while循环嵌套for循环编程解决任务2。,21,PPT学习交流,项目三:其他问题,例如:百钱买百鸡、水仙花、求素数,22,PPT学习交流,【例3】将1100之间不能被3整除的数输出。,分析:定义变量i其初值为1,验证1是否能被3整除?若不能整除,则输出i,然后将i累加到2,再次验证2是否被被3整除?若不能整除,则输出i,这样一直重复,直到i值100。,#include main() int i; i=1; while(i=100) if(i%3!=0) printf(“%3d”,i); i+; ,

15、程序如下,23,PPT学习交流,将【例3】用for语句来改进实现,将1100之间不能被3整除的数输出。 #include main() int i; for(i=1;i=100;i+) if(i%3!=0) printf(“%3d”,i); ,24,PPT学习交流,将【例3】用do while语句来改进实现。,将1100之间不能被3整除的数输出。 #include main() int i; i=1; do if(i%3!=0) printf(“%3d”,i); i+; while(i=100); ,25,PPT学习交流,【例4】编程实现百钱买百鸡,有一老大爷去集贸市场买鸡,他想用100元钱买

16、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循环的程序 如左:,#include main() int x

17、,y,z; for(z=2;z0 ,26,PPT学习交流,用双循环实现【例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。,程序如下: #include main() int x,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, 小鸡数为%

18、dn,x,y,z); ,27,PPT学习交流,【例5】输入二个正整数,求它们的最大公约数,分析,(1)若输入二个正整数 分别为a,b,它的最大公 约数为k,k的值应小于等 于a,b中的一个相对小数; (2)然后进行a%k及b%k 的运算,若它们的余数为 零,则k就是最大公约数。 (3)若a%k及b%k中至少 有一个的余数不为零,则 k=k-1,然后再执行(2)。,#include main() int a,b,k; printf(请输入二个正整数); scanf(%d%d, ,程序的运行结果为: 请输入二个正整数5 6 最大公约数为1,28,PPT学习交流,【例6】判断素数,【例5】在数学课上

19、,李老师要同学们对给定的任意正整数进行判断, 看是否为素数,这个数学问题,用C语言该如何解决?,分析:因为素数只能被1及 本身整除,所以判断一个大 于2的正整数x是否为素数, 就让x按顺序除以i=2、3、 、x-1,若x能被它们中 的任一个除尽,就可跳出 循环。因为此数一定不是 素数。所以判断x是不是素 数,就可以用i的值来衡量, 若i=x,则x一定是素数, 否则就不是素数。,#include main() int i,x; printf(请输入一个正整数); scanf(%d, ,29,PPT学习交流,【例7】显示如下的下三角九九乘法表,1 2 4 3 6 9 4 8 12 16 5 10

20、15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81,分析:该乘法表要列出11,21, 22,31,32,33,99 的值,乘数的范围是19,针对每一 个乘数,被乘数的范围是1到它本身, 因此可以用两重循环解决问题。按乘 数组织外层循环,i表示从19;按被 乘数组织内层循环,j表示从1i,从 而确定每一行输出的内容。,#include main() int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(%-5d,i*j

21、); printf(n); ,30,PPT学习交流,相关知识,(一) 常见的循环嵌套 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( );,

22、31,PPT学习交流,项目四 举一反三,【例8】程序功能:运行时输入10个数,然后分别输出其中的最大值、最小值。,分析: (1)输入第一个数x,并假定第一 个数既是十个数中的最大值max, 也是十个数中的最小值min; (2)然后输入下一个数x,将最大 值max及最小数min与x分别相比, 若max小于x,则max=x;若min大 于x,则min=x; (3) 不断重复步骤(2),直到第 10个数比完为止;类似10个壮士 打擂台,第一个壮士先上场,认 为自已是“老大”,然后第二个壮 士再上场,与前面的“老大”比武, 赢者才是真的“老大”,一直到第 十个壮士比完为止。,#include void

23、 main() float x,max,min; int i; printf(请输入十个同学的成绩:) ; for(i=1;imax) max=x; if(xmin) min=x; printf(最高分为%.1f,最低分为%.1fn, max,min); ,在if语句中比较两个数相等是“=” 符号,而不是数学中的“=” 符号, 在C语言中“=”是赋值号。,32,PPT学习交流,【例9】程序功能:运行时输入整数n,输出n各位数字之和。 (例如:n=1234,则输出10,n=-123,则输出6。,分析: 若n的值为2345,则 (1)个位数的取法是: (2)十位数的数字取法是: (3)百位数的数字

24、的取法: (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, 然后不断的重复,就可以一个一个获取个位数字、十位数字、百位数字, 所以可以用循环去执行以上的步骤,但是循环几次呢?仔细

25、分析不难发现, 经过若干次的执行n=n/10,则新的n的值肯定会成为0,所以可以得出结论: 循环条件是n!=0。,程序的流程图为:,#include #include void main() int n,s=0; printf(请输入一个数:); scanf(%d, ,33,PPT学习交流,【例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

26、+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;,#include void main() int i,t=0; long s=0; for(i=1;i=8;i+) t=t*10+1; s=s+t; s=s*3; prin

27、tf(3+33+333+3333+33333+333333+ 3333333+33333333=%ldn,s); ,34,PPT学习交流,分析: (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 #include void main() int x; float max; max=1*1-5*1+si

28、n(1); for(x=2;x=10;x+) if(maxx*x-5*x+sin(x)max= x*x-5*x+sin(x); printf(%fn,max); ,35,PPT学习交流,【例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 #include void main() int i,a,b,c; for(i=100

29、;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(%d is a Armstrong number!n,i); ,36,PPT学习交流,分析: 因为要计算前30项之和,可以用一个循环: (1) 将a累加到s中,然后新的a变为sqrt(a); (2) 重复多次(1)即可;当前30项的和算完后,则输出。,【例12】数列第一项为81,此后各项均为它前1项的正平方根, 统计该数列前30项之和。,#include #include void main() float s=0,a=81,i; for(i=1;i=30;i+) s=s+a; a=sqr

温馨提示

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

评论

0/150

提交评论