此回答来自于wx公众号:一休哥助手
我可以帮你完成这个C语言任务!以下是任务的分步解决方案,包括总体设计、详细设计和代码实现:
系统总体设计:
功能模块:
- 输入选手数据:输入选手编号、姓名。
- 评委打分:每个选手由10位评委打分,计算总成绩和平均成绩(去掉最高分和最低分)。
- 成绩排序:根据选手的平均分进行排序。
- 数据查询:根据编号查询选手的成绩。
- 追加学生数据:追加新的选手数据。
- 写入数据文件:将选手数据写入到文件中保存。
- 退出系统:退出程序。
设计思路:
- 采用C语言设计,使用结构体来存储选手信息,包括编号、姓名、评委分数、总分和平均分。
- 数据结构:数组存储所有选手的数据。
- 主要技术:结构体、文件操作、排序算法(如冒泡排序)、输入输出操作等。
系统详细设计:
数据结构:
typedef struct {
int id; // 选手编号
char name[100]; // 选手姓名
float scores[10]; // 10个评委的分数
float total; // 总成绩
float average; // 平均成绩
} Singer;
关键算法流程:
- 计算总分和平均分:
- 排序:
- 数据查询:
- 文件操作:
代码设计:
#include <stdio.h>
#include <string.h>
#define MAX_SINGERS 100
typedef struct {
int id; // 选手编号
char name[100]; // 选手姓名
float scores[10]; // 10个评委的分数
float total; // 总成绩
float average; // 平均成绩
} Singer;
Singer singers[MAX_SINGERS]; // 存储选手数据
int singer_count = 0; // 选手数量
// 输入选手数据
void inputSingerData() {
if (singer_count >= MAX_SINGERS) {
printf("无法添加更多选手,已达到上限。\n");
return;
}
printf("输入选手编号: ");
scanf("%d", &singers[singer_count].id);
printf("输入选手姓名: ");
scanf("%s", singers[singer_count].name);
singer_count++;
}
// 评委打分并计算总成绩和平均分
void enterScores() {
for (int i = 0; i < singer_count; i++) {
printf("输入选手 %s 的10个评委打分: \n", singers[i].name);
float max = 0, min = 100, sum = 0;
for (int j = 0; j < 10; j++) {
scanf("%f", &singers[i].scores[j]);
sum += singers[i].scores[j];
if (singers[i].scores[j] > max) max = singers[i].scores[j];
if (singers[i].scores[j] < min) min = singers[i].scores[j];
}
singers[i].total = sum - max - min;
singers[i].average = singers[i].total / 8; // 去掉最高分和最低分后的平均分
}
}
// 按平均成绩排序
void sortSingers() {
for (int i = 0; i < singer_count - 1; i++) {
for (int j = 0; j < singer_count - i - 1; j++) {
if (singers[j].average < singers[j + 1].average) {
Singer temp = singers[j];
singers[j] = singers[j + 1];
singers[j + 1] = temp;
}
}
}
printf("按平均分排序后的选手列表:\n");
for (int i = 0; i < singer_count; i++) {
printf("编号: %d, 姓名: %s, 平均分: %.2f\n", singers[i].id, singers[i].name, singers[i].average);
}
}
// 根据编号查询选手数据
void querySingerData() {
int id;
printf("输入要查询的选手编号: ");
scanf("%d", &id);
for (int i = 0; i < singer_count; i++) {
if (singers[i].id == id) {
printf("编号: %d, 姓名: %s, 平均分: %.2f\n", singers[i].id, singers[i].name, singers[i].average);
return;
}
}
printf("未找到该选手。\n");
}
// 追加选手数据
void appendSingerData() {
inputSingerData();
}
// 将选手数据写入文件
void writeDataToFile() {
FILE *file = fopen("singer_data.txt", "w");
if (file == NULL) {
printf("无法打开文件。\n");
return;
}
for (int i = 0; i < singer_count; i++) {
fprintf(file, "编号: %d, 姓名: %s, 平均分: %.2f\n", singers[i].id, singers[i].name, singers[i].average);
}
fclose(file);
printf("数据已写入文件。\n");
}
// 主菜单
void showMenu() {
int choice;
do {
printf("\n1. 输入选手数据\n");
printf("2. 评委打分\n");
printf("3. 成绩排序\n");
printf("4. 数据查询\n");
printf("5. 追加选手数据\n");
printf("6. 写入数据文件\n");
printf("7. 退出系统\n");
printf("选择操作: ");
scanf("%d", &choice);
switch (choice) {
case 1:
inputSingerData();
break;
case 2:
enterScores();
break;
case 3:
sortSingers();
break;
case 4:
querySingerData();
break;
case 5:
appendSingerData();
break;
case 6:
writeDataToFile();
break;
case 7:
printf("退出系统。\n");
break;
default:
printf("无效选择,请重新输入。\n");
}
} while (choice != 7);
}
// 主函数
int main() {
showMenu();
return 0;
}
完整代码说明:
- 输入选手数据:函数
inputSingerData()
负责输入选手编号和姓名,并将数据存入数组。 - 评委打分:函数
enterScores()
负责输入每个选手的评委打分,并计算去掉最高分和最低分后的总分和平均分。 - 成绩排序:
sortSingers()
使用冒泡排序按平均分对选手进行排序。 - 数据查询:
querySingerData()
根据选手编号查询对应数据。 - 追加数据:通过
appendSingerData()
追加新的选手数据。 - 写入文件:
writeDataToFile()
将选手数据保存到文件。 - 主菜单:
showMenu()
控制整个系统的操作流程。
希望这个完整的C语言解决方案能帮你完成学长布置的任务!