【实现提示】 在本例中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存放选手信息的顺序表。将选手的编号和姓名依此存入顺序表单元中,观众通过按键进行投票,按’1’为1号选手投票,按’2’为2号选手投票,以此类推,以按’0’作为投票结束标志。投票结束后进行排序,然后为每个选手计算名次,得票相同的名次也相同, (可以用C语言学过的冒泡法排序和选择法排序)
时间: 2024-03-14 11:44:21 浏览: 58
以下是一个简单的实现提示,使用冒泡排序和顺序表来实现选手信息的存储和排序,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int number; // 选手编号
char name[20]; // 选手姓名
int votes; // 得票数
int rank; // 名次
} Player;
void bubble_sort(Player *players, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
// 如果前一个选手的得票数小于后一个选手的得票数,交换两个选手的位置
if (players[j].votes < players[j + 1].votes) {
Player temp = players[j];
players[j] = players[j + 1];
players[j + 1] = temp;
}
}
}
}
void selection_sort(Player *players, int n) {
for (int i = 0; i < n - 1; i++) {
int min_index = i;
for (int j = i + 1; j < n; j++) {
// 找到得票数最高的选手,将其与当前位置交换
if (players[j].votes > players[min_index].votes) {
min_index = j;
}
}
Player temp = players[i];
players[i] = players[min_index];
players[min_index] = temp;
}
}
int main() {
int n; // 参赛选手的人数
printf("请输入参赛选手的人数(1-9):");
scanf("%d", &n);
if (n < 1 || n > 9) {
printf("参赛选手人数不合法!\n");
return 0;
}
Player *players = (Player *) malloc(sizeof(Player) * n); // 动态分配存储选手信息的空间
for (int i = 0; i < n; i++) {
printf("请输入第%d个选手的编号和姓名:", i + 1);
scanf("%d %s", &players[i].number, players[i].name); // 读取选手编号和姓名
players[i].votes = 0; // 初始得票数为0
players[i].rank = 0; // 初始名次为0
}
printf("投票开始,按数字键投票,按0结束投票:\n");
char c;
do {
scanf(" %c", &c); // 读取用户输入的按键
if (c >= '1' && c <= '9') { // 如果输入的是数字键
int number = c - '0'; // 获取选手编号
// 在选手列表中找到对应的选手,将其得票数加1
for (int i = 0; i < n; i++) {
if (players[i].number == number) {
players[i].votes++;
break;
}
}
}
} while (c != '0'); // 如果输入的是0,则结束投票
printf("投票结束,开始计算名次。\n");
// 排序
bubble_sort(players, n); // 使用冒泡排序
// selection_sort(players, n); // 使用选择排序
// 计算名次
int rank = 1;
players[0].rank = 1;
for (int i = 1; i < n; i++) {
if (players[i].votes == players[i - 1].votes) {
players[i].rank = players[i - 1].rank;
} else {
players[i].rank = i + 1;
}
}
// 输出结果
printf("排名\t编号\t姓名\t得票数\n");
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%s\t%d\n", players[i].rank, players[i].number, players[i].name, players[i].votes);
}
free(players); // 释放动态分配的内存
return 0;
}
```
注意,这只是一个简单的实现提示,输入的格式、排序算法和计算名次的方法等都可以根据实际需求进行调整。
阅读全文