c语言编程 要求设计一个校园主持人大赛成绩管理系统,以菜单选项的方式完成相应的 功能,主要功能需求如下: + (1)参赛选手比赛成绩录入+ 设参加比赛的选手不超过50人,有7位现场评委对选手的综合表现打分, 每位选手比赛结束后,要求通过该系统录入比赛成绩,信息录入参考如下格式: 选手编号:1. 姓名:李小萌, 评委成绩1:95. 评委成绩2:90. 评委成绩3:98. 评委成绩4:89. 评委成绩5:86. 评委成绩6:92. 评委成绩7:96- 录入一名选手的成绩后,程序应提示是否录入下一项(Y/N),以便用户可以 录入多条记录,信息录入完毕后数据写入文件。 (2)参赛选手综合成绩计算。 从文件中读取参赛选手信息,从7名现场评委的成绩中去掉一个最高分、去 掉一个最低分,取剩下5个成绩的平均值作为选手的最后成绩,要求显示各选手 的详细得分和综合成绩。 (3)参赛选手成绩排名。 根据参赛选手的最后得分,按得分从高到低的顺序输出所有参赛选手的得分
时间: 2024-03-25 21:36:03 浏览: 54
C语言编程 学生成绩管理系统
好的,这是一个简单的校园主持人大赛成绩管理系统,主要有三个功能:录入比赛成绩、计算综合成绩以及排名。这里给出C语言的实现思路,希望能对你有所帮助。
首先,我们需要定义一个结构体来保存选手信息,包括编号、姓名和7名评委的成绩。代码如下:
```c
struct player {
int id; // 选手编号
char name[20]; // 选手姓名
float score[7]; // 评委成绩
float final_score; // 最终得分
};
```
接下来,我们需要实现三个主要功能。
1. 录入比赛成绩。
这个功能需要从用户输入中读取选手信息,并将其写入文件中。可以使用循环来实现多次录入,直到用户选择不再录入为止。代码如下:
```c
void input_score() {
FILE* fp = fopen("player.txt", "a"); // 打开文件,以追加模式写入
if (fp == NULL) {
printf("File open failed!\n");
return;
}
struct player p;
char choice;
do {
printf("请输入选手编号:");
scanf("%d", &p.id);
printf("请输入选手姓名:");
scanf("%s", p.name);
for (int i = 0; i < 7; i++) {
printf("请输入第%d位评委的成绩:", i+1);
scanf("%f", &p.score[i]);
}
fwrite(&p, sizeof(struct player), 1, fp); // 将选手信息写入文件中
printf("是否录入下一项(Y/N):");
scanf(" %c", &choice);
} while (choice == 'Y' || choice == 'y');
fclose(fp); // 关闭文件
}
```
2. 计算综合成绩。
这个功能需要从文件中读取选手信息,并计算出每个选手的最终得分。可以使用结构体数组来保存所有选手的信息,然后对每个选手的7个成绩排序,去掉一个最高分和一个最低分,再计算剩下5个成绩的平均值。最后将每个选手的最终得分保存到结构体数组中。代码如下:
```c
void calculate_score() {
FILE* fp = fopen("player.txt", "r"); // 打开文件,以只读模式读取
if (fp == NULL) {
printf("File open failed!\n");
return;
}
struct player players[50];
int count = 0;
while (fread(&players[count], sizeof(struct player), 1, fp) == 1) { // 从文件中读取选手信息
float sum = 0;
float max_score = 0, min_score = 100;
for (int i = 0; i < 7; i++) {
sum += players[count].score[i];
if (players[count].score[i] > max_score) {
max_score = players[count].score[i];
}
if (players[count].score[i] < min_score) {
min_score = players[count].score[i];
}
}
players[count].final_score = (sum - max_score - min_score) / 5; // 计算最终得分
count++;
}
fclose(fp); // 关闭文件
// 显示每个选手的详细得分和最终得分
for (int i = 0; i < count; i++) {
printf("选手编号:%d 姓名:%s\n", players[i].id, players[i].name);
printf("评委成绩:");
for (int j = 0; j < 7; j++) {
printf("%.2f ", players[i].score[j]);
}
printf("\n最终得分:%.2f\n", players[i].final_score);
}
}
```
3. 排名选手得分。
这个功能需要先调用上一个功能来计算每个选手的最终得分,然后按照最终得分从高到低对所有选手进行排序,并输出排名结果。可以使用快速排序算法来实现排序。代码如下:
```c
int partition(struct player* players, int low, int high) {
float pivot = players[high].final_score;
int i = low - 1;
for (int j = low; j < high; j++) {
if (players[j].final_score >= pivot) {
i++;
struct player temp = players[i];
players[i] = players[j];
players[j] = temp;
}
}
struct player temp = players[i+1];
players[i+1] = players[high];
players[high] = temp;
return i + 1;
}
void quicksort(struct player* players, int low, int high) {
if (low < high) {
int pi = partition(players, low, high);
quicksort(players, low, pi-1);
quicksort(players, pi+1, high);
}
}
void rank_score() {
calculate_score(); // 先计算每个选手的最终得分
FILE* fp = fopen("rank.txt", "w"); // 打开文件,以写入模式写入
if (fp == NULL) {
printf("File open failed!\n");
return;
}
struct player players[50];
int count = 0;
fseek(fp, 0, SEEK_SET); // 将文件指针移到文件开头
while (fread(&players[count], sizeof(struct player), 1, fp) == 1) { // 从文件中读取选手信息
count++;
}
quicksort(players, 0, count-1); // 对所有选手按照最终得分从高到低排序
for (int i = 0; i < count; i++) { // 输出排名结果
fprintf(fp, "第%d名 选手编号:%d 姓名:%s 最终得分:%.2f\n", i+1, players[i].id, players[i].name, players[i].final_score);
}
fclose(fp); // 关闭文件
printf("排名结果已保存到rank.txt文件中\n");
}
```
以上就是一个简单的校园主持人大赛成绩管理系统的实现。注意,在实际使用中还需要做好文件读写出错的处理,以及对用户输入的合法性进行检查等。
阅读全文