Download presentation
Presentation is loading. Please wait.
1
项目三 学生成绩的分组汇总 项目要求 一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。 项目分析
项目三 学生成绩的分组汇总 项目要求 一个班中有四个小组,求本学期期中考试中每个小组数学成绩的总分及平均分。 项目分析 第一必须做到在一个小组中对学生数学成绩的平均分与总分进行计算;然后就是重复进行4次。所以,将这一项目分成二个任务介绍, 任务一是求一个小组学生成绩的总分及平均分; 任务二是求四个小组学生成绩的总分及平均分。
2
任务 1 求一个小组学生成绩的总分及平均分 一、问题情景
任务 1 求一个小组学生成绩的总分及平均分 一、问题情景 一个班进行了一次考试,现要输入第一小组学生的成绩,计算这一小组的总分与平均分,并按要求输出。 二、具体实现 #include "stdio.h" main() {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个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); 分析:如果本小组一共有十个同学,显然不可能定义十个变量 x1,x2,……x10,然后在程 序中表示成sum=x1+x2+x3+……+x10。 求一个小组的学生总成绩的步骤就是: 先输入第一个学生的成绩,然后将这个成绩加到总分中, 接下来,输入第二个学生的成绩,再将第二个学生的成绩加入到总分中, 不断重复,直到小组中最后一个同学的成绩输入并加入到总分为止。 重复执行就是循环。重复工作是计算机特别擅长的工作之一。 while(i<=10) {scanf(“%d”,&score); sum=sum+score; i=i+1; }
3
三、相关知识 i=1; while(i<=10) {scanf(“%d”,&score); sum=sum+score; i=i+1;
(一) 常见的三种循环语句 1. while循环 【语法】 (1)一般格式: while(循环继续条件) {循环体语句组;} (2)执行过程 1) 求解“循环继续条件”,如果其值为非0,则转 2);否则转3)。 2) 执行循环体语句组,然后转1)。 3) 退出while循环。 首先i的初值为1,显然1<=10,满足循环条件, 即输入score,然后将score加入到sum中, i=2;由于2<=10,还是满足循环条件, 执行第二次循环体。即输入score, 然后将score加入到sum中, i=3;…… 这样一直重复, 直到i=11,不再满足循环继续条件;从而跳出循环体。 所以这段程序的意思是输入10次score, 并将每一次输入的score加入到sum中。 i=1; while(i<=10) {scanf(“%d”,&score); sum=sum+score; i=i+1; }
4
任务情景中的程序及流程图 #include "stdio.h" main() {int score,i,sum=0; float avg;
printf(" 请输入本小组10个学生的成绩:"); while(i<=10) {scanf("%d",&score); sum=sum+score; i=i+1; } avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg);
5
while的进一步练习 【例3-1】本学期期末考试进行了三门课程的测试。成绩单下来后,8个室友兄弟要一比高低,这就要得到每个人三门课程的总分和平均分,用C语言实现之。 #include "stdio.h" main() {int i; float x,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\n",i,sum,avg); i=i+1; } 分析: (1)定义五个实型变量x,y,z,s和avg, 依次放每一名学生的三门课程成绩、 这三门课程的总成绩和平均分; (2)每次取出一名学生的三门课程成绩, 依次给x,y,z,然后再一起放到s中, 就可以得到该同学的三门课的总分和平均分。 (3)以上步骤重复执行8次。
6
【例3-2】用while语句求sum=1+2+3+……+100。
sum=sum+1; sum=sum+2; …… sum=sum+i sum=sum+100 所以,可以看成sum=sum+i重复了100次,而i恰好等于1~100 #include <stdio.h> main() {int i,sum=0; i=1; while(i<=100) {sum+=i; i++; } printf(“1+2+3+……+100的和为:%d\n”,sum); }
7
【例3-3】将1~100之间不能被3整除的数输出。 分析:定义变量i其初值为1,验证1是否能被3整除?若不能整除,则输出i,然后将i累加到2,再次验证2是否被被3整除?若不能整除,则输出i,这样一直重复,直到i值>100。 程序如下 #include <stdio.h> main() {int i; i=1; while(i<=100) {if(i%3!=0)printf(“%3d”,i); i++;} }
8
do …while语句 (1)一般形式: do {循环体语句组; }while(循环继续条件); (2)执行过程
循环变量赋初值 循环体语句组 while(循环继续条件);
9
求一个小组学生成绩的总分及平均分的程序可改写为:
#include "stdio.h" main() {int score,i,sum=0; float avg; i=1; printf(" 请输入本小组10个学生的成绩:"); do {scanf("%d",&score); sum=sum+score; i=i+1; } while(i<=10); avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); } do …while,总是先执行一次循环体, 然后再求循环继续条件,因此,无论循 环继续条件是否为“真”,循环体至少执行 一次; (2) do …while循环与while循环十分相似; (3)它们的主要区别是: while循环先判断循环条件再执行循环, 循环体可能一次也不执行, do …while循环先执行循环体, 然后再求循环继续条件, 循环体至少执行一次。
10
将例3-1用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",&x,&y,&z); sum=x+y+z; avg=sum/3; printf("第%d个同学的总分为%.2f,平均分%.2f\n",i,sum,avg); i=i+1; } while(i<=8); }
11
将例3-2用do …while语句来改进实现。
求sum=1+2+3+……+100。 #include <stdio.h> main() {int i,sum=0; i=1; do {sum+=i; i++; } while(i<=100); printf(“1+2+3+……+100的和为:%d\n”,sum); }
12
将例3-3用do …while语句来改进实现。
将1~100之间不能被3整除的数输出。 #include <stdio.h> main() {int i; i=1; do {if(i%3!=0)printf(“%3d”,i); i++;} while(i<=100); }
13
for语句 (1)一般形式: for(表达式1;表达式2;表达式3) 循环体语句 (2)执行过程 1) 先执行“表达式1”;
2) 然后判别“表达式2”,当“表达式2”的值为真时,则转3);否则转4)。 3) 执行循环体语句组,然后转2) 4) 退出for循环。 (1) “表达式1”为初始化表达式; (2) “表达式2”为条件表达式,是一个逻辑量,用于判断循环继续的条件是否成立, 其值为真时,循环继续,否则循环中止; (3) “表达式3”为修正表达式,一般为赋值表达式,用于定义循环变量的增值。
14
求一个小组学生成绩的总分及平均分的程序可改写为:
#include "stdio.h" main() {int score,i,sum=0; float avg; printf(" 请输入本小组10个学生的成绩:"); for(i=1;i<=10;i++) {scanf("%d",&score); sum=sum+score; } avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg);
15
for的进一步练习 #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",&x,&y,&z); sum=x+y+z; avg=sum/3; printf("第%d个同学的总分为%.2f,平均分%.2f\n",i,sum,avg); }
16
【例3-8】将例3-2用for语句来改进实现。 #include <stdio.h> main() {int i,sum=0;
for(i=1;i<=100;i++) {sum+=i; } /*由于循环体只有一条语句,所以可将“{sum+=i; }”的花括号省略*/ printf(“1+2+3+……+100的和为:%d\n”,sum); } 程序运行结果为: “1+2+3+……+100的和为:5050”
17
#include <stdio.h> main() {int i; for(i=1;i<=100;i++)
将1~100之间不能被3整除的数输出。 #include <stdio.h> main() {int i; for(i=1;i<=100;i++) {if(i%3!=0)printf(“%3d”,i);} /*由于循环体只有一条语句,所以可将“{if(i%3!=0)printf(“%3d”,i);}”的花括号省略*/ }
18
编程实现百钱买百鸡。 有一老大爷去集贸市场买鸡,他想用100元钱买100只鸡,而且要求所买的鸡有公鸡、母鸡、小鸡。已知公鸡2元一只,母鸡3元一只,小鸡0.5元一只。问老大爷要买多少只公鸡、母鸡、小鸡恰好花去100元钱,并且买到100只鸡? 分析 假设公鸡买x只,母鸡买y只,小鸡买z只,则由题意可得: x+y+z=100 x+3y+0.5z=100 y=1.5z-100 x= z #include <stdio.h> main() {int x,y,z; for(z=2;z<=100;z=z+2) { y=1.5*z-100; x= *z; if(x>0 && y>0) printf(“公鸡数为%d,母鸡数为 %d,小鸡数为%d\n",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循环的程序 如左:
19
知识扩展 (一)for 语句的多种表示方法 “表达式1”的作用是设置循环初始条件,“表达式1”省略后,
“表达式1” 和“表达式3”可以是一个简单的表达式,也可以是逗号表达式。 “表达式1”的作用是设置循环初始条件,“表达式1”省略后, 应在for语句前面设置循环初始条件。但“表达式1”后的分 号不能省略。 若省略“表达式2”,则不判断循环条件,认为循环条件始终为真, 循环将无终止地进行下去。一般用条件语句退出循环。 “表达式3”可省略,但程序必须在“循环体语句”中设置循环变量 增值,来修改循环条件,以确保循环能正常结束。如: 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; for(i=1;i<=10;i++) s=s+i; i=1; for(;i<=10;i++) s=s+i; for(i=1;i<=10;i++) s=s+i; for(i=1;i<=10;) {s=s+i; i++;}
20
终止对switch语句或循环语句的执行(跳出这两种语句),转移到其后的语句处执行。
(二)break语句 (1) break语句的一般形式 break; (2) break语句的作用 终止对switch语句或循环语句的执行(跳出这两种语句),转移到其后的语句处执行。 for(i=2;i<=x-1;i++) if(x%i==0)break; 如果x能被i(i=2,3,…,x-1)整除,则结束循环。 说明 在循环语句中,break语句常常和if语句一起使用,表示当条件满足时,立即 终止循环。注意break语句不是跳出if语句,而是跳出循环语句。 循环语句可以嵌套使用,break语句只能跳出(终止)其所在的循环,而不能 跳出多层循环。
21
【例3-11】输入二个正整数,求它们的最大公约数。
分析 #include <stdio.h> main() {int a,b,k; printf("请输入二个正整数"); scanf("%d%d",&a,&b); if(a<b)k=a; else k=b; while(k>=1) {if(a%k==0 && b%k==0)break; k--;} printf("最大公约数为:%d\n",k); } 程序的运行结果为: 请输入二个正整数5 6 最大公约数为1 (1)若输入二个正整数 分别为a,b,它的最大公 约数为k,k的值应小于等 于a,b中的一个相对小数; (2)然后进行a%k及b%k 的运算,若它们的余数为 零,则k就是最大公约数。 (3)若a%k及b%k中至少 有一个的余数不为零,则 k=k-1,然后再执行(2)。
22
判断素数 分析:因为素数只能被1及 #include <stdio.h> 本身整除,所以判断一个大 main()
【例3-12】在数学课上,李老师要同学们对给定的任意正整数进行判断, 看是否为素数,这个数学问题,用C语言该如何解决? 分析:因为素数只能被1及 本身整除,所以判断一个大 于2的正整数x是否为素数, 就让x按顺序除以i=2、3、 …、x-1,若x能被它们中 的任一个除尽,就可跳出 循环。因为此数一定不是 素数。所以判断x是不是素 数,就可以用i的值来衡量, 若i=x,则x一定是素数, 否则就不是素数。 #include <stdio.h> main() {int i,x; printf("请输入一个正整数"); scanf("%d",&x); for(i=2;i<=x-1;i++) if(x%i==0)break; if(i==x)printf("%d是素数\n",x); else printf("%d不是素数\n",x); }
23
任务 2 求每个小组学生成绩的总分及平均分 在任务1中,所解决的问题是:一个小组学生成绩的总分及平均分。
具体实现: #include "stdio.h" main() {int score,i,sum; float avg; int j=1; 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\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); j++; //下一个小组 程序运行结果 任务 2 求每个小组学生成绩的总分及平均分 定义变量及赋初值score,i,sum 定义平均分float avg; 定义变量j并赋初值1 //j代表小组数,先从第一小组开始 j<=4 赋初值i=1,sum=0 //每个小组刚开始总分为零 提示请输入本小组10个学生的成绩: i的初值为1 i<=10 输入成绩score sum=sum+score; //将成绩累加到总分sum中 i++; //学生人数增加1 计算平均分 输出总分及平均分 j++; 一、问题情景 一个班进行了一次考试,现要输入全班四个小组的学生成绩,计算每一小组的总分与平均分,并按要求输出。 分析 在任务1中,所解决的问题是:一个小组学生成绩的总分及平均分。 若现在一个班中有四个小组,现求每个小组的学生成绩的总分及 平均分。也就是将任务1重复进行四次,显然写四段程序是不科学 的,科学的方法是再嵌套一个循环。 一个循环体内又包含另一个完整的循环体,称为循环的嵌套,与if的嵌套相同, 内嵌的循环中还可以嵌套循环,这就是多层循环。内层的优先级比外层的高, 只有内层的执行完才能执行外层的,循环嵌套的要领对各种语言都是一样的。 三种循环(while循环、do…while循环、for循环)可以互相嵌套。
24
三、相关知识 4. while循环嵌套do … while循环 while( ) {… do {…} while( ); …}
5. for循环嵌套while循环 for( ; ; ) {…} … } 6. do … while循环嵌套for循环 } while( ); (一) 常见的循环嵌套 1. while循环嵌套while循环 while( ) {… {…} } 2. do … while循环嵌套do … while循环 do {…} while( ); } while( ); 3. for循环嵌套for循环 for( ; ; )
25
本任务用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); {scanf("%d",&score); sum=sum+score; i=i+1; //本小组学生数增加1 } while(i<=10); avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); j++; //下一个小组 } while(j<=4); } 黄色的循环包含在玫瑰色的循环中
26
本任务用for循环嵌套for循环: 黄色的循环包含在玫瑰色的循环中 #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",&score); sum=sum+score; } avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); 黄色的循环包含在玫瑰色的循环中
27
本任务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 {scanf("%d",&score); sum=sum+score; i++; }while(i<=10); avg=sum/10.0; printf("本小组10个学生的总分为:%d\n",sum); printf("本小组10个学生的平均分为:%.2f\n",avg); j++;} } 黄色的循环包含在玫瑰色的循环中 思考:用for循环嵌套while循环、do … while循环嵌套for循环编程解决任务2。
28
【例3-13】用双循环实现【例3-10】的百钱买百鸡。
程序如下: #include <stdio.h> 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, 小鸡数为%d\n",x,y,z); } 分析: 假设公鸡买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。
29
【例3-14】显示如下的下三角九九乘法表。 分析:该乘法表要列出1×1,2×1, 2×2,3×1,3×2,3×3…,9×9
的值,乘数的范围是1~9,针对每一 个乘数,被乘数的范围是1到它本身, 因此可以用两重循环解决问题。按乘 数组织外层循环,i表示从1~9;按被 乘数组织内层循环,j表示从1~i,从 而确定每一行输出的内容。 1 2 4 #include <stdio.h> main() {int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) {printf("%-5d",i*j);} printf("\n"); }
30
【例3-15】显示如下所示的图形 #include <stdio.h> main() {int i,j;
分析:题目要求的三角形由5行组成,因此程序中循环结构 的循环次数应为5次,每一次输出一行。而“输出一行”又进 一步分为三项工作。 (1) 输出若干个空格; (2) 输出若干个星号; (3) 回车换行,为新的一行的输出做准备。 现在的问题是,如何确定每一行应输出的空格数和字符”*”的数 目,以便分别通过循环来输出这两种字符。 * *** ***** ******* ********* #include <stdio.h> 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++) printf("*"); //输出”*”的数目 printf("\n"); //换行 }} 行号 应输出的空格 应输出的“*” 1 5 2 4 3 7 9 i 6-i 2*i-1
31
任务 3 举一反三 【例3-16】程序功能:运行时输入10个数,然后分别输出其中的最大值、最小值。 分析: (1)输入第一个数x,并假定第一
任务 3 举一反三 【例3-16】程序功能:运行时输入10个数,然后分别输出其中的最大值、最小值。 分析: (1)输入第一个数x,并假定第一 个数既是十个数中的最大值max, 也是十个数中的最小值min; (2)然后输入下一个数x,将最大 值max及最小数min与x分别相比, 若max小于x,则max=x;若min大 于x,则min=x; (3) 不断重复步骤(2),直到第 10个数比完为止;类似10个壮士 打擂台,第一个壮士先上场,认 为自已是“老大”,然后第二个壮 士再上场,与前面的“老大”比武, 赢者才是真的“老大”,一直到第 十个壮士比完为止。 #include <stdio.h> void main() { float x,max,min; int i; printf("请输入十个同学的成绩:") ; for(i=1;i<=10;i++) { scanf("%f",&x); if(i==1) { max=x;min=x;} if(x>max) max=x; if(x<min) min=x; } printf("最高分为%.1f,最低分为%.1f\n", max,min); 在if语句中比较两个数相等是“==” 符号,而不是数学中的“=” 符号, 在C语言中“=”是赋值号。
32
【例3-17】程序功能:运行时输入整数n,输出n各位数字之和。 (例如:n=1234,则输出10,n=-123,则输出6。
#include <stdio.h> #include <math.h> void main() { int n,s=0; printf("请输入一个数:"); scanf("%d",&n); n=fabs(n); while(n!=0) { s=s+n%10; n=n/10; } printf(“这个数的绝对值的各位数字的和为: %d\n",s); 程序的流程图为: 分析: 若n的值为2345,则 (1)个位数的取法是: (2)十位数的数字取法是: (3)百位数的数字的取法: (4)同理,要取得千位数的数字: 通过n%10就能获取个位数字“5” int n,s=0; 提示请输入一个数: 输入一个数n n=|n| n≠0 s=s+n%10; //将余数累加到s中 n=n/10; 输出这个数的绝对值的各位数字的和 如果能将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。
33
#include <stdio.h> void main() { int i,t=0; long s=0;
分析:可以将本题化为: s=3( ),所以只要求 出了s= ,然后再执行 s=s*3,就能达到题目的要求。 而s= 是一道累加题, 只要执行8次的s=s+t即可,只不过第一次循环中的t是1,第二次是11,第 三次是111,分析后项与前项的关系是:前项的10倍加1等于后项,即 t=10*t+1 #include <stdio.h> 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; printf(" =%ld\n",s); t=0; for(i=1;i<=8;i++) {t=10*t+1; s=s+t;}
34
编程:对x=1,2,3,……10,求f(x)=x*x-5*x+sin(x)的最大值
分析: (1)首先认为最大值是当x=1时的函数值,即max=1*1-5*1+sin(1); (2)然后计算出x=2时的f(x)与前面的max相比,如果max<f(x),则max=f(x) (3)将x=3,4,….10不断重复步骤(2); (4)输出max。 #include <stdio.h> #include <math.h> void main() { int x; float max; max=1*1-5*1+sin(1); for(x=2;x<=10;x++) if(max<x*x-5*x+sin(x))max= x*x-5*x+sin(x); printf("%f\n",max); }
35
编程找出100~999之间所有的水仙花数 分析: 本题的编程思路是用枚举法:即对100~999之间的每一个数,取出它的百位数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 <stdio.h> #include<math.h> void main() { int i,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("%d is a Armstrong number!\n",i); }
36
【例3-21】数列第一项为81,此后各项均为它前1项的正平方根,
统计该数列前30项之和。 分析: 因为要计算前30项之和,可以用一个循环: (1) 将a累加到s中,然后新的a变为sqrt(a); (2) 重复多次(1)即可;当前30项的和算完后,则输出。 #include <stdio.h> #include <math.h> void main() {float s=0,a=81,i; for(i=1;i<=30;i++) {s=s+a; a=sqrt(a);} printf(“%f\n”,s); } 运行结果:
37
【例3-22】编写程序,完成以下功能:计算2的平方根、3的平方 根、……10的平方根之和,要求计算结果具有小数点后10位有效 位数。
分析: 用一个循环,将每一项累加到一个变量中,因为它需要有效位数保留10位,所以要定义一个双精度型变量。 #include <stdio.h> #include <math.h> void main() { int i; double s=0; for(i=2;i<=10;i++) s+=sqrt(i); printf("%.10lf\n",s); } 程序的运行结果为:
38
【例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 也是解) #include <stdio.h> void main() { int n=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)==1 printf("%d",n); } 程序的运行结果为: 69
39
【例3-24】韩信点兵:相传汉高祖刘邦问大将军韩信现在统御兵士多
少,韩信答,每3人一列余1人、5人一列余2人、7人一列余4人、13人 一列余6人、17人一列余2人、19人一列余10人。 刘邦茫然而不知其 数。你呢? 你是一位优秀的程序员,请你帮刘邦解决这一问题,韩信 至少统御了多少兵士。 #include <stdio.h> void main() {long i; 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\n",i); } 分析:这道题的本质就是;“一个正 整数,被3除时余1,被5除时余2, 被7除时余4,被13除时余6,被17 除时余2,被19除时余10,求这个 数。”所以,我们可以从最小自然 数出发,一个一个地累加,如果它 满足条件,则退出循环。 程序运行结果为: 韩信统领的兵数有:131072
Similar presentations