您的位置:首页 > 理论基础

法133计算机科学课第13周实践题目及参考解答

2013-11-18 21:01 344 查看
课程主页在:/article/1405311.html

  【课后练习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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: