编写一个菜单驱动的学生成绩管理程序,要求如下: 1)能输入并显示n个学生m门考试科目的成绩、总分和平均分。 2)按总分由高到低排序。 3)任意输入一个学号,能显示该学生的姓名、各门功课的成绩。 4)备份学生成绩的数据文件。 5)在用户输入数据有错误(如数据类型)或无效时,不会中断程序的执行,程序具有一定健壮性。
时间: 2023-06-19 07:03:31 浏览: 65
下面是一个简单的学生成绩管理程序,实现了上述要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
#define MAX_SUBJECT 10
#define FILENAME "data.txt"
struct student {
char name[20];
int id;
int score[MAX_SUBJECT];
int total;
float avg;
};
struct student students[MAX_STUDENT];
int n = 0; // 学生数目
// 显示菜单
void display_menu() {
printf("1. 输入学生成绩\n");
printf("2. 按总分排序\n");
printf("3. 按学号查找\n");
printf("4. 备份数据\n");
printf("5. 退出程序\n");
}
// 输入学生成绩
void input_scores() {
printf("请输入学生数目:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
struct student *s = &students[i];
printf("请输入第%d个学生的姓名和学号:", i+1);
scanf("%s %d", s->name, &s->id);
printf("请输入第%d个学生的成绩:", i+1);
s->total = 0;
for (int j = 0; j < MAX_SUBJECT; j++) {
scanf("%d", &s->score[j]);
s->total += s->score[j];
}
s->avg = (float)s->total / MAX_SUBJECT;
}
printf("输入完成!\n");
}
// 按总分排序
void sort_by_total() {
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (students[i].total < students[j].total) {
struct student tmp = students[i];
students[i] = students[j];
students[j] = tmp;
}
}
}
printf("排序完成!\n");
}
// 按学号查找
void find_by_id() {
int id, found = 0;
printf("请输入学号:");
scanf("%d", &id);
for (int i = 0; i < n; i++) {
struct student *s = &students[i];
if (s->id == id) {
printf("姓名:%s\n", s->name);
printf("学号:%d\n", s->id);
printf("成绩:");
for (int j = 0; j < MAX_SUBJECT; j++) {
printf("%d ", s->score[j]);
}
printf("\n");
found = 1;
break;
}
}
if (!found) {
printf("未找到该学生!\n");
}
}
// 备份数据
void backup_data() {
FILE *fp;
if ((fp = fopen(FILENAME, "w")) == NULL) {
printf("无法打开文件!\n");
return;
}
for (int i = 0; i < n; i++) {
struct student *s = &students[i];
fprintf(fp, "%s %d ", s->name, s->id);
for (int j = 0; j < MAX_SUBJECT; j++) {
fprintf(fp, "%d ", s->score[j]);
}
fprintf(fp, "\n");
}
fclose(fp);
printf("备份完成!\n");
}
int main() {
int choice;
while (1) {
display_menu();
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
input_scores();
break;
case 2:
sort_by_total();
break;
case 3:
find_by_id();
break;
case 4:
backup_data();
break;
case 5:
printf("程序已退出!\n");
exit(0);
default:
printf("无效选项,请重新输入!\n");
}
}
return 0;
}
```
这个程序使用了结构体来表示学生,其中包含了姓名、学号、各门课程的成绩、总分和平均分等信息。使用一个全局数组来保存所有学生的信息。输入成绩时,从标准输入中读取学生的姓名、学号和各门课程的成绩,计算总分和平均分并保存到结构体中。排序时,使用冒泡排序算法按总分从高到低排序。查找时,从标准输入中读取学号并在学生数组中查找对应的学生信息。备份数据时,将所有学生的信息写入到文件中。程序通过一个无限循环来不断显示菜单并读取用户的选项。如果用户输入了无效的选项,程序会提示用户重新输入。