c语言单链表写:歌手比赛系统设计 1.输入每个选手的数据包括编号、姓名、十个评委的成绩,根据输入计算出总成绩和平均成绩(去掉最高分,去掉最低分) 2.显示主菜单如下:3.输入选手数据4.评委打分5.成绩排序(按平均分)排序后显示排序结果 6.数据查询 7.追加选手数据 8写入数据文件 9.加载数据文件 代码注释用中文 写完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义选手结构体
struct Player {
/*完整代码联系博主:lxt123lxp456*/
};
struct Player* head = NULL;
// 显示主菜单
void displayMainMenu() {
printf("主菜单:\n");
printf("1. 输入选手数据\n");
printf("2. 评委打分\n");
printf("3. 成绩排序(按平均分)\n");
printf("4. 数据查询\n");
printf("5. 追加选手数据\n");
printf("6. 写入数据文件\n");
printf("7. 加载数据文件\n");
printf("8. 显示全部信息\n");
printf("0. 退出\n");
}
// 输入选手数据
void inputPlayerData() {
struct Player* newPlayer = (struct Player*)malloc(sizeof(struct Player));
if (newPlayer == NULL) {
printf("内存分配失败\n");
return;
}
printf("请输入选手编号: ");
scanf("%d", &newPlayer->number);
printf("请输入选手姓名: ");
scanf("%s", newPlayer->name);
printf("请输入十个评委的成绩:\n");
for (int i = 0; i < 10; i++) {
scanf("%d", &newPlayer->scores[i]);
}
newPlayer->next = head;
head = newPlayer;
printf("选手数据已添加\n");
}
// 评委打分
void judgeScoring() {
int playerNumber;
printf("请输入选手编号: ");
scanf("%d", &playerNumber);
struct Player* current = head;
while (current != NULL) {
if (current->number == playerNumber) {
printf("请输入评委的成绩:\n");
for (int i = 0; i < 10; i++) {
scanf("%d", ¤t->scores[i]);
}
return;
}
current = current->next;
}
printf("未找到对应选手\n");
}
// 计算总成绩和平均成绩
void calculateScores() {
struct Player* current = head;
while (current != NULL) {
int maxScore = current->scores[0];
int minScore = current->scores[0];
float totalScore = 0;
for (int i = 0; i < 10; i++) {
totalScore += current->scores[i];
if (current->scores[i] > maxScore) {
maxScore = current->scores[i];
}
if (current->scores[i] < minScore) {
minScore = current->scores[i];
}
}
current->totalScore = totalScore - maxScore - minScore;
current->averageScore = current->totalScore / 8.0;
current = current->next;
}
printf("成绩已计算\n");
}
// 按平均分排序
void sortPlayersByAverageScore() {
// 使用冒泡排序按平均分排序
struct Player *current, *next;
float temp;
int tempNumber;
char tempName[50];
for (current = head; current != NULL; current = current->next) {
for (next = current->next; next != NULL; next = next->next) {
if (current->averageScore < next->averageScore) {
// 交换选手数据
temp = current->averageScore;
current->averageScore = next->averageScore;
next->averageScore = temp;
temp = current->totalScore;
current->totalScore = next->totalScore;
next->totalScore = temp;
tempNumber = current->number;
current->number = next->number;
next->number = tempNumber;
strcpy(tempName, current->name);
strcpy(current->name, next->name);
strcpy(next->name, tempName);
}
}
}
printf("按平均分排序完成\n");
}
// 追加选手数据
void appendPlayerData() {
struct Player* newPlayer = (struct Player*)malloc(sizeof(struct Player));
if (newPlayer == NULL) {
printf("内存分配失败\n");
return;
}
printf("请输入选手编号: ");
scanf("%d", &newPlayer->number);
printf("请输入选手姓名: ");
scanf("%s", newPlayer->name);
printf("请输入十个评委的成绩:\n");
for (int i = 0; i < 10; i++) {
scanf("%d", &newPlayer->scores[i]);
}
newPlayer->next = head;
head = newPlayer;
printf("选手数据已追加\n");
}
// 写入数据到文件
void writeDataToFile() {
FILE *file;
file = fopen("players.txt", "w");
if (file == NULL) {
printf("无法打开文件\n");
return;
}
struct Player* current = head;
while (current != NULL) {
fprintf(file, "%d %s ", current->number, current->name);
for (int i = 0; i < 10; i++) {
fprintf(file, "%d ", current->scores[i]);
}
fprintf(file, "%.2f %.2f\n", current->totalScore, current->averageScore);
current = current->next;
}
fclose(file);
printf("数据已写入文件\n");
}
void loadDataFromFile(struct Player** head) {
FILE* file = fopen("players.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return;
}
struct Player* current = *head;
while (!feof(file)) {
struct Player* newPlayer = (struct Player*)malloc(sizeof(struct Player));
if (newPlayer == NULL) {
printf("内存分配失败\n");
return;
}
int result = fscanf(file, "%d %s", &newPlayer->number, newPlayer->name);
if (result == EOF) {
free(newPlayer);
break;
}
for (int i = 0; i < 10; i++) {
result = fscanf(file, "%d", &newPlayer->scores[i]);
if (result == EOF) {
break;
}
}
result = fscanf(file, "%f %f", &newPlayer->totalScore, &newPlayer->averageScore);
if (result == EOF) {
break;
}
newPlayer->next = NULL;
if (*head == NULL) {
*head = newPlayer;
current = *head;
} else {
current->next = newPlayer;
current = newPlayer;
}
}
fclose(file);
printf("数据已从文件加载\n");
}
void displayAllPlayers(struct Player* head) {
struct Player* current = head;
if (current == NULL) {
printf("暂无选手信息\n");
} else {
while (current != NULL) {
printf("选手编号: %d\n", current->number);
printf("选手姓名: %s\n", current->name);
printf("平均分: %.2f\n", current->averageScore);
current = current->next;
}
}
}
void searchPlayer(struct Player* head) {
int playerNumber;
printf("请输入要查询的选手编号: ");
scanf("%d", &playerNumber);
struct Player* current = head;
while (current != NULL) {
if (current->number == playerNumber) {
printf("选手编号: %d\n", current->number);
printf("选手姓名: %s\n", current->name);
printf("平均分: %.2f\n", current->averageScore);
return;
}
current = current->next;
}
printf("未找到对应选手\n");
}
int main() {
/*完整代码联系博主:lxt123lxp456*/
}