#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STUDENTS 100
#define FILENAME "students.dat"
typedef struct {
char id[12]; // 学号
char name[20]; // 姓名
float chinese; // 语文成绩
float math; // 数学成绩
float english; // 英语成绩
float total; // 总成绩
} Student;
Student students[MAX_STUDENTS];
int count = 0;
// 函数声明
void addStudent();
void displayAll();
void searchStudent();
void modifyStudent();
void deleteStudent();
void saveToFile();
void loadFromFile();
void showMenu();
void clearInputBuffer();
int main() {
loadFromFile();
while(1) {
showMenu();
int choice;
printf("请输入选项:");
scanf("%d", &choice);
clearInputBuffer();
switch(choice) {
case 1: addStudent(); break;
case 2: displayAll(); break;
case 3: searchStudent(); break;
case 4: modifyStudent(); break;
case 5: deleteStudent(); break;
case 6: saveToFile(); break;
case 0:
saveToFile();
printf("感谢使用,再见!\n");
exit(0);
default:
printf("无效选项,请重新输入!\n");
}
}
return 0;
}
void showMenu() {
printf("\n===== 学生成绩管理系统 =====\n");
printf("1. 添加学生信息\n");
printf("2. 显示所有学生\n");
printf("3. 查找学生信息\n");
printf("4. 修改学生成绩\n");
printf("5. 删除学生记录\n");
printf("6. 立即保存数据\n");
printf("0. 退出系统\n");
printf("===========================\n");
}
void addStudent() {
if(count >= MAX_STUDENTS) {
printf("学生数量已达上限!\n");
return;
}
Student s;
printf("\n--- 添加学生信息 ---\n");
// 输入学号
while(1) {
printf("请输入学号(11位数字):");
scanf("%11s", s.id);
clearInputBuffer();
// 验证学号唯一性
int exists = 0;
for(int i=0; i<count; i++) {
if(strcmp(students[i].id, s.id) == 0) {
exists = 1;
break;
}
}
if(strlen(s.id) != 11 || !isdigit(s.id[0])) {
printf("学号格式错误!\n");
} else if(exists) {
printf("该学号已存在!\n");
} else {
break;
}
}
// 输入姓名
printf("请输入姓名:");
scanf("%19s", s.name);
clearInputBuffer();
// 输入成绩
printf("请输入语文成绩:");
while(scanf("%f", &s.chinese) != 1 || s.chinese <0 || s.chinese >150) {
printf("成绩无效,请重新输入(0-150):");
clearInputBuffer();
}
printf("请输入数学成绩:");
while(scanf("%f", &s.math) != 1 || s.math <0 || s.math >150) {
printf("成绩无效,请重新输入(0-150):");
clearInputBuffer();
}
printf("请输入英语成绩:");
while(scanf("%f", &s.english) != 1 || s.english <0 || s.english >150) {
printf("成绩无效,请重新输入(0-150):");
clearInputBuffer();
}
// 计算总分
s.total = s.chinese + s.math + s.english;
students[count++] = s;
printf("学生信息添加成功!\n");
}
void displayAll() {
if(count == 0) {
printf("当前没有学生记录!\n");
return;
}
printf("\n%-12s %-20s %-8s %-8s %-8s %-8s\n",
"学号", "姓名", "语文", "数学", "英语", "总分");
printf("------------------------------------------------------------\n");
for(int i=0; i<count; i++) {
printf("%-12s %-20s %-8.1f %-8.1f %-8.1f %-8.1f\n",
students[i].id,
students[i].name,
students[i].chinese,
students[i].math,
students[i].english,
students[i].total);
}
}
void searchStudent() {
char target[20];
int found = 0;
printf("\n请输入要查找的学号或姓名:");
scanf("%19s", target);
clearInputBuffer();
printf("\n查询结果:\n");
printf("%-12s %-20s %-8s %-8s %-8s %-8s\n",
"学号", "姓名", "语文", "数学", "英语", "总分");
for(int i=0; i<count; i++) {
if(strcmp(students[i].id, target) == 0 ||
strcmp(students[i].name, target) == 0) {
printf("%-12s %-20s %-8.1f %-8.1f %-8.1f %-8.1f\n",
students[i].id,
students[i].name,
students[i].chinese,
students[i].math,
students[i].english,
students[i].total);
found = 1;
}
}
if(!found) {
printf("未找到匹配的学生记录!\n");
}
}
void modifyStudent() {
char id[12];
int index = -1;
printf("\n请输入要修改的学号:");
scanf("%11s", id);
clearInputBuffer();
// 查找学生
for(int i=0; i<count; i++) {
if(strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if(index == -1) {
printf("未找到该学生记录!\n");
return;
}
printf("\n当前信息:\n");
printf("1. 语文成绩:%.1f\n", students[index].chinese);
printf("2. 数学成绩:%.1f\n", students[index].math);
printf("3. 英语成绩:%.1f\n", students[index].english);
int choice;
printf("请选择要修改的项目(1-3):");
scanf("%d", &choice);
clearInputBuffer();
float newScore;
printf("请输入新成绩:");
while(scanf("%f", &newScore) != 1 || newScore <0 || newScore >150) {
printf("成绩无效,请重新输入(0-150):");
clearInputBuffer();
}
switch(choice) {
case 1: students[index].chinese = newScore; break;
case 2: students[index].math = newScore; break;
case 3: students[index].english = newScore; break;
default:
printf("无效选项!\n");
return;
}
// 重新计算总分
students[index].total = students[index].chinese
+ students[index].math
+ students[index].english;
printf("成绩修改成功!\n");
}
void deleteStudent() {
char id[12];
int index = -1;
printf("\n请输入要删除的学号:");
scanf("%11s", id);
clearInputBuffer();
// 查找学生
for(int i=0; i<count; i++) {
if(strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if(index == -1) {
printf("未找到该学生记录!\n");
return;
}
// 确认删除
char confirm;
printf("确定要删除 %s 的记录吗?(y/n): ", students[index].name);
scanf("%c", &confirm);
clearInputBuffer();
if(confirm == 'y' || confirm == 'Y') {
// 移动数组元素
for(int i=index; i<count-1; i++) {
students[i] = students[i+1];
}
count--;
printf("记录删除成功!\n");
} else {
printf("取消删除操作\n");
}
}
void saveToFile() {
FILE *fp = fopen(FILENAME, "wb");
if(fp == NULL) {
perror("保存文件失败");
return;
}
fwrite(&count, sizeof(int), 1, fp);
fwrite(students, sizeof(Student), count, fp);
fclose(fp);
printf("数据保存成功!\n");
}
void loadFromFile() {
FILE *fp = fopen(FILENAME, "rb");
if(fp == NULL) {
printf("未找到数据文件,将创建新文件\n");
return;
}
fread(&count, sizeof(int), 1, fp);
fread(students, sizeof(Student), count, fp);
fclose(fp);
printf("数据加载成功,共加载 %d 条记录\n", count);
}
void clearInputBuffer() {
while(getchar() != '\n');
}