/*
Copyright (c) 2016, 烟台大学计算机学院
 All rights reserved.
文件名称:first.cpp
作    者:颜丙齐
完成日期:2017年 1 月 6 日
版 本 号:v1.0


题目描述
  歌手大赛计分系统
输入
 评委个数和每位评委的打分
输出
 选手的平均得分
样例输入
  4
  1
  2
  3
  4
样例输出
 这是歌手大赛的计分系统!!!
制作人:颜丙齐
指导老师:贺利坚老师
程序说明:该程序计算各个选手的得分!!!
计分方式:去掉一个最高分和一个最低分然后取平均值!!!
输入的评委打分为0~10之间的数,请大家一定不要输错哟!!!
请大家开始使用吧!!!
请输入评委的人数;4
请输入第1位评委的给分为:1
请输入第2位评委的给分为:2
请输入第3位评委的给分为:3
请输入第4位评委的给分为:4
减去一个最高分4.00,和一个最低分1.00
该选手的最终得分为:2.50
***************************************SUCCESS**********************************
按N退出,其他键继续:
 */
#include <stdio.h>
#include <stdlib.h>
void view();//输出关于程序的说明
void getscore(double *,int);//将输入数组中的数保存到数组中.两个参数:数组和数组长度。
void set_score_online(double *,int );//将数组利用冒泡排序法,将最大的和最小的数排列。两个参数:数组和数组长度。
void ave_score(double *,int );//将数组中的1——n-1个元素求平均值,并将求的平均值赋值给数组的第n项,去掉第一个和最后一个。两个参数:数组和数组长度。
void calScore(int n);//计算成绩的最终函数,通过调用其他函数实现
int main()
{
    system("color 1b");//控制输出面板的颜色
    view();
    int n;//评委的人数
    char button;//控制是否结束
    printf("请输入评委的人数:");
    scanf("%d",&n);
    do
    {
        calScore(n);
        printf("***************************************SUCCESS**********************************");
        printf("按N退出,其他键继续:\n");
        getchar();
        scanf("%c",&button);
    }
    while(button!='N'&&button!='n');//循环一次是计算的一个选手的分数

    return 0;
}
/*************************************************************
功能描述:输出程序的说明
输入参数:无
返 回 值:无
其他说明:输出几句话,解释该程序
*************************************************************/
void view()
{
    printf("这是歌手大赛的计分系统!!!\n");
    printf("制作人:颜丙齐\n");
    printf("指导老师:贺利坚老师\n");
    printf("程序说明:该程序计算各个选手的得分!!!\n");
    printf("计分方式:去掉一个最高分和一个最低分然后取平均值!!!\n");
    printf("输入的评委打分为0~10之间的数,请大家一定不要输错哟!!!\n");
    printf("请大家开始使用吧!!!\n");
}
/*************************************************************
功能描述:计算一个选手的分数
输入参数:无
返 回 值:无
其他说明:通过调用其他函数实现其功能
*************************************************************/
void calScore(int n)
{
    double score[20];//定义一个一维数组来存放分数
    getscore(score,n);
    set_score_online(score,n);
    ave_score(score,n);
    printf("减去一个最高分%.2f,和一个最低分%.2f\n",score[n-1],score[0]);
    printf("该选手的最终得分为:%.2f\n",score[n]);
}
/*************************************************************
功能描述:得到各个评委的评分
输入参数:s-一个指针,是传递的一个数组
           n-数组的长度
返 回 值:无
其他说明:通过使用指针来给数组赋值
*************************************************************/
void getscore(double *s,int n)
{
    int i;
    int k;
    for(i=0; i<n; i++)
    {
        k=0;
        do
        {
            if(k>=1)
            {
                printf("您的输入有误请重新输入!!!\n");
            }
            printf("请输入第%d位评委的给分为:",i+1);
            scanf("%lf",&s[i]);
            k++;

        }
        while(s[i]>10.0);


    }
    return ;
}
/*************************************************************
功能描述:将数组中的最高分和最低分找出来,分别放在数组的末尾和开头,便于后面操作
输入参数:s-一个指针,是传递的一个数组
           n-数组的长度
返 回 值:无
其他说明:使用的是冒泡排序法
*************************************************************/
void set_score_online(double *s,int n)
{
    int i,middle;
    for(i=0; i<n-1; i++)
    {
        if(s[i]>s[i+1])
        {
            middle=s[i];
            s[i]=s[i+1];
            s[i+1]=middle;
        }
    }
    for(i=n-1; i>0; i--)
    {
        if(s[i]<s[i-1])
        {
            middle=s[i];
            s[i]=s[i-1];
            s[i-1]=middle;
        }
    }
    return;
}
/*************************************************************
功能描述:将数组中的第2~(n-1)个元素加起来,并求平均值
输入参数:s-一个指针,是传递的一个数组
           n-数组的长度
返 回 值:无
其他说明:将求得的平均值放在数组的第(n+1)个位上
*************************************************************/
void ave_score(double *s,int n)
{
    int i;
    double  ave=0;
    for(i=1; i<n-1; i++)
    {
        ave=ave+s[i];
    }
    ave=ave/(n-2);
    s[n]=ave;
    return;
}

学习心得:这个程序好久就写完了,之前也是用的指针,不过一直有警告,现在也是用的指针,不过没有警告了,有点不理解。这个是完全按要求做的。做之前感觉很难,但是做完之后发现也没多少东西。