歌唱比赛评分系统的编程继续
时间: 2023-08-30 15:04:17 浏览: 84
好的,以下是完整的代码实现,包含输入选手信息、计算选手得分、排序和查询选手得分和排名的功能:
```c
#include <stdio.h>
#include <string.h>
#define N 10 // 参赛选手数量
#define M 10 // 裁判数量
// 定义选手结构体
struct player {
int id; // 参赛编号
char name[20]; // 姓名
int scores[M]; // 十个裁判打出的分数
float final_score; // 最终得分
};
// 获取选手编号或姓名对应的选手结构体
struct player* get_player(struct player players[], int n, char *value, int is_id) {
int i;
for (i = 0; i < n; i++) {
if ((is_id && players[i].id == atoi(value)) || (!is_id && strcmp(players[i].name, value) == 0)) {
return &players[i];
}
}
return NULL;
}
// 计算选手的最终得分
void calculate_score(struct player* p) {
int i, max_score = 0, min_score = 100;
float total_score = 0;
for (i = 0; i < M; i++) {
if (p->scores[i] > max_score) {
max_score = p->scores[i];
}
if (p->scores[i] < min_score) {
min_score = p->scores[i];
}
total_score += p->scores[i];
}
p->final_score = (total_score - max_score - min_score) / (M - 2);
}
// 选手结构体排序比较函数
int compare(const void* a, const void* b) {
struct player* player_a = (struct player*)a;
struct player* player_b = (struct player*)b;
return (int)(player_b->final_score - player_a->final_score);
}
int main() {
struct player players[N];
int i, j, menu_choice;
char query[20];
// 输入选手信息
for (i = 0; i < N; i++) {
printf("请输入第 %d 个选手的信息:\n", i + 1);
printf("参赛编号:");
scanf("%d", &players[i].id);
printf("姓名:");
scanf("%s", players[i].name);
for (j = 0; j < M; j++) {
printf("第 %d 个裁判的得分:", j + 1);
scanf("%d", &players[i].scores[j]);
}
calculate_score(&players[i]);
}
// 排序并输出
qsort(players, N, sizeof(struct player), compare);
printf("比赛结果:\n");
for (i = 0; i < N; i++) {
printf("第 %d 名:姓名:%s,最终得分:%0.2f\n", i + 1, players[i].name, players[i].final_score);
}
// 查询选手信息
while (1) {
printf("\n请输入您要查询的选手的编号或姓名(输入0退出):");
scanf("%s", query);
if (strcmp(query, "0") == 0) {
break;
}
struct player* p = get_player(players, N, query, 1); // 先按照编号查找
if (p == NULL) {
p = get_player(players, N, query, 0); // 再按照姓名查找
if (p == NULL) {
printf("没有找到对应的选手信息!\n");
continue;
}
}
printf("选手姓名:%s,最终得分:%0.2f,比赛排名:%d\n", p->name, p->final_score, (int)(p - players) + 1);
}
return 0;
}
```
程序逻辑比较清晰,输入选手信息后计算每个选手的最终得分,然后按照最终得分排序输出。查询选手信息时先按照编号查找,如果没有再按照姓名查找。