C语言的歌手比赛评选程序

【问题详述】
某地举办“我喜爱的歌手”现场比赛,比赛评选程序为该赛事提供名次统计和查询。比赛共有N(N=30)位参赛者,按照演出顺序依次编号为整数1~N。评委共有C(C=10)人,每位评委按照100分制给参赛选手打分;比赛现场有座位S(S=500)个,每个座位配有一个投票器,选手演出时,观众喜欢这位歌手可以按下投票器投票,若不喜欢就不投票。在每位选手演出过程的有效投票时间内,每个投票器最多只记录一次投票。
全部评委给参赛选手的评分,按歌手的出场顺序,存储在文件F1.txt中,该文件对应于每一位选手有10个分数;现场观众投票数按歌手的出场顺序,依次存储在文件F2.txt中,该文件对应于每一位选手只有该选手的得票数。
参赛者的比赛成绩=评委给分×0.4+观众评分×0.6
其中,评委给分=(去掉一个最高分,去掉一个最低分,其余分数的平均值),观众评分=(现场观众投票数÷观众总数)×100。
【程序要求】
(1)根据评委评分和观众投票数,完成 对选手得分的计算和排名,生成一个排名后的选手文件Singer..txt。
(2)提供一个菜单,为用户提供以下功能选项:
①查询歌手(以编号或者姓名表示)的排名;
②查询前十名选手的编号、姓名和得分;
③输入编号或者姓名,查询最终的得分、评委给分和现场观众投票数。

望采纳!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量

//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;

//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);

int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序

//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}

return 0;
}

//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}

//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}

//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}

//关闭文件
fclose(fp);
}

//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}

//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}

//关闭文件
fclose(fp);
}

//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分

//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}

//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}

//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}

//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);

//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}

//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);

//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}

//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}

//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}

好像有点复杂,坐等大神来解答!!!!


#include<stdio.h>
#include<stdlib.h>
struct singer/*定义结构体*/ 
{

    int num;
    char name[10];
    float score[20];
    float aver;
    float sum;
    int ord;

}singer[100]; 


void singer_information(int b)
 /*输入选手信息*/ 
{
    int i;




    for(i=1;i<=b;i++)
    {
        printf("请输入选手编号:");
        scanf("%d",&singer[i].num);
        printf("请输入选手姓名:");
        scanf("%s",&singer[i].name);
    } 
}


int singer_score(int b)    
{
    int j,c;
    float a[50];
    for(j=1;j<=b;j++)
            {
                printf("\n请输入评委1对歌手%d的打分",j);
                scanf("%f",&singer[j].score[1]);
                printf("请输入评委2对歌手%d的打分",j);
                scanf("%f",&singer[j].score[2]);
                printf("请输入评委3对歌手%d的打分",j);
                scanf("%f",&singer[j].score[3]);
                printf("请输入评委4对歌手%d的打分",j);
                scanf("%f",&singer[j].score[4]);
                printf("请输入评委5对歌手%d的打分",j);
                scanf("%f",&singer[j].score[5]);
                printf("请输入评委6对歌手%d的打分",j);
                scanf("%f",&singer[j].score[6]);
                printf("请输入评委7对歌手%d的打分",j);
                scanf("%f",&singer[j].score[7]);
                printf("请输入评委8对歌手%d的打分",j);
                scanf("%f",&singer[j].score[8]);
                printf("请输入评委9对歌手%d的打分",j);
                scanf("%f",&singer[j].score[9]);
                printf("请输入评委10对歌手%d的打分",j);
                scanf("%f",&singer[j].score[10]);
                a[j]=singer[j].score[1]+singer[j].score[2]+singer[j].score[3]+singer[j].score[4]+singer[j].score[5]+singer[j].score[6]+singer[j].score[7]+singer[j].score[8]+singer[j].score[9]+singer[j].score[10];
                singer[j].sum=a[j];
            }
                
}


int singer_grade(int b)/* 歌手总成绩 */
{
    int a,c;
    float n[50],max,min;
    for(a=1;a<=b;a++)
    {
        max=singer[a].score[1];
        min=singer[a].score[1];
        for(c=1;c<=10;c++)
            {
                if(max<singer[a].score[c])   max=singer[a].score[c];
                if(min>singer[a].score[c])   min=singer[a].score[c];
            }
        n[a]=(singer[a].sum-max-min)/8.0;
        singer[a].aver=n[a];        
    }        
}



int order(int b)/*成绩排序*/ 
{
    int j,t,i;

        for(i=1;i<=b;i++)
                {
                for(j=1,t=1;j<=b;j++)
                {
                if(singer[i].aver<singer[j].aver)
                {
                t=t+1;
                }
                }
                singer[i].ord=t;
                }
                for(i=1;i<=b;i++)
                {
                    for(j=1;j<=b;j++)
                    {
                        if(i==singer[j].ord)
                            printf("%s是第%d     得分为%15.2f\n",singer[j].name,i,singer[j].aver);
                    }
                    printf("\n\n\n");
                }
            
}



int search(int c)/*数据查询*/ 
{
    printf("所查选手的数据:编号%d    姓名%s   平均成绩%f   总成绩%f\n",singer[c].num,singer[c].name,singer[c].aver,singer[c].score[c]);    
} 

 
 
 int addition(int i)/*数据追加*/
 {
     printf("请输入选手编号及姓名:");
    scanf("%d,%s/n",&singer[i+1].num,&singer[i+1].name);
    
    printf("请输入评委1对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[1]);
    printf("请输入评委2对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[2]);
    printf("请输入评委3对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[3]);
    printf("请输入评委4对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[4]);
    printf("请输入评委5对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[5]);
    printf("请输入评委6对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[6]);
    printf("请输入评委7对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[7]);
    printf("请输入评委8对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[8]);
    printf("请输入评委9对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[9]);
    printf("请输入评委10对歌手%d的打分",i+1);
    scanf("%d",&singer[i+1].score[10]);
 }




main()
{
    int a,b,c,i,n=1;
    FILE *fp;
    fp = fopen("歌手.txt","wt+");
    
     printf("     歌手比赛系统   \n");
     printf("*********************\n");
     printf("* 1)输入选手数据   *\n"); 
     printf("* 2)评委打分       *\n");
     printf("* 3)成绩排序       *\n");
     printf("* 4)数据查询       *\n");
     printf("* 5)追加学生数据   *\n");
     printf("* 6)写入数据文件   *\n");      
     printf("* 7)退出系统       *\n");
     printf("*********************\n");
    while(n)
    {
    printf("你想进行的操作: ");
    scanf("%d",&a);
    printf("\n\n");
    switch(a)
    {
        case 1: 
                printf("你想进行的操作:输入选手数据\n "); 
                printf("请输入选手个数");
                scanf("%d",&b);
                singer_information(b);
                printf("----------------------\n");
            
        break;
        case 2: 
                printf("你想进行的操作:评委打分\n ");
                singer_score(b);
                printf("-----------------------\n");
                
         break;
        case 3:  
                printf("你想进行的操作:成绩排序(按平均分)\n ");
                singer_grade(b);
                order(b);
                printf("-------------------------\n");
                
          break;
        case 4:
                printf("你想进行的操作:数据查询\n ");
                 printf("请输入要查询选手编号:"); 
                 scanf("%d",&c);
                 printf("所查选手的数据:编号%d    姓名%s   平均成绩%f   总成绩%f\n",singer[c].num,singer[c].name,singer[c].aver,singer[c].sum);
                 
                printf("--------------------------\n");
          break;
        case 5:
                printf("你想进行的操作:追加学生数据\n ");  
               addition(b);
                   printf("---------------------------\n");
                
          break;
        case 6: 
                printf("你想进行的操作:写入数据文件\n ");
                printf("将数据写入文件中:\n");
                for (i = 0 ; i <=b ; i++)
                {
                    fprintf(fp,"%d ",singer[i].num);
                    fprintf(fp,"%s ",singer[i].name);
                    fprintf(fp,"%d\n",singer[i].aver);
                    }
         break;
        case 7: exit(0);
        default :printf("输入错误请重新输入!\n");
    }
    }
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量

//歌手信息结构体
typedef struct Singer {
    char name[20]; //歌手名称
    int num; //歌手编号
    float scores[C]; //评委评分
    int votes; //观众投票数
    float total_score; //总分
} Singer;

//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);

int main() {
    Singer singers[N]; //定义参赛者数组
    read_scores(singers); //读取评委评分
    read_votes(singers); //读取观众投票数
    calculate_total_score(singers); //计算总分
    sort(singers); //排序

//菜单循环
    while(1) {
        menu(); //菜单功能选项
        int choice;
        printf("请输入选项:");
        scanf("%d", &choice);
        switch(choice) {
        case 1: //查询歌手排名
            search_rank(singers);
            break;
        case 2: //查询歌手信息
            search_info(singers);
            break;
        case 3: //输出前三名歌手信息
            print_top3(singers);
            break;
        case 4: //输出所有歌手信息
            print_all(singers);
            break;
        case 5: //退出程序
            exit(0);
            break;
        default:
            printf("输入有误,请重新输入\n");
            break;
        }
    }

    return 0;
}

//菜单功能选项
void menu() {
    printf("\n------歌手比赛评选程序------\n");
    printf("1.查询歌手排名\n");
    printf("2.查询歌手信息\n");
    printf("3.输出前三名歌手信息\n");
    printf("4.输出所有歌手信息\n");
    printf("5.退出程序\n");
}

//读取评委评分
void read_scores(Singer *singers) {
//打开文件
    FILE *fp = fopen("F1.txt", "r");
    if(fp == NULL) {
        printf("打开文件失败\n");
        exit(1);
    }

//读取评委评分
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < C; j++) {
            fscanf(fp, "%f", &singers[i].scores[j]);
        }
    }

//关闭文件
    fclose(fp);
}

//读取观众投票数
void read_votes(Singer *singers) {
//打开文件
    FILE *fp = fopen("F2.txt", "r");
    if(fp == NULL) {
        printf("打开文件失败\n");
        exit(1);
    }

//读取观众投票数
    for(int i = 0; i < N; i++) {
        fscanf(fp, "%d", &singers[i].votes);
    }

//关闭文件
    fclose(fp);
}

//计算总分
void calculate_total_score(Singer *singers) {
    for(int i = 0; i < N; i++) {
        float sum = 0; //评委给分总和
        float max = singers[i].scores[0]; //最高分
        float min = singers[i].scores[0]; //最低分

//计算评委给分总和,最高分,最低分
        for(int j = 0; j < C; j++) {
            sum += singers[i].scores[j];
            if(singers[i].scores[j] > max) {
                max = singers[i].scores[j];
            }
            if(singers[i].scores[j] < min) {
                min = singers[i].scores[j];
            }
        }//计算评委给分平均值
        float avg = (sum - max - min) / (C - 2);
//计算观众评分
        float audience_score = (float)singers[i].votes / S * 100;
//计算总分
        singers[i].total_score = avg * 0.4 + audience_score * 0.6;
    }
}

//排序
void sort(Singer *singers) {
//冒泡排序
    for(int i = 0; i < N - 1; i++) {
        for(int j = 0; j < N - 1 - i; j++) {
            if(singers[j].total_score < singers[j+1].total_score) {
                Singer temp = singers[j];
                singers[j] = singers[j+1];
                singers[j+1] = temp;
            }
        }
    }

//更新排名
    for(int i = 0; i < N; i++) {
        singers[i].num = i + 1;
    }
}

//查询歌手排名
void search_rank(Singer *singers) {
    int num;
    printf("请输入歌手编号:");
    scanf("%d", &num);

//遍历查找
    for(int i = 0; i < N; i++) {
        if(singers[i].num == num) {
            printf("歌手%d的排名是%d\n", num, singers[i].num);
            return;
        }
    }
    printf("未找到歌手%d\n", num);
}

//查询歌手信息
void search_info(Singer *singers) {
    int num;
    printf("请输入歌手编号:");
    scanf("%d", &num);

//遍历查找
    for(int i = 0; i < N; i++) {
        if(singers[i].num == num) {
            printf("歌手%d的信息:\n", num);
            printf("评委评分:");
            for(int j = 0; j < C; j++) {
                printf("%.2f ", singers[i].scores[j]);
            }
            printf("\n观众投票数:%d\n", singers[i].votes);
            printf("总分:%.2f\n", singers[i].total_score);
            return;
        }
    }
    printf("未找到歌手%d\n", num);
}

//输出前十名歌手信息
void print_top3(Singer *singers) {
    printf("前十名歌手信息:\n");
    for(int i = 0; i < 10; i++) {
        printf("歌手%d的信息:\n", singers[i].num);
        printf("评委评分:");
        for(int j = 0; j < C; j++) {
            printf("%.2f ", singers[i].scores[j]);
        }
        printf("\n观众投票数:%d\n", singers[i].votes);
        printf("总分:%.2f\n", singers[i].total_score);
    }
}

//输出所有歌手信息
void print_all(Singer *singers) {
    printf("所有歌手信息:\n");
    for(int i = 0; i < N; i++) {
        printf("歌手%d的信息:\n", singers[i].num);
        printf("评委评分:");
        for(int j = 0; j < C; j++) {
            printf("%.2f ", singers[i].scores[j]);
        }
        printf("\n观众投票数:%d\n", singers[i].votes);
        printf("总分:%.2f\n", singers[i].total_score);
    }
}

评分系统和投票系统采用函数随机方式进行(因为手动逐个输入太麻烦了),可适当修改。

仅供参考,希望对你有帮助

img

img

img

img

img

img

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define C 10
#define N 30
#define S 500

void selSort(int *arr, int n);

typedef struct singer
{
    int num /*选手编号*/;
    char name[30] /*姓名*/;
    int judges_score[C] /*评委打分*/;
    int audience_score[500] /*观众投票计1不投票计0*/;
    float score /*选手得分*/;
    int total /*得票数*/;
} sing;

FILE *out1 = NULL;
FILE *out2 = NULL;

//手动输入太麻烦,自定义随机投票函数
//观众投票函数 随机返回 0或1
int myrand1(void)
{
    static int i = 0;
    srand(time(NULL) + i++);
    return rand() % 2 == 0 ? 0 : 1;
}

//裁判评分函数,随机评分
int myrand2(void)
{
    static int i = 0;
    srand(time(NULL) + i++);
    return rand() % 51 + 50;
}

//开始投票,评分
#if 1
void init(sing *p, int i, FILE *out1, FILE *out2)
{
    //出场顺序等于编号
    p->num = i + 1;

    //初始化投票数
    p->total = 0;

    //用"?号选手"作为选手的姓名
    sprintf(p->name, "%d号选手", i + 1);

    //评委打分
    for (int j = 0; j < C; j++)
    {
        p->judges_score[j] = myrand2();
    }

    //评委原始打分输出到文件F1.txt
    for (int i = 0; i < C; i++)
    {
        if (i == C - 1)
            fprintf(out1, "%d", p->judges_score[i]);
        else
            fprintf(out1, "%d ", p->judges_score[i]);
    }
    fputs("\n", out1);

    //观众投票
    for (int k = 0; k < S; k++)
    {
        p->audience_score[k] = myrand1();
        if (p->audience_score[k])
            p->total += 1 /*观众投票数类加*/;
    }

    //选手总票数输出到文件F2.txt
    fprintf(out2, "%d", p->total);
    fputs("\n", out2);

    //评委打分排序
    selSort(&(p->judges_score[0]), C);

    //求评委打分的平均分
    float sum = 0.0, avg = 0.0;
    for (int k = 1; k < C - 1; k++)
    {
        sum += p->judges_score[k];
    }
    avg = 1.0 * sum / (C - 2);

    //求得选手得分
    p->score = avg * 0.4 + (p->total / S) * 100 * 0.6;
}
#endif

//排序
void selSort(int *arr, int n)
{
    int i, j, small, tmp;
    for (i = 0; i < n - 1; i++)
    {
        small = i;
        for (j = i + 1; j < n; j++)
        {
            if (arr[j] < arr[small])
                small = j;
        }

        if (small != i)
        {
            tmp = arr[i];
            arr[i] = arr[small];
            arr[small] = tmp;
        }
    }
}

//结构体排序
void selSort2(sing *arr, int n)
{
    int i, j, small;
    sing tmp;
    for (i = 0; i < n - 1; i++)
    {
        small = i;
        for (j = i + 1; j < n; j++)
        {
            if (arr[j].score < arr[small].score)
                small = j;
        }

        if (small != i)
        {
            tmp = arr[i];
            arr[i] = arr[small];
            arr[small] = tmp;
        }
    }
}

//查询歌手排名,下标+1即是名次
void fun1(sing *p)
{
    int n;
    puts("输入歌手编号:");
    scanf("%d", &n);
    for (int i = 0; i < N; i++)
    {
        if (p[i].num == n)
        {
            printf("%d号歌手排名:%d\n", n, 30 - i);
            return;
        }
    }
    printf("未找到%d号歌手!\n", n);
}

//查询前十名歌手 编号 姓名 总分
void fun2(sing *p)
{
    printf("%02d%15s%8.1f\n", p->num, p->name, p->score);
    return;
}

//查询某选手得分情况
int fun3(sing *p)
{
    return p->num;
}

void menu()
{
    printf("+++++++++++++++++++++++++++++++++++\n");

    printf("       1->查选手排名\n");

    printf("       2->查前十名选手信息\n");

    printf("       3->查某个选手得分情况\n");

    printf("       0->退出系统\n");
    printf("\n       请选择对应的功能序号\n");
    printf("+++++++++++++++++++++++++++++++++++\n");
}

int main(int argc, char *argv[])
{
    int n, tmp;
    sing singer[N];

    out1 = fopen("F1.txt", "w");
    out2 = fopen("F2.txt", "w");

    //开始模拟投票评分
    for (int i = 0; i < N; i++)
        init(&singer[i], i, out1, out2);

    fclose(out1);
    fclose(out2);

    //结构体数组排序
    selSort2(singer, N);

    //输出文件Singer.txt
    FILE *outp = fopen("Singer.txt", "w");
    for (int i = N - 1; i >= 0; i--)
    {
        fprintf(outp, "%s      得票数:%d     评委分:%.1f\n", singer[i].name, singer[i].total, singer[i].score);
    }
    fclose(outp);

    while (1)
    {
        menu();

        scanf("%d", &n);

        switch (n)
        {
        case 0:
            exit(0);
        case 1:
            fun1(singer);
            break;
        case 2:
            printf("编号    姓名      分数\n");
            for (int i = N - 1; i > N - 11; i--)
            {
                fun2(singer + i);
            }
            break;
        case 3:
            puts("输入选手编号:");
            scanf("%d", &tmp);
            for (int i = 0; i < N; i++)
            {
                if (tmp == fun3(singer + i))
                {
                    printf("%s   得票数:%2d    评分:%.1f\n", singer[i].name, singer[i].total, singer[i].score);
                }
            }
            break;
        default:
            break;
        }

        getchar();
        getchar();

        system("cls");
    }

    return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
 
//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;
 
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
 
int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
 
//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
 
return 0;
}
 
//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
 
//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
 
//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
 
//关闭文件
fclose(fp);
}
 
//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
 
//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}
 
//关闭文件
fclose(fp);
}
 
//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
 
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
 
//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
 
//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}
 
//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
 
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
 
//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
 
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
 
//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
 
//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
 

借用前方大佬的代码,帮助修改错误,望采纳

#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //参赛者数量
#define C 10 //评委数量
#define S 500 //座位数量
 
//歌手信息结构体
typedef struct Singer{
char name[20]; //歌手名称
int num; //歌手编号
float scores[C]; //评委评分
int votes; //观众投票数
float total_score; //总分
}Singer;
 
//菜单功能选项
void menu();
//读取评委评分
void read_scores(Singer *singers);
//读取观众投票数
void read_votes(Singer *singers);
//计算总分
void calculate_total_score(Singer *singers);
//排序
void sort(Singer *singers);
//查询歌手排名
void search_rank(Singer *singers);
//查询歌手信息
void search_info(Singer *singers);
//输出前三名歌手信息
void print_top3(Singer *singers);
//输出所有歌手信息
void print_all(Singer *singers);
 
int main(){
Singer singers[N]; //定义参赛者数组
read_scores(singers); //读取评委评分
read_votes(singers); //读取观众投票数
calculate_total_score(singers); //计算总分
sort(singers); //排序
 
//菜单循环
while(1){
menu(); //菜单功能选项
int choice;
printf("请输入选项:");
scanf("%d", &choice);
switch(choice){
case 1: //查询歌手排名
search_rank(singers);
break;
case 2: //查询歌手信息
search_info(singers);
break;
case 3: //输出前三名歌手信息
print_top3(singers);
break;
case 4: //输出所有歌手信息
print_all(singers);
break;
case 5: //退出程序
exit(0);
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}
 
return 0;
}
 
//菜单功能选项
void menu(){
printf("\n------歌手比赛评选程序------\n");
printf("1.查询歌手排名\n");
printf("2.查询歌手信息\n");
printf("3.输出前三名歌手信息\n");
printf("4.输出所有歌手信息\n");
printf("5.退出程序\n");
}
 
//读取评委评分
void read_scores(Singer *singers){
//打开文件
FILE *fp = fopen("F1.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
 
//读取评委评分
for(int i = 0; i < N; i++){
for(int j = 0; j < C; j++){
fscanf(fp, "%f", &singers[i].scores[j]);
}
}
 
//关闭文件
fclose(fp);
}
 
//读取观众投票数
void read_votes(Singer *singers){
//打开文件
FILE *fp = fopen("F2.txt", "r");
if(fp == NULL){
printf("打开文件失败\n");
exit(1);
}
 
//读取观众投票数
for(int i = 0; i < N; i++){
fscanf(fp, "%d", &singers[i].votes);
}
 
//关闭文件
fclose(fp);
}
 
//计算总分
void calculate_total_score(Singer *singers){
for(int i = 0; i < N; i++){
float sum = 0; //评委给分总和
float max = singers[i].scores[0]; //最高分
float min = singers[i].scores[0]; //最低分
 
//计算评委给分总和,最高分,最低分
for(int j = 0; j < C; j++){
sum += singers[i].scores[j];
if(singers[i].scores[j] > max){
max = singers[i].scores[j];
}
if(singers[i].scores[j] < min){
min = singers[i].scores[j];
}
}//计算评委给分平均值
float avg = (sum - max - min) / (C - 2);
//计算观众评分
float audience_score = (float)singers[i].votes / S * 100;
//计算总分
singers[i].total_score = avg * 0.4 + audience_score * 0.6;
}
}
 
//排序
void sort(Singer *singers){
//冒泡排序
for(int i = 0; i < N - 1; i++){
for(int j = 0; j < N - 1 - i; j++){
if(singers[j].total_score < singers[j+1].total_score){
Singer temp = singers[j];
singers[j] = singers[j+1];
singers[j+1] = temp;
}
}
}
 
//更新排名
for(int i = 0; i < N; i++){
singers[i].num = i + 1;
}
}
 
//查询歌手排名
void search_rank(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
 
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的排名是%d\n", num, singers[i].num);
return;
}
}
printf("未找到歌手%d\n", num);
}
 
//查询歌手信息
void search_info(Singer *singers){
int num;
printf("请输入歌手编号:");
scanf("%d", &num);
 
//遍历查找
for(int i = 0; i < N; i++){
if(singers[i].num == num){
printf("歌手%d的信息:\n", num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
return;
}
}
printf("未找到歌手%d\n", num);
}
 
//输出前三名歌手信息
void print_top3(Singer *singers){
printf("前三名歌手信息:\n");
for(int i = 0; i < 3; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
 
//输出所有歌手信息
void print_all(Singer *singers){
printf("所有歌手信息:\n");
for(int i = 0; i < N; i++){
printf("歌手%d的信息:\n", singers[i].num);
printf("评委评分:");
for(int j = 0; j < C; j++){
printf("%.2f ", singers[i].scores[j]);
}
printf("\n观众投票数:%d\n", singers[i].votes);
printf("总分:%.2f\n", singers[i].total_score);
}
}
 

看起来还是挺麻烦的,这个我下班了晚上给你写啊。

大佬们 挺专业的 我膜拜观望