《C语言及程序设计》实践参考——发奖金

返回:贺老师课程教学链接   项目要求


【项目5 - 发奖金】

(1)过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。例如:1995年11月8日=1995+11+8=2014。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元(在程序中可以用常量固定为一个数)。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。现在让我们来写一段程序算算都有哪些人得到了奖金?得到多少?请写出这个程序。

[参考解答]

#include <stdio.h>
#define LUCKY_M 2014     //幸运数字
#define POPULATION 128   //村民人数
int main( )
{
    int people[POPULATION];       //记录村民上报数据
    int luckyPeople[POPULATION];  //记录获奖者编号
    int nLucky=0;     //获奖者人数
    int i;
    for (i=0; i<POPULATION; i++)  //输入村民报的数字
    {
        scanf("%d",&people[i]);
    }
    for (i=0; i<POPULATION; i++)  //村民从0开始编号
    {
        if ( people[i] == LUCKY_M)
        {
            luckyPeople[nLucky] = i;
            nLucky ++;
        }
    }
    //输出获奖者编号及所获奖金数额
    for (i=0; i<nLucky; i++)
       printf("%d %d\n", luckyPeople[i], LUCKY_M/nLucky);
    return 0;
}


(2)有村民提出村长在幸运数字上做手脚,不公平。修改后的规则是:每人写一个1000以内的数字,谁写的数字与平均值最接近,M元的奖金就由谁拿,有多人与平均值差值相同,则均分。例如,参加的村民有5个人,报的数字分别为98、7、50、980、1,平均值为227(平均值也取成整数就行了),与98最接近,编号为0的村民得奖。这个游戏实际上有很强的政治学背景,一种策略是串通,大家都报一样的数,平分奖金;在每个人都想争取最大利益的前提下,各人报的数字又对结果都有影响,这里面包含一系列非常有意思的研究课题。

  提示:输入数据后,用一次循环求和,进而求出平均值;再一次循环,求出最小的差值;再一次循环,将差值最小的村民的编号放入幸运数组(因为可能不止一位,所以需要这个数组)。

[参考解答]

解答1:专门增加了一个数组minu[POPULATION]存放上报数据与平均的差值

#include <stdio.h>
#define MONEY 2014       //总奖金(单位:万元)
#define POPULATION 8   //村民人数
int main( )
{
    int people[POPULATION];       //记录村民上报数据
    int minu[POPULATION];         //记录每个人与平均值的差
    int luckyPeople[POPULATION];  //记录获奖者编号
    int nLucky=0;     //获奖者人数
    int sum=0, ave, min_minu=9999; //和、平均、差值、最小差值
    int i;
    for (i=0; i<POPULATION; i++)  //输入村民报的数字
    {
        scanf("%d",&people[i]);
        sum+=people[i];           //输入后立即求和
    }
    ave=sum/POPULATION;           //求平均
    for (i=0; i<POPULATION; i++)  //与平均数的差值保存到minu数组中,在同一循环中求出最小值
    {
        if(people[i]>ave)         //分情况,使差值保持非负
            minu[i]=people[i]-ave;
        else
            minu[i]=ave-people[i];
        if(min_minu>minu[i])    //需要时,修改最小差值
            min_minu=minu[i];
    }
    for (i=0; i<POPULATION; i++)  //找出最小差值的村民
    {
        if (minu[i] == min_minu)
        {
            luckyPeople[nLucky] = i;
            nLucky ++;
        }
    }
    //输出获奖者编号及所获奖金数额
    printf("平均值为%d,与平均值的最小差值是%d\n",ave,min_minu);
    printf("共有%d位获奖,他(们)是\n", nLucky);
    for (i=0; i<nLucky; i++)
    {
         printf("  第%d位,报数%d,得奖金%d\n", luckyPeople[i], people[luckyPeople[i]], MONEY/nLucky);
    }
    return 0;
}

解答2:只是为了求出最小差值,实际上不必为此保存每个人的差值,这是属于用过就可以“丢弃”的数据,这个参考解答中,不再专门增加数组

#include <stdio.h>
#define MONEY 2014       //总奖金(单位:万元)
#define POPULATION 8   //村民人数
int main( )
{
    int people[POPULATION];       //记录村民上报数据
    int luckyPeople[POPULATION];  //记录获奖者编号
    int nLucky=0;     //获奖者人数
    int sum=0, ave, minu, min_minu=9999; //和、平均、差值、最小差值
    int i;
    for (i=0; i<POPULATION; i++)  //输入村民报的数字
    {
        scanf("%d",&people[i]);
    }
    for (i=0; i<POPULATION; i++)  //求数字和
    {
        sum+=people[i];
    }
    ave=sum/POPULATION;           //求平均
    for (i=0; i<POPULATION; i++)  //求出最小差值
    {
        if(people[i]>ave)         //求差值
            minu=people[i]-ave;
        else
            minu=ave-people[i];
        if(min_minu>minu)    //需要时,修改最小差值
            min_minu=minu;
    }
    for (i=0; i<POPULATION; i++)  //找出最小差值的村民
    {
        if ((people[i]-ave == min_minu) || (ave-people[i] == min_minu))
        {
            luckyPeople[nLucky] = i;
            nLucky ++;
        }
    }
    //输出获奖者编号及所获奖金数额
    printf("平均值为%d,与平均值的最小差值是%d\n",ave,min_minu);
    printf("共有%d位获奖,他(们)是\n", nLucky);
    for (i=0; i<nLucky; i++)
    {
         printf("  第%d位,报数%d,得奖金%d\n", luckyPeople[i], people[luckyPeople[i]], MONEY/nLucky);
    }
    return 0;
}
运行图:






展开阅读全文

新手求教 C语言代码《奖计算》

04-03
题目内容: 企业发放的奖根据利润提成。利润低于或等于10万元时,奖可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时,高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖总数? 程序运行结果示例1: 789↙ bonus=78 程序运行结果示例2: 789516↙ bonus=36342 输入格式: "%ld" 输出格式:"bonus=%ld\n" ================================================================ #include <stdio.h> main() { int profit; double bonus=0; printf("please enter profit"); scanf( "%ld", &profit); if (profit >= 100){ printf("bonus=%ld\n", bonus = (profit -100) * 0.001 + 40*0.015 + 20*0.03 + 20 *0.05 + 10*0.075 + 10* 0.1);} else if (60 <= profit <= 100){ printf("bonus=%ld\n", bonus = (profit - 60) * 0.015 +20*0.03 + 20 *0.05 + 10*0.075 + 10* 0.1);} else if (40<= profit <= 60){ printf("bonus=%ld\n", bonus = (profit - 40) * 0.03 + 20 *0.05 + 10*0.075 + 10* 0.1);} else if (20 <=profit<=40){ printf("bonus=%ld\n", bonus = (profit - 20) * 0.05 + 10* 0.075 + 10* 0.1);} else if (10<=profit<=20){ printf("bonus=%ld\n", bonus = (profit - 10) * 0.075 + 10* 0.1);} else{ printf("bonus=%ld\n", bonus = profit * 0.1);} } 为什么这段代码,无论输入多少值,输出结果总是73832 甚至输入一段字母,结果也是这样
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值