【问题详述】
某地举办“我喜爱的歌手”现场比赛,比赛评选程序为该赛事提供名次统计和查询。比赛共有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)提供一个菜单,为用户提供以下功能选项:
①查询歌手(以编号或者姓名表示)的排名;
②查询前十名选手的编号、姓名和得分;
③输入编号或者姓名,查询最终的得分、评委给分和现场观众投票数。
C语言的歌手比赛评选程序
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
9条回答 默认 最新
heart_6662 2023-01-05 15:09关注获得1.65元问题酬金 望采纳!
#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); } }解决 无用评论 打赏 举报 编辑记录