[问题描述]在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票,然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。现在要求编写一程序模拟实现上述系统的功能。
[实现提示]在本例中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存放选手信息的顺序表。将选手的编号和姓名依此存入顺序表单元中,观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志。投票结束后进行排序,在此采用选择排序,然后为每个选手计算名次,得票相同的名次也相同,
(1)存储类型的定义参赛选手信息存储类型的定义:typedef struct node{ char name[8]; /选手姓名/ int num; /选手编号/ int score; /选手得分/ int tax; /选手名次/}Node;
数据结构电视大赛观众投票及其排名系统
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
13条回答 默认 最新
关注让【道友老李】来帮你解答,本回答参考通义千问编写,并整理提供,如果还有疑问可以点击头像关注私信或评论!
如果答案让您满意,请采纳、关注,非常感谢!
好的,下面我将按照你的要求,提供一个详细的解答。我们将使用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希望这个解答对你有帮助!如果有任何问题,请随时告诉我。
本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 1无用- 结构体定义:定义了一个