2301_82043961 2024-12-19 19:22 采纳率: 33.3%
浏览 24
已结题

数据结构电视大赛观众投票及其排名系统

[问题描述]在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。现在要求编写一程序模拟实现上述系统的功能。
[实现提示]在本例中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存放选手信息的顺序表。将选手的编号和姓名依此存入顺序表单元中,观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志。投票结束后进行排序,在此采用选择排序,然后为每个选手计算名次,得票相同的名次也相同,
(1)存储类型的定义参赛选手信息存储类型的定义:typedef struct node{ char name[8]; /选手姓名/ int num; /选手编号/ int score; /选手得分/ int tax; /选手名次/}Node;

  • 写回答

13条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-19 19:23
    关注
    让【道友老李】来帮你解答,本回答参考通义千问编写,并整理提供,如果还有疑问可以点击头像关注私信或评论!
    如果答案让您满意,请采纳、关注,非常感谢!
    好的,下面我将按照你的要求,提供一个详细的解答。我们将使用C语言来实现这个系统,并且会遵循你提供的结构体定义。

    1. 问题描述

    我们需要编写一个程序来模拟电视大赛的投票系统。程序需要完成以下功能: - 输入参赛选手的人数(范围为1-9个)。 - 动态分配内存来存储选手信息。 - 接收观众的投票,按'1'为1号选手投票,按'2'为2号选手投票,以此类推,以按'0'作为投票结束标志。 - 使用选择排序对选手的得分进行降序排序。 - 计算每个选手的名次,得票相同的名次也相同。

    2. 结构体定义

    我们使用你提供的结构体定义来存储选手信息:

    typedef struct node {
        char name[8];  // 选手姓名
        int num;      // 选手编号
        int score;    // 选手得分
        int rank;     // 选手名次
    } Node;
    

    3. 代码实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 定义结构体
    typedef struct node {
        char name[8];  // 选手姓名
        int num;      // 选手编号
        int score;    // 选手得分
        int rank;     // 选手名次
    } Node;
    
    // 选择排序函数
    void selectionSort(Node *arr, int n) {
        for (int i = 0; i < n - 1; i++) {
            int max_idx = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j].score > arr[max_idx].score) {
                    max_idx = j;
                }
            }
            if (max_idx != i) {
                Node temp = arr[i];
                arr[i] = arr[max_idx];
                arr[max_idx] = temp;
            }
        }
    }
    
    // 计算名次
    void calculateRank(Node *arr, int n) {
        int rank = 1;
        for (int i = 0; i < n; i++) {
            if (i > 0 && arr[i].score == arr[i - 1].score) {
                arr[i].rank = arr[i - 1].rank;
            } else {
                arr[i].rank = rank;
            }
            rank++;
        }
    }
    
    int main() {
        int n;
        printf("请输入参赛选手的人数(1-9): ");
        scanf("%d", &n);
    
        if (n < 1 || n > 9) {
            printf("人数输入错误,请输入1-9之间的数字。\n");
            return 1;
        }
    
        // 动态分配内存
        Node *contestants = (Node *)malloc(n * sizeof(Node));
        if (contestants == NULL) {
            printf("内存分配失败\n");
            return 1;
        }
    
        // 输入选手信息
        for (int i = 0; i < n; i++) {
            contestants[i].num = i + 1;
            printf("请输入第%d号选手的姓名: ", i + 1);
            scanf("%s", contestants[i].name);
            contestants[i].score = 0;
            contestants[i].rank = 0;
        }
    
        // 投票
        char vote;
        printf("开始投票,请输入选手编号(1-%d),按0结束投票: \n", n);
        while (1) {
            vote = getchar();
            if (vote == '0') break;
            if (vote >= '1' && vote <= '9' && (vote - '1') < n) {
                contestants[vote - '1'].score++;
            } else {
                printf("无效的投票,请重新输入: ");
            }
        }
    
        // 选择排序
        selectionSort(contestants, n);
    
        // 计算名次
        calculateRank(contestants, n);
    
        // 输出结果
        printf("\n投票结果:\n");
        for (int i = 0; i < n; i++) {
            printf("编号: %d, 姓名: %s, 得分: %d, 名次: %d\n", 
                   contestants[i].num, contestants[i].name, contestants[i].score, contestants[i].rank);
        }
    
        // 释放内存
        free(contestants);
    
        return 0;
    }
    

    4. 代码说明

    • 结构体定义:定义了一个Node结构体来存储选手的信息。
    • 选择排序:使用选择排序算法对选手的得分进行降序排序。
    • 计算名次:在排序后,根据得分计算每个选手的名次,得票相同的名次也相同。
    • 动态内存分配:使用malloc函数动态分配内存来存储选手信息。
    • 投票:通过读取用户输入的字符来进行投票,按'0'结束投票。
    • 输出结果:输出每个选手的编号、姓名、得分和名次。

    5. 示例

    假设输入如下: - 参赛选手人数:3 - 选手信息: - 1号选手:张三 - 2号选手:李四 - 3号选手:王五 - 投票:1 2 1 3 2 1 0

    输出结果将是:

    编号: 1, 姓名: 张三, 得分: 3, 名次: 1
    编号: 2, 姓名: 李四, 得分: 2, 名次: 2
    编号: 3, 姓名: 王五, 得分: 1, 名次: 3
    

    希望这个解答对你有帮助!如果有任何问题,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 12月19日