循环结构训练

上传人:沈*** 文档编号:218185909 上传时间:2023-06-17 格式:PPT 页数:41 大小:1.29MB
收藏 版权申诉 举报 下载
循环结构训练_第1页
第1页 / 共41页
循环结构训练_第2页
第2页 / 共41页
循环结构训练_第3页
第3页 / 共41页
资源描述:

《循环结构训练》由会员分享,可在线阅读,更多相关《循环结构训练(41页珍藏版)》请在装配图网上搜索。

1、循环结构训练循环结构训练项目一项目一 图形输出图形输出项目要求项目要求 给定图形,按照要求格式输出项目分析:项目分析:分析图形的特点,包括行、列上字符的个数,通过多重循环控制图形的输出 *使用使用使用使用双重循环双重循环双重循环双重循环实现实现实现实现思路:思路:思路:思路:一共有一共有一共有一共有4 4 行,每行由星号组成:行,每行由星号组成:行,每行由星号组成:行,每行由星号组成:变量变量变量变量 i i 控制输出行数,控制输出行数,控制输出行数,控制输出行数,从从从从1 1变化到变化到变化到变化到4 4变量变量变量变量 j j 控制输出每行的星号:控制输出每行的星号:控制输出每行的星号:

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

3、控制输出行数,控制输出行数,控制输出行数,控制输出行数,从从从从1 1变化到变化到变化到变化到4 4变量变量变量变量 j j 控制输出每行的星号:控制输出每行的星号:控制输出每行的星号:控制输出每行的星号:j j 从从从从1 1变化到变化到变化到变化到 i i,每次输出一个星号每次输出一个星号每次输出一个星号每次输出一个星号参考代码:参考代码:main()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);再次改写例再次改写例1 1:编程序,输出以下图形。编程序,输出以下图形。*思路:思路:思路:思路:一共有一共有一共有一共有4 4

4、 行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少变量变量变量变量 i i 控制输出行数,控制输出行数,控制输出行数,控制输出行数,从从从从1 1变化到变化到变化到变化到4 4变量变量变量变量 j j 控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:j j 从从从从1 1变化到变化到变化到变化到 i i,每次输出一个空格每次输出一个空格每次输出一个空格每次输出一个空格 j

5、j 从从从从1 1变化到变化到变化到变化到 8-28-2*i i1 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(n);for(i=1;i=4;i+)for(j=1;j=i;j+)输出一个空格输出一个空格 for(j=1;j=8-(2*i-1);j+)输出一个星号输出一个星号 换行换行思考:思考:思考:思考:l l如何输出如何输出如何输出如何输出1010行行行

6、行图形?图形?图形?图形?l l输出图形向右输出图形向右输出图形向右输出图形向右平移平移平移平移2020个字符个字符个字符个字符位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序?【反复训练】编程显示如下所示的图形【反复训练】编程显示如下所示的图形 *分析:题目要求的三角形由5行组成,因此程序中循环结构的循环次数应为5次,每一次输出一行。而“输出一行”又进一步分为三项工作。(1)输出若干个空格;(2)输出若干个星号;(3)回车换行,为新的一行的输出做准备。现在的问题是,如何确定每一行应输出的空格数和字符”*”的数目,以便分别通过循环来输出这两种字符。行号应输

7、出的空格应输出的“*”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(“n”);/换行换行项目二项目二 学生成绩的分组汇总学生成绩的分组汇总项目要求项目要求 一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。项目分析项目分析在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项

8、目可分成二个任务:任务一:求一个小组学生成绩的总分及平均分;任务二:求四个小组学生成绩的总分及平均分。分析:如果本小组一共有十个同学,显然不可能定义十个变量x1,x2,x10,然后在程 序中表示成sum=x1+x2+x3+x10。求一个小组的学生总成绩的步骤就是:先输入第一个学生的成绩,然后将这个成绩加到总分中,接下来,输入第二个学生的成绩,再将第二个学生的成绩加入到总分中,不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。重复执行就是循环。重复工作是计算机特别擅长的工作之一。任务任务1 1 求一个小组学生成绩的总分及平均分求一个小组学生成绩的总分及平均分 一、问题情景一、问题情景

9、一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。二、具体实现二、具体实现#include stdio.hmain()int score,i,sum=0;float avg;i=1;printf(请输入本小组10个学生的成绩:);while(i=10)scanf(%d,&score);sum=sum+score;i=i+1;avg=sum/10.0;printf(本小组10个学生的总分为:%dn,sum);printf(本小组10个学生的平均分为:%.2fn,avg);while(i=10)scanf(“%d”,&score);sum=sum+scor

10、e;i=i+1;任务情景中的程序及流程图任务情景中的程序及流程图#includestdio.hmain()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个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);WhileWhile实例练习实例练习【例2】本学期期末考试进行了三门课

11、程的测试。成绩单下来后,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,&x,&y,&z)

12、;sum=x+y+z;avg=sum/3;printf(第第%d个同学的总分为个同学的总分为%.2f,平均分平均分%.2fn,i,sum,avg);i=i+1;求一个小组学生成绩的总分及平均分的程序可改写为求一个小组学生成绩的总分及平均分的程序可改写为:#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(请输入本小组请输入本小组10个学生的成绩:个学生的成绩:);doscanf(%d,&score);sum=sum+score;i=i+1;while(i=10);avg=sum/10.0;printf(本小组本小组10个学生的总分

13、为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);将例将例2用用dowhile语句来改进实现。语句来改进实现。求求8个室友兄弟每个人三门课程的总分和平均分个室友兄弟每个人三门课程的总分和平均分#includestdio.hmain()inti;floatx,y,z,sum,avg;i=1;doprintf(请输入第请输入第%d个同学三门课的成绩个同学三门课的成绩,i);scanf(%f%f%f,&x,&y,&z);sum=x+y+z;avg=sum/3;printf(第第%d个同学的总分为个同学的总分为%.2f,平均分

14、平均分%.2fn,i,sum,avg);i=i+1;while(i=8);求一个小组学生成绩的总分及平均分的程序可改写为:求一个小组学生成绩的总分及平均分的程序可改写为:#includestdio.hmain()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个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分

15、为:%.2fn,avg);for的进一步练习的进一步练习用for语句来改进实现例2。(求八位室友每个人三门求八位室友每个人三门课的总分及平均分课的总分及平均分)#includestdio.hmain()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,平均分平均分%.2fn,i,sum,avg);任务任务 2 2 求每个小组学生成绩的总分及平均分

16、求每个小组学生成绩的总分及平均分一、问题情景一、问题情景 一个班进行了一次考试,现要输入全班四个小组的学生成绩,计算每一小组的总分与平均分,并按要求输出。分析分析在任务在任务1中,所解决的问题是:一个小组学生成绩的总分及平均分。中,所解决的问题是:一个小组学生成绩的总分及平均分。若现在一个班中有四个小组,现求每个小组的学生成绩的总分及若现在一个班中有四个小组,现求每个小组的学生成绩的总分及平均分。也就是将任务平均分。也就是将任务1重复进行四次,显然写四段程序是不科学重复进行四次,显然写四段程序是不科学的,科学的方法是再嵌套一个循环。的,科学的方法是再嵌套一个循环。具体实现:具体实现:#incl

17、udestdio.hmain()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个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);j+;/下一个小组下一个小组定义变量

18、及赋初值score,i,sum定义平均分float avg;定义变量j并赋初值1 /j代表小组数,先从第一小组开始 j=4赋初值i=1,sum=0 /每个小组刚开始总分为零提示请输入本小组10个学生的成绩:i的初值为1i=10输入成绩scoresum=sum+score;/将成绩累加到总分sum中i+;/学生人数增加1计算平均分输出总分及平均分j+;程序运行结果一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与if的嵌套相同,的嵌套相同,内嵌的循环中还可以嵌套循环,这就是多层循环。内层的优先级比外层的高,内嵌的循环中还可以嵌套循环,

19、这就是多层循环。内层的优先级比外层的高,只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。三种循环三种循环(while循环、循环、dowhile循环、循环、for循环循环)可以互相嵌套。可以互相嵌套。本任务用本任务用dowhile循环嵌套循环嵌套dowhile循环的程序解决:循环的程序解决:#includestdio.hmain()intscore,i,sum;floatavg;intj=1;dosum=0;i=1;printf(请输入第请输入第%d小组学生成绩小组学生成绩:,j);doscanf(%d,&s

20、core);sum=sum+score;i=i+1;/本小组学生数增加本小组学生数增加1while(i=10);avg=sum/10.0;printf(本小组本小组10个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);j+;/下一个小组下一个小组while(j=4);黄色的循环包含在玫瑰色的循环中本任务用本任务用for循环嵌套循环嵌套for循环:循环:#includestdio.hmain()intscore,i,sum;floatavg;intj=1;for(;j=4;j+)sum=0;printf(请输

21、入第请输入第%d小组学生成绩小组学生成绩:,j);for(i=1;i=10;i+)scanf(%d,&score);sum=sum+score;avg=sum/10.0;printf(本小组本小组10个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);黄色的循环包含在玫瑰色的循环中本任务本任务while循环嵌套循环嵌套dowhile循环循环#includestdio.hmain()intscore,i,sum;floatavg;intj=1;while(j=4)sum=0;printf(请输入第请输入第%d小

22、组学生成绩小组学生成绩:,j);i=1;doscanf(%d,&score);sum=sum+score;i+;while(i100。#includemain()inti;i=1;while(i=100)if(i%3!=0)printf(“%3d”,i);i+;程序如下将将【例【例3 3】用用for语句来改进实现语句来改进实现v将将1100之间不能被之间不能被3整除的数输出。整除的数输出。#includemain()inti;for(i=1;i=100;i+)if(i%3!=0)printf(“%3d”,i);将将【例【例3 3】用用dowhile语句来改进实现。语句来改进实现。将将1100之

23、间不能被之间不能被3整除的数输出。整除的数输出。#include main()int i;i=1;doif(i%3!=0)printf(“%3d”,i);i+;while(i=100);【例【例4 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只,则由

24、题意可得:(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&y0)printf(“公鸡数为公鸡数为%d,母鸡数为母鸡数为%d,小鸡数为小鸡数为%dn,x,y,z);用双循环实现【例用双循环实现【例4 4】的百钱买百鸡。】的百钱买百鸡。分析:假设公鸡买x只,母鸡买y只,小鸡买z只,则:(1)y可以是1、2、333的一个值。(2)x可以是1、2、350的一个值。(3)

25、然后由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);【例【例5 5】输入二个正整数,求它们的最大公约数】输入二个正整数,求它们的最大公约数分析(1)若输入二个正整数分别为a,b,它的最大公约数为k,k的值应小于等于a,b中的一个相对小数;(2)然后进行a%k及b%k的运算,若它

26、们的余数为零,则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(最大公约数为:最大公约数为:%dn,k);程序的运行结果为:请输入二个正整数5 6最大公约数为1【例【例6 6】判断素数判断素数【例5】在数学课上,李老师要同学们对给定的任意正整数进行判断,看是否为素数,这个数学问题,用C语言该如何解决?分析:因为素数只能被1及本身整除,所以判

27、断一个大于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是素数是素数n,x);elseprintf(%d不是素数不是素数n,x);【例【例7 7】显示如下的下三角九九乘法表】显示如下的下三角九九乘法表12 43 6 94

28、8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81 分析:该乘法表要列出分析:该乘法表要列出11,21,22,31,32,33,99的值,乘数的范围是的值,乘数的范围是19,针对每一,针对每一个乘数,被乘数的范围是个乘数,被乘数的范围是1到它本身,到它本身,因此可以用两重循环解决问题。按乘因此可以用两重循环解决问题。按乘数组织外层循环,数组织外层循环,i表示从表示从19;按被;按被乘数组织内层循环,乘数组织内层循环,j表示从表示从1i,从,从

29、而确定每一行输出的内容。而确定每一行输出的内容。#includemain()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%-5d,i*j);printf(n);相关知识相关知识(一一)常见的循环嵌套常见的循环嵌套1.while循环嵌套循环嵌套while循环循环while()while()2.dowhile循环嵌套循环嵌套dowhile循环循环dodowhile();while();3.for循环嵌套循环嵌套for循环循环for(;)for(;)4.while循环嵌套循环嵌套dowhile循环循环while()dowhile();5.for循环嵌套循环

30、嵌套while循环循环for(;)while()6.dowhile循环嵌套循环嵌套for循环循环dofor(;)while();项目四项目四 举一反三举一反三【例8】程序功能:运行时输入10个数,然后分别输出其中的最大值、最小值。分析:(1)输入第一个数x,并假定第一个数既是十个数中的最大值max,也是十个数中的最小值min;(2)然后输入下一个数x,将最大值max及最小数min与x分别相比,若max小于x,则max=x;若min大于x,则min=x;(3)不断重复步骤(2),直到第10个数比完为止;类似10个壮士打擂台,第一个壮士先上场,认为自已是“老大”,然后第二个壮士再上场,与前面的“老

31、大”比武,赢者才是真的“老大”,一直到第十个壮士比完为止。#includevoidmain()floatx,max,min;inti;printf(请输入十个同学的成绩请输入十个同学的成绩:);for(i=1;imax)max=x;if(xmin)min=x;printf(最高分为最高分为%.1f,最低分为最低分为%.1fn,max,min);在if语句中比较两个数相等是“=”符号,而不是数学中的“=”符号,在C语言中“=”是赋值号。【例【例9 9】程序功能:运行时输入整数】程序功能:运行时输入整数n n,输出,输出n n各位数字之和。各位数字之和。(例如:(例如:n=1234n=1234,则

32、输出,则输出1010,n=-123n=-123,则输出,则输出6 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%1

33、0就可获取数字就可获取数字“3”;同理,要取得千位数的数字,只要执行23/10,即n=n/10,新的n的值将成为2,然后再执行n%10就可获取“2”;总结以上各步骤,可以发现,对任意的一个数总结以上各步骤,可以发现,对任意的一个数n,执行,执行n%10,再执行,再执行n=n/10,然后不断的重复,就可以一个一个获取个位数字、十位数字、百位数字然后不断的重复,就可以一个一个获取个位数字、十位数字、百位数字,所以可以用循环去执行以上的步骤,但是循环几次呢?仔细分析不难发现,所以可以用循环去执行以上的步骤,但是循环几次呢?仔细分析不难发现,经过若干次的执行经过若干次的执行n=n/10,则新的,则新的

34、n的值肯定会成为的值肯定会成为0,所以可以得出结论:,所以可以得出结论:循环条件是循环条件是n!=0。程序的流程图为:程序的流程图为:int n,s=0;int n,s=0;提示提示请输请输入一个数:入一个数:输输入一个数入一个数n nn=|n|n=|n|n0s=s+n%10;/将余数累加到将余数累加到s中中n=n/10;n=n/10;输输出出这这个数的个数的绝对值绝对值的各位数字的各位数字的和的和#include#includevoidmain()intn,s=0;printf(请输入一个数:请输入一个数:);scanf(%d,&n);n=fabs(n);while(n!=0)s=s+n%1

35、0;n=n/10;printf(“这个数的绝对值的各位数字的和为:这个数的绝对值的各位数字的和为:%dn,s);【例【例1010】编程求】编程求:s=3+33+333+3333+33333+333333+3333333:s=3+33+333+3333+33333+333333+3333333 +33333333 +33333333分析:可以将本题化为:分析:可以将本题化为:s=3(1+11+111+1111+11111+111111+1111111+11111111),所以只要求),所以只要求出了出了s=1+11+111+1111+11111+111111+1111111+11111111,然

36、后再执行,然后再执行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;f

37、or(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);分析:(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。【例【例1010】对】对x=1x=1,2 2,3 3,1010,求,求f(x)=x*x-5*x+sin(x)f(x)=x*x-5*x+sin(x)的最大值的最大值#in

38、clude#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);【例【例1111】编程找出】编程找出100999100999之间所有的水仙花数之间所有的水仙花数分析:本题的编程思路是用枚举法:即对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;

39、#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);分析:因为要计算前30项之和,可以用一个循环:(1)将a累加到s中,然后新的a变为sqrt(a);(2)重复多次(1)即可;当前30项的和算完后,则输出。【例【例1212】数列第一项为】数列第一项为8181,此后各项均为它前,此后各项均为它前1 1项的正平方根,项的正平方根,统计该数列前统计该数列前

40、3030项之和。项之和。#include#includevoidmain()floats=0,a=81,i;for(i=1;i=30;i+)s=s+a;a=sqrt(a);printf(“%fn”,s);运行结果运行结果:121.335854分析:用一个循环,将每一项累加到一个变量中,因为它需要有效位数保留10位,所以要定义一个双精度型变量。【例【例1313】编写程序,完成以下功能:计算】编写程序,完成以下功能:计算2 2的平方根、的平方根、3 3的平方根、的平方根、1010的平方根之和,要求计算结果具有小数点后的平方根之和,要求计算结果具有小数点后1010位有效位数。位有效位数。#inclu

41、de#includevoidmain()inti;doubles=0;for(i=2;i=10;i+)s+=sqrt(i);printf(%.10lfn,s);程序的运行结果为:21.46828781868【例【例1414】a a、b b、c c为区间为区间1,1001,100的整数,统计使等式的整数,统计使等式 c/(a*a+b*b)c/(a*a+b*b)=1=1成立的所有解的个数,(若成立的所有解的个数,(若a=1a=1、b=3b=3、c=10c=10是是1 1个解,则个解,则a=3a=3、b=1b=1、c=10 c=10 也是解)也是解)#includevoidmain()intn=0,

42、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【例【例1515】韩信点兵:相传汉高祖刘邦问大将军韩信现在统御兵士多】韩信点兵:相传汉高祖刘邦问大将军韩信现在统御兵士多少,韩信答,每少,韩信答,每3 3人一列余人一列余1 1人、人、5 5人一列余人一列余2 2人、人、7 7人一列余人一列余4 4人、人、1313人人一列余一列余6 6人、人、1717人一列余人一列余2 2人、人、1919人一

43、列余人一列余1010人。人。刘邦茫然而不知其刘邦茫然而不知其数。你呢?数。你呢?你是一位优秀的程序员,请你帮刘邦解决这一问题,韩信你是一位优秀的程序员,请你帮刘邦解决这一问题,韩信至少统御了多少兵士。至少统御了多少兵士。分析:这道题的本质就是;分析:这道题的本质就是;“一个正一个正整数,被整数,被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(韩信统领的兵数有:韩信统领的兵数有:%ldn,i);程序运行结果程序运行结果为:为:韩信统领的兵韩信统领的兵数有:数有:131072思考思考:v现在你对循环结构掌握的怎样?现在你对循环结构掌握的怎样?v多读多写,把多读多写,把C当做你的朋友,他也会将你当做你的朋友,他也会将你当做朋友!当做朋友!v加油!加油!

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!