404 Not Found190 2023-01-05 14:54 采纳率: 0%
浏览 222
已结题

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)提供一个菜单,为用户提供以下功能选项:
①查询歌手(以编号或者姓名表示)的排名;
②查询前十名选手的编号、姓名和得分;
③输入编号或者姓名,查询最终的得分、评委给分和现场观众投票数。

  • 写回答

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);
    }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 创建了问题 1月5日