C++解决歌星大赛问题

歌星大赛是一个 经典计算机比赛题目.

题目描述:

在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现

问题分析

这道题难度较低,实现思路:

  1. 获取分数,可以手动输入,也可以使用随机数(这里采用手动输入),分数存放在一个数组里,数据类型采用浮点型。
  2. 求出最高分和最低分。
  3. 求出总分,然后用总分减去最高分和最低分再除以8,得出选手得分

代码实现:

#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;

//设立冒泡排序函数
 void changenumber(int a[],int n){
        int temp = 0;                                //设置中间变量
       for (int i = n-1; i > 0; --i)        //从后往前判断
        {
         for (int j = 0; j < i; ++j)               //判断i以前两个数值的大小,最终把这次循环最大的数放到i的位置上去
           {
               if (a[j + 1] < a[j])
               {
                   temp = a[j];
                   a[j] = a[j + 1];
                   a[j + 1] = temp;
               }
           }
       }
 }


int main()
{

    int     Singer=0;

    cout<<"参加比赛的歌手人数为 :";
	cin>>Singer;
	int     iReferee[Singer][10];//存取每个选手的评委分数
	int     sScore[Singer][3];//存取每个选手的最高分最低分以及最终得分
	int     arr[Singer];//保存每个选手的最终得分
	int     n=Singer;

	const	int	iNumber	=	10;

    cout<<"---------------比赛开始---------------"<<endl;
    int j=0;
    while(n--){
        int		iScore	 = 0;
        int		iMaxScore= 0;
        int		iMinScore= 100;
        int		iAverage = 0;
        cout<<"歌手"<<j+1<<"演唱结束,开始评分:"<<endl;


        for (int i=0; i<iNumber; i) {
                cout<<"裁判 "<<i+1<<" 给出分数 : ";
                cin>>iScore;
                if (iScore<=100&&iScore>=0){
                    iReferee[j][i] = iScore;

                    iAverage += iScore;

                    if (iScore > iMaxScore)
                        iMaxScore = iScore;
                    if (iScore < iMinScore)
                        iMinScore = iScore;
                    i++;
                }
                else{
                    cout<<"评分有误,请输入1~100之间的评分:"<<endl;
                    continue;
                }
	}

	cout<<"删除最高分 : "<<iMaxScore<<endl;
	cout<<"删除最低分 : "<<iMinScore<<endl;

	iAverage = (iAverage - iMaxScore - iMinScore)/(iNumber - 2);
	cout<<"        最终得分 : "<<iAverage<<endl;

	//-------------------------------------------------
	// 在十个评委中找出最公平即评分最接近平均分和最不
	// 公平即与平均分的差距最大的评委.
	cout<<"---------------筛选评委---------------"<<endl;
	// 最不公平的
	int		iUnfair	=	0; //获取最不公平评委的评分与平均分的差
    cout<<"最不公平的评委 : "<<endl;
	if( fabs(iMaxScore - iAverage) >=fabs(iMinScore - iAverage)){
        iUnfair	=	fabs(iMaxScore - iAverage);
	}
	else if (fabs(iMaxScore - iAverage) < fabs(iMinScore - iAverage)){
        iUnfair	=	fabs(iMinScore - iAverage);
	}


	for (int i=0; i<iNumber; ++i) {
		if (fabs(iReferee[j][i]-iAverage) == iUnfair)
			cout<<"评委 "<<i+1<<" : "<<iReferee[j][i]<<endl;
	}

	//-------------------------------------------------
	// 最公平的
	int iFair=100;//获取最公平的评委的评分与平均分的差
	cout<<"最公平的评委 : "<<endl;

	for(int i=0;i<iNumber;++i){
        if(fabs(iReferee[j][i]-iAverage) < iFair) iFair=fabs(iReferee[j][i]-iAverage);
	}

    for (int i=0; i<iNumber; ++i) {
		if (fabs(iReferee[j][i]-iAverage) == iFair)
			cout<<"评委 "<<i+1<<" : "<<iReferee[j][i]<<endl;
	}

	sScore[j][0]=iMaxScore;
	sScore[j][1]=iMinScore;
	sScore[j][2]=iAverage;
	arr[j]=iAverage;
	j++;
    cout<<"---------------评分结束---------------"<<endl;
    }
    cout<<"---------------比赛结束---------------"<<endl;
    cout<<"-------------得分排名如下-------------"<<endl;

    changenumber(arr,Singer);

    for(int n=Singer-1;n>=0;n--){
        for(int i=0;i<Singer;i++){
            if(sScore[i][2]==arr[n]) cout<<"歌手 "<<i+1<<" 得分 "<<arr[n]<<endl;
        }
    }

    return 0;
}

目录

题目描述:

问题分析

求出总分,然后用总分减去最高分和最低分再除以8,得出选手得分

代码实现:

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值