课程主页在:http://blog.csdn.net/sxhelijian/article/details/13705597
【课后练习1】
完成下面“歌手大奖赛计分程序”的设计(至少一项要求):
1、在歌手大奖赛中,有10位评委为参赛的选手打分,分数为0~10分(运行时由人控制)。选手最后得分为去掉一个最高分和一个最低分后的平均值。请编写一个程序实现计分。
2、做一个更通用的计分程序,评委人数n可以在输入成绩之前输入,从而评委人数可以灵活调整。
3、进一步完善程序。一次运行程序只计算一位选手成绩太麻烦,要求输出当前选手的最后得分后,提示“按任意键继续,退出请选择N:”如果输入的不是N或n,可以为下一位选手计算成绩,从而一次运行程序可以支持多位选手的成绩计算。
提示1:参考例9.24——输入固定数目的数字、求和;参考例9.23——若干数求和、求最大、求最小。
提示2:可以按照下面的界面设计。
参考解答:
1、在歌手大奖赛中,有10位评委为参赛的选手打分,分数为0~10分(运行时由人控制)。选手最后得分为去掉一个最高分和一个最低分后的平均值。请编写一个程序实现计分。
#include<stdio.h> int main( ) { int i; float ave, score, sum, max, min; max=-1; //这儿有技巧,第1位评委给的成绩一定大于-1,max将变成第1个成绩 min=11; //同样和技巧,要学会这样“设圈套” sum=0; printf("请输入选手的成绩(0-10)\n"); for(i=1;i<=10;i++) { printf("第 %d 位评委给分:", i); scanf("%f",&score); sum+=score; if(max<score) max=score; if(min>score) min=score; } ave = (sum-max-min)/8; printf("减去一个最高分: %.2f\n", max); printf("减去一个最低分: %.2f\n", min); printf("当前选手的最后得分是: %.2f\n", ave); return 0; }
2 、做一个更通用的计分程序,评委人数 n 可以在输入成绩之前输入,从而评委人数可以灵活调整。
#include<stdio.h> int main( ) { int i,n; float ave, score, sum, max, min; max=-1; min=11; sum=0; printf("有几位评委:"); scanf("%d",&n); printf("请输入选手的成绩(0-10)\n"); for(i=1;i<=n;i++) { printf("第 %d 位评委给分:", i); scanf("%f",&score); sum+=score; if(max<score) max=score; if(min>score) min=score; } ave = (sum-max-min)/(n-2); printf("减去一个最高分: %.2f\n", max); printf("减去一个最低分: %.2f\n", min); printf("当前选手的最后得分是: %.2f\n", ave); return 0; }
3 、进一步完善程序。一次运行程序只计算一位选手成绩太麻烦,要求输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择 N :”如果输入的不是 N 或 n ,可以为下一位选手计算成绩,从而一次运行程序可以支持多位选手的成绩计算。
#include<stdio.h> int main( ) { int i,n; float ave, score, sum, max, min; char ch ='y'; printf("有几位评委:"); scanf("%d",&n); while(ch !='n'&&ch !='N') { max=-1; min=11; sum=0; printf("请输入选手的成绩(0-10)\n"); for(i=1; i<=n; i++) { printf("第 %d 位评委给分:", i); scanf("%f",&score); sum+=score; if(max<score) max=score; if(min>score) min=score; } ave = (sum-max-min)/(n-2); printf("减去一个最高分: %.2f\n", max); printf("减去一个最低分: %.2f\n", min); printf("当前选手的最后得分是: %.2f\n", ave); printf("按任意键继续,退出请输入N"); rewind(stdin);//清空输入缓冲区 ch=getchar(); } return 0; }
【课后练习2】 在下面的题目中,至少选择两道利用穷举法完成求解。1、换分币
用一元人民币兑换成1分、2分和5分硬币,有多少种不同的兑换方法?
提示:根据题意设i,j,k分别为兑换的1分、2分、5分硬币的枚数,则i,j,k的值应满足:i+j*2+k*5=100,根据取值范围构造循环解题即可。
参考解答:
#include <stdio.h> int main() { int i,j,k,count=0; for(i=0; i<=100; i++) for(j=0; j<=50; j++) for(k=0; k<=20; k++) { if(i+j*2+k*5==100) //判断是否正好兑换成功 { count++; printf("第%3d种: 1分钱%d枚,2分钱%d枚,5分钱%d枚\n", count, i, j, k); } } return 0; }
2、三色球问题
若一个口袋中放有12个球,其中有3个红球、3个白球和6个黒球。问从中任取8个共有多少种不同的颜色搭配?
提示:设任取的红球个数为i,白球个数为j,则黒球个数为8-i-j,根据题意红球和白球个数的取值范围是0~3,在红球和白球个数确定的条件下,黒球个数取值应为8-i-j<=6。
参考解答:
#include <stdio.h> int main () { int red,white,black; printf("不同的颜色搭配有:\n"); for(red=0; red<=3; red++) for(white=0; white<=3; white++) { black=8-red-white; if(black<=6) { printf("红球:%d, 白球: %d, 黑球: %d。\n", red, white, black); } } return 0; }
3、猜数字
在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。请设计程序求出"都、要、学、C"4个符号分别代表的数字。
提示:让计算机解奥数题。穷举"都、要、学、C"4个符号分别代表的数字(从0到9),然后进行组合,如果组合起来符合规则(不同的符号代表不同的数字,相同的符号代表相同的数字,且使等式成立),则为正解。
计算结果为:“都:1 要:4 学:6 C:7”或者“都:1 要:5 学:0 C:2”
参考解答:
#include <stdio.h> int main() { int dou,yao,xue,c,s;//变量这样取,比有些题解上用i,j,p,q之类的要清晰得多 for(dou=1; dou<3; dou++) for(yao=0; yao<10; yao++) { for(xue=0; xue<10; xue++) for(c=0; c<10; c++) //一个技巧:表示两两不同可以如下表达 if((dou-yao)*(dou-xue)*(dou-c)*(yao-xue)*(yao-c)*(xue-c)!=0) { s=4*c+3*xue*10+2*yao*100+dou*1000; if(2008==s) printf("都:%d 要:%d 学:%d C:%d\n",dou,yao,xue,c); } } return 0; }
4、辨别数字
在一起经济犯罪案件中,有一张可疑发票受到了污损。如下图:
能够辨别数量为※9,单价为※3※.00元,而总金额是83※2.00元,其中※处为1个数字,由于被涂改无法辨认。这难不倒学过编程的法133的同学,请编程找出※表示哪个数字。
计算结果为:数量:19,单价:438,金额:8322
参考解答:
#include<stdio.h> int main() { int a,b,c,d; for(a=1; a<=9; a++) { for(b=1; b<=9; b++) { for(c=0; c<=9; c++) { for(d=0; d<=9; d++) { if (((a*10+9)*(b*100+30+c))==(8302+d*10)) { printf("数量:%d,单价量:%d,金额:%d\n",a*10+9,b*100+30+c,8302+d*10); } } } } } return 0; }