C语言程序设计项目三

上传人:壹****1 文档编号:568506994 上传时间:2024-07-25 格式:PPT 页数:39 大小:602.50KB
返回 下载 相关 举报
C语言程序设计项目三_第1页
第1页 / 共39页
C语言程序设计项目三_第2页
第2页 / 共39页
C语言程序设计项目三_第3页
第3页 / 共39页
C语言程序设计项目三_第4页
第4页 / 共39页
C语言程序设计项目三_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《C语言程序设计项目三》由会员分享,可在线阅读,更多相关《C语言程序设计项目三(39页珍藏版)》请在金锄头文库上搜索。

1、项目三项目三学生成绩的分组汇总学生成绩的分组汇总项目要求项目要求一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。项目分析项目分析第一必须做到在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项目分成二个任务介绍,任务一是求一个小组学生成绩的总分及平均分;任务二是求四个小组学生成绩的总分及平均分。分析:如果本小组一共有十个同学,显然不可能定义十个变量x1,x2,x10,然后在程序中表示成sum=x1+x2+x3+x10。求一个小组的学生总成绩的步骤就是:先输入第一个学生的成绩,然后将这个成绩加到总分中,接下来,输入第二个学生的成绩,再将第二

2、个学生的成绩加入到总分中,不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。重复执行就是循环。重复工作是计算机特别擅长的工作之一。任务任务1求一个小组学生成绩的总分及平均分求一个小组学生成绩的总分及平均分一、问题情景一、问题情景一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。二、具体实现二、具体实现#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(请输入本小组10个学生的成绩:);while(i=10)scanf(%d,&score);sum=sum+score;i=i+1;

3、avg=sum/10.0;printf(本小组10个学生的总分为:%dn,sum);printf(本小组10个学生的平均分为:%.2fn,avg);while(i=10)scanf(“%d”,&score);sum=sum+score;i=i+1;三、相关知识三、相关知识(一一)常见的三种循环语句常见的三种循环语句1.while循环循环【语法语法】(1)一般格式:一般格式:while(循环继续条件循环继续条件)循环体语句组循环体语句组;(2)执行过程执行过程1)求解求解“循环继续条件循环继续条件”,如果其值为非,如果其值为非0,则转,则转2);否则转;否则转3)。2)执行循环体语句组,然后转执

4、行循环体语句组,然后转1)。3)退出退出while循环。循环。i=1;while(i=10)scanf(“%d”,&score);sum=sum+score;i=i+1;首先i的初值为1,显然1=10,满足循环条件,即输入score,然后将score加入到sum中,i=2;由于2=10,还是满足循环条件,执行第二次循环体。即输入score,然后将score加入到sum中,i=3;这样一直重复,直到i=11,不再满足循环继续条件;从而跳出循环体。所以这段程序的意思是输入10次score,并将每一次输入的score加入到sum中。任务情景中的程序及流程图任务情景中的程序及流程图#includest

5、dio.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);while的进一步练习的进一步练习【例3-1】本学期期末考试进行了三门课程的测试。成绩单下来后,8个室友兄弟要一比高低,这就要得到每个人三门课程的总分和平均分,用C语言实现之。分析:(1)定义五个实型变量x,y,z,s和avg

6、,依次放每一名学生的三门课程成绩、这三门课程的总成绩和平均分;(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);sum=x+y+z;avg=sum/3;printf(第%d个同学的总分为%.2f,平均分%.2fn,i,sum,avg);i=i+1;【例例3-2】用用while语句求语句求s

7、um=1+2+3+100。分析:求sum=1+2+3+100,可以分解成:sum=0;sum=sum+1;sum=sum+2;sum=sum+isum=sum+100所以,可以看成sum=sum+i重复了100次,而i恰好等于1100#includemain()inti,sum=0;i=1;while(i100。#includemain()inti;i=1;while(i=100)if(i%3!=0)printf(“%3d”,i);i+;程序如下dowhile语句语句(1)一般形式:do循环体语句组;while(循环继续条件);(2)执行过程1)执行do后面的循环体语句组;2)求解while后

8、面的“循环继续条件”,如果其值为非0,则转1);否则转3)。3)退出while循环。循环变量赋初值循环体语句组while(循环继续条件);求一个小组学生成绩的总分及平均分的程序可改写为:求一个小组学生成绩的总分及平均分的程序可改写为:#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个学生的总分为:%dn,sum);printf(本小组10个学生

9、的平均分为:%.2fn,avg);(1)dowhile,总是先执行一次循环体,然后再求循环继续条件,因此,无论循环继续条件是否为“真”,循环体至少执行一次;(2)dowhile循环与while循环十分相似;(3)它们的主要区别是:while循环先判断循环条件再执行循环,循环体可能一次也不执行,dowhile循环先执行循环体,然后再求循环继续条件,循环体至少执行一次。将例将例3-1用用dowhile语句来改进实现。语句来改进实现。求求8个室友兄弟每个人三门课程的总分和平均分个室友兄弟每个人三门课程的总分和平均分#includestdio.hmain()inti;floatx,y,z,sum,av

10、g;i=1;doprintf(请输入第请输入第%d个同学三门课的成绩个同学三门课的成绩,i);scanf(%f%f%f,&x,&y,&z);sum=x+y+z;avg=sum/3;printf(第第%d个同学的总分为个同学的总分为%.2f,平均分平均分%.2fn,i,sum,avg);i=i+1;while(i=8);将例将例3-2用用dowhile语句来改进实现。语句来改进实现。求sum=1+2+3+100。#includemain()inti,sum=0;i=1;dosum+=i;i+;while(i=100);printf(“1+2+3+100的和为:%dn”,sum);将例将例3-3用

11、用dowhile语句来改进实现。语句来改进实现。将将1100之间不能被之间不能被3整除的数输出。整除的数输出。#includemain()inti;i=1;doif(i%3!=0)printf(“%3d”,i);i+;while(i=100);for语句语句(1)一般形式:for(表达式1;表达式2;表达式3)循环体语句(2)执行过程1)先执行“表达式1”;2)然后判别“表达式2”,当“表达式2”的值为真时,则转3);否则转4)。3)执行循环体语句组,然后转2)4)退出for循环。(1)“表达式1”为初始化表达式;(2)“表达式2”为条件表达式,是一个逻辑量,用于判断循环继续的条件是否成立,其

12、值为真时,循环继续,否则循环中止;(3)“表达式3”为修正表达式,一般为赋值表达式,用于定义循环变量的增值。求一个小组学生成绩的总分及平均分的程序可改写为:求一个小组学生成绩的总分及平均分的程序可改写为:#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个学生的平均分为:%.2fn,avg);for的进一

13、步练习的进一步练习【例3-7】将例3-1用for语句来改进实现。(求八位室友每个人三门课的总分及平均分)#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);【例例3-8】将例将例3-2用用for语句来改进实现。语句来改进实现。求sum=1+2+3+100。#in

14、cludemain()inti,sum=0;for(i=1;i=100;i+)sum+=i;/*由于循环体只有一条语句,所以可将由于循环体只有一条语句,所以可将“sum+=i;”的花括号省略的花括号省略*/printf(“1+2+3+100的和为:%dn”,sum);程序运行结果为:“1+2+3+100的和为:5050”将例将例3-3用用for语句来改进实现。语句来改进实现。v将将1100之间不能被之间不能被3整除的数输出。整除的数输出。#includemain()inti;for(i=1;i=100;i+)if(i%3!=0)printf(“%3d”,i);/*由于循环体只有一条语句,所以可

15、将由于循环体只有一条语句,所以可将“if(i%3!=0)printf(“%3d”,i);”的花括号的花括号省略省略*/编程实现百钱买百鸡。编程实现百钱买百鸡。有一老大爷去集贸市场买鸡,他想用100元钱买100只鸡,而且要求所买的鸡有公鸡、母鸡、小鸡。已知公鸡2元一只,母鸡3元一只,小鸡0.5元一只。问老大爷要买多少只公鸡、母鸡、小鸡恰好花去100元钱,并且买到100只鸡?分析分析 x+y+z=100x+3y+0.5z=100 y=1.5z-100x=200-2.5z假设公鸡买x只,母鸡买y只,小鸡买z只,则由题意可得:(1)当z=2时,计算y与x的值(2)当z=4时,计算y与x的值(3)当z=

16、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);知识扩展知识扩展(一)(一)for语句的多种表示方法语句的多种表示方法(1)for语句可省略语句可省略“表达式表达式1”。(2)for语句可省略语句可省略“表达式表达式2”。(3)for语句可省略语句可省略“表达式表达式3”。(4)for语句可省略语句可省略“表达式表达式1”和和“表达式表

17、达式3”。(5)“表达式表达式1”和和“表达式表达式3”可以是一个简单的表达式,也可以是逗可以是一个简单的表达式,也可以是逗号表达式。号表达式。for(i=1;i=10;i+)s=s+i;i=1;for(;i=10;i+)s=s+i;“表达式表达式1”的作用是设置循环初始条件,的作用是设置循环初始条件,“表达式表达式1”省略后,省略后,应在应在for语句前面设置循环初始条件。但语句前面设置循环初始条件。但“表达式表达式1”后的分后的分号不能省略。号不能省略。若省略“表达式2”,则不判断循环条件,认为循环条件始终为真,循环将无终止地进行下去。一般用条件语句退出循环。“表达式表达式3”可省略,但程

18、序必须在可省略,但程序必须在“循环体语句循环体语句”中设置循环变量中设置循环变量增值,来修改循环条件,以确保循环能正常结束。如:增值,来修改循环条件,以确保循环能正常结束。如:for(i=1;i=10;i+)s=s+i;for(i=1;i=10;)s=s+i;i+;for(i=1;i=10;i+)s=s+i;i=1;for(;i=10;)s=s+i;i+;如实现1+2+3+100的和的for语句可以写为:for(sum=0,i=1;i=100;i+)sum=sum+i;(二)(二)break语句语句(1)break语句的一般形式语句的一般形式break;(2)break语句的作用语句的作用终止

19、对switch语句或循环语句的执行(跳出这两种语句),转移到其后的语句处执行。在循环语句中,break语句常常和if语句一起使用,表示当条件满足时,立即终止循环。注意break语句不是跳出if语句,而是跳出循环语句。循环语句可以嵌套使用,break语句只能跳出(终止)其所在的循环,而不能跳出多层循环。说明for(i=2;i=x-1;i+)if(x%i=0)break;如果如果x能被能被i(i=2,3,x-1)整除,)整除,则结束循环。则结束循环。【例例3-11】输入二个正整数,求它们的最大公约数。输入二个正整数,求它们的最大公约数。分析(1)若输入二个正整数分别为a,b,它的最大公约数为k,k

20、的值应小于等于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(最大公约数为:%dn,k);程序的运行结果为:请输入二个正整数56最大公约数为1判断素数判断素数【例3-12】在数学课上,李老师要同学们对给定的任意正整数进行判断,看是否为素数,这个数学问题,用C语言该如何解决?

21、分析:因为素数只能被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是素数n,x);elseprintf(%d不是素数n,x);任务任务2求每个小组学生成绩的总分及求每个小组学生成绩的总分及平均分平均分一、问题

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

23、ore,i,sum;floatavg;intj=1;while(j=4)sum=0;i=1;printf(请输入第请输入第%d小组学生成绩小组学生成绩:,j);while(i=10)scanf(%d,&score);sum=sum+score;i=i+1;/本小组学生数增加本小组学生数增加1avg=sum/10.0;printf(本小组本小组10个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);j+;/下一个小组下一个小组定义变量及赋初值score,i,sum定义平均分floatavg;定义变量j并赋初值1

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

25、对各种语言都是一样的。只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。三种循环三种循环(while循环、循环、dowhile循环、循环、for循环循环)可以互相嵌套。可以互相嵌套。三、相关知识三、相关知识(一一)常见的循环嵌套常见的循环嵌套1.while循环嵌套循环嵌套while循环循环while()while()2.dowhile循环嵌套循环嵌套dowhile循环循环dodowhile();while();3.for循环嵌套循环嵌套for循环循环for(;)for(;)4.while循环嵌套循环嵌套dowhile循环循环while()dowhile();5.for循环嵌套

26、循环嵌套while循环循环for(;)while()6.dowhile循环嵌套循环嵌套for循环循环dofor(;)while();本任务用本任务用dowhile循环嵌套循环嵌套dowhile循环的程序解决:循环的程序解决:#includestdio.hmain()intscore,i,sum;floatavg;intj=1;dosum=0;i=1;printf(请输入第请输入第%d小组学生成绩小组学生成绩:,j);doscanf(%d,&score);sum=sum+score;i=i+1;/本小组学生数增加本小组学生数增加1while(i=10);avg=sum/10.0;printf(本

27、小组本小组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(请输入第请输入第%d小组学生成绩小组学生成绩:,j);for(i=1;i=10;i+)scanf(%d,&score);sum=sum+score;avg=s

28、um/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小组学生成绩小组学生成绩:,j);i=1;doscanf(%d,&score);sum=sum+score;i+;while(i=10);avg=sum/1

29、0.0;printf(本小组本小组10个学生的总分为:个学生的总分为:%dn,sum);printf(本小组本小组10个学生的平均分为:个学生的平均分为:%.2fn,avg);j+;黄色的循环包含在玫瑰色的循环中思考:用思考:用for循环嵌套while循环、dowhile循环嵌套for循环编程解决任务2。【例例3-13】用双循环实现用双循环实现【例例3-10】的百钱买百鸡。的百钱买百鸡。分析:假设公鸡买x只,母鸡买y只,小鸡买z只,则:(1)y可以是1、2、333的一个值。(2)x可以是1、2、350的一个值。(3)然后由y及x,显然可解得z=100-x-y。(4)如果所花的钱刚好是100,则

30、输出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);【例例3-14】显示如下的下三角九九乘法表。显示如下的下三角九九乘法表。12436948121651015202561218243036714212835424981624324048566491827364554637281分析:该乘法表要列出分析:该乘法表要列出11,21,22,31,32,33,99的值,乘数的范围是的值,

31、乘数的范围是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);【例例3-15】显示如下所示的图形显示如下所示的图形*分析:题目要求的三角形由5行组成,因此程序中循环结构

32、的循环次数应为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(n);/换行任务任务3举一反三

33、举一反三【例3-16】程序功能:运行时输入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;print

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

35、要取得千位数的数字:通过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,然后不断的

36、重复,就可以一个一个获取个位数字、十位数字、百位数字然后不断的重复,就可以一个一个获取个位数字、十位数字、百位数字,所以可以用循环去执行以上的步骤,但是循环几次呢?仔细分析不难发现,所以可以用循环去执行以上的步骤,但是循环几次呢?仔细分析不难发现,经过若干次的执行经过若干次的执行n=n/10,则新的,则新的n的值肯定会成为的值肯定会成为0,所以可以得出结论:,所以可以得出结论:循环条件是循环条件是n!=0。程序的流程图为:程序的流程图为:int n,s=0;int n,s=0;提示提示请输请输入一个数:入一个数:输输入一个数入一个数n nn=|n|n=|n|n0s=s+n%10;/将余数累加到

37、将余数累加到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%10;n=n/10;printf(“这个数的绝对值的各位数字的和为:这个数的绝对值的各位数字的和为:%dn,s);编程求编程求:s=3+33+333+3333+33333+333333+3333333+33333333分析:可以将本题化为:分析:可以将本题化为:s=3(1+11+111+1111

38、+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

39、倍加倍加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=%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

40、);(4)输出max。编程:对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);编程找出编程找出100999之间所有的水仙花数之间所有的水仙花数分析:本题的编程思路是用枚举法:即对100999之间的每一个数,取出它的百位数a,十位数b,个位数c,如果a*a*a+b*b*b+c*c*c的值等于它自身,则输出这个数。显然a

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

42、列前30项之和。#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位,所以要定义一个双精度型变量。【例3-22】编写程序,完成以下功能:计算2的平方根、3的平方根、10的平方根之和,要求计算结果具有小数点后10位有效位数。#include#includevoidmain()inti;doubles=0;for(i=2;i=10;i+)s+=sqrt(i);pr

43、intf(%.10lfn,s);程序的运行结果为:21.46828781868【例3-23】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【例例3-24】韩信点兵:相传汉高祖刘邦

44、问大将军韩信现在统御兵士多韩信点兵:相传汉高祖刘邦问大将军韩信现在统御兵士多少,韩信答,每少,韩信答,每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(韩信统领的兵数有:韩信统领的兵数有:%ldn,i);程序运行结果程序运行结果为:为:韩信统领的兵韩信统领的兵数有:数有:131072

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号