#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX_STUDENTS 100
#define MAX_COURSES 10
#define MAX_NAME_LEN 20
#define FILENAME "D:\\luojh\\Documents\\学生成绩管理系统\\student_grades.txt"
#define ADMIN_PASSWORD "admin123"
typedef struct {
int id;
char name[MAX_NAME_LEN];
char className[MAX_NAME_LEN];
} Student;
typedef struct {
int id;
char name[MAX_NAME_LEN];
} Course;
typedef struct {
int studentId;
int courseId;
float score;
} Score;
typedef struct {
Student students[MAX_STUDENTS];
Course courses[MAX_COURSES];
Score scores[MAX_STUDENTS * MAX_COURSES];
int studentCount;
int courseCount;
int scoreCount;
} GradeSystem;
// 函数声明
void initSystem(GradeSystem *sys);
int login();
void adminMenu(GradeSystem *sys);
void userMenu(GradeSystem *sys);
void saveToFile(GradeSystem *sys);
void loadFromFile(GradeSystem *sys);
void addStudent(GradeSystem *sys);
void deleteStudent(GradeSystem *sys);
void modifyStudent(GradeSystem *sys);
void findStudent(GradeSystem *sys);
void addCourse(GradeSystem *sys);
void deleteCourse(GradeSystem *sys);
void modifyCourse(GradeSystem *sys);
void findCourse(GradeSystem *sys);
void inputScore(GradeSystem *sys);
void displayAll(GradeSystem *sys);
float findScore(GradeSystem *sys, int studentId, int courseId);
int findStudentIndex(GradeSystem *sys, int id); // 新增:查找学生索引
int main() {
GradeSystem sys;
initSystem(&sys);
loadFromFile(&sys);
int userType = login();
if(userType == 1) {
adminMenu(&sys);
} else {
userMenu(&sys);
}
saveToFile(&sys);
printf("\n系统已退出,数据已保存。\n");
return 0;
}
void initSystem(GradeSystem *sys) {
sys->studentCount = 0;
sys->courseCount = 0;
sys->scoreCount = 0;
// 初始化三门核心课程
strcpy(sys->courses[0].name, "高等数学");
sys->courses[0].id = 1;
strcpy(sys->courses[1].name, "程序设计基础");
sys->courses[1].id = 2;
strcpy(sys->courses[2].name, "线性代数");
sys->courses[2].id = 3;
sys->courseCount = 3;
}
int login() {
int choice;
char password[20];
printf("\n=== 学生成绩管理系统 ===\n");
printf("1. 管理员登录\n");
printf("2. 普通用户登录\n");
printf("请选择角色: ");
scanf("%d", &choice);
if(choice == 1) {
printf("请输入管理员密码: ");
scanf("%s", password);
if(strcmp(password, ADMIN_PASSWORD) == 0) {
return 1;
} else {
printf("密码错误!\n");
exit(0);
}
}
return 2;
}
void adminMenu(GradeSystem *sys) {
int choice;
do {
printf("\n=== 管理员菜单 ===\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("9. 录入成绩\n");
printf("10. 显示所有信息\n");
printf("0. 退出系统\n");
printf("请选择操作: ");
scanf("%d", &choice);
switch(choice) {
case 1: addStudent(sys); break;
case 2: deleteStudent(sys); break;
case 3: modifyStudent(sys); break;
case 4: findStudent(sys); break;
case 5: addCourse(sys); break;
case 6: deleteCourse(sys); break;
case 7: modifyCourse(sys); break;
case 8: findCourse(sys); break;
case 9: inputScore(sys); break;
case 10: displayAll(sys); break;
case 0: saveToFile(sys); break;
default: printf("无效选择!\n");
}
} while(choice != 0);
}
void userMenu(GradeSystem *sys) {
int choice;
do {
printf("\n=== 普通用户菜单 ===\n");
printf("1. 查找学生\n");
printf("2. 查找课程\n");
printf("3. 显示所有信息\n");
printf("0. 退出系统\n");
printf("请选择操作: ");
scanf("%d", &choice);
switch(choice) {
case 1: findStudent(sys); break;
case 2: findCourse(sys); break;
case 3: displayAll(sys); break;
case 0: break;
default: printf("无效选择!\n");
}
} while(choice != 0);
}
void saveToFile(GradeSystem *sys) {
FILE *fp = fopen(FILENAME, "w");
if(fp == NULL) {
printf("无法打开文件进行写入!\n");
return;
}
// 保存学生信息
fprintf(fp, "[Students]\n");
for(int i = 0; i < sys->studentCount; i++) {
fprintf(fp, "%d,%s,%s\n",
sys->students[i].id,
sys->students[i].name,
sys->students[i].className);
}
// 保存课程信息
fprintf(fp, "[Courses]\n");
for(int i = 0; i < sys->courseCount; i++) {
fprintf(fp, "%d,%s\n",
sys->courses[i].id,
sys->courses[i].name);
}
// 保存成绩信息
fprintf(fp, "[Scores]\n");
for(int i = 0; i < sys->scoreCount; i++) {
fprintf(fp, "%d,%d,%.1f\n",
sys->scores[i].studentId,
sys->scores[i].courseId,
sys->scores[i].score);
}
fclose(fp);
printf("数据已成功保存到文件\n");
}
void loadFromFile(GradeSystem *sys) {
FILE *fp = fopen(FILENAME, "r");
if(fp == NULL) {
printf("文件不存在,将创建新文件。\n");
return;
}
char line[100];
int section = 0; // 0: none, 1: students, 2: courses, 3: scores
// 重置计数器
sys->studentCount = 0;
sys->courseCount = 0;
sys->scoreCount = 0;
while(fgets(line, sizeof(line), fp)) {
// 移除换行符
if(line[strlen(line)-1] == '\n')
line[strlen(line)-1] = '\0';
if(strcmp(line, "[Students]") == 0) {
section = 1;
continue;
} else if(strcmp(line, "[Courses]") == 0) {
section = 2;
continue;
} else if(strcmp(line, "[Scores]") == 0) {
section = 3;
continue;
}
switch(section) {
case 1: {
Student s;
char *token = strtok(line, ",");
if(token == NULL) {
printf("学生数据格式错误: %s\n", line);
continue;
}
s.id = atoi(token);
token = strtok(NULL, ",");
if(token == NULL) {
printf("学生数据格式错误: %s\n", line);
continue;
}
strcpy(s.name, token);
token = strtok(NULL, ",");
if(token == NULL) {
printf("学生数据格式错误: %s\n", line);
continue;
}
strcpy(s.className, token);
sys->students[sys->studentCount++] = s;
break;
}
case 2: {
Course c;
char *token = strtok(line, ",");
if(token == NULL) {
printf("课程数据格式错误: %s\n", line);
continue;
}
c.id = atoi(token);
token = strtok(NULL, ",");
if(token == NULL) {
printf("课程数据格式错误: %s\n", line);
continue;
}
strcpy(c.name, token);
sys->courses[sys->courseCount++] = c;
break;
}
case 3: {
Score sc;
char *token = strtok(line, ",");
if(token == NULL) {
printf("成绩数据格式错误: %s\n", line);
continue;
}
sc.studentId = atoi(token);
token = strtok(NULL, ",");
if(token == NULL) {
printf("成绩数据格式错误: %s\n", line);
continue;
}
sc.courseId = atoi(token);
token = strtok(NULL, ",");
if(token == NULL) {
printf("成绩数据格式错误: %s\n", line);
continue;
}
sc.score = atof(token);
sys->scores[sys->scoreCount++] = sc;
break;
}
}
}
fclose(fp);
printf("成功加载 %d 名学生, %d 门课程, %d 条成绩记录\n",
sys->studentCount, sys->courseCount, sys->scoreCount);
}
// 新增:查找学生索引
int findStudentIndex(GradeSystem *sys, int id) {
for(int i = 0; i < sys->studentCount; i++) {
if(sys->students[i].id == id) {
return i;
}
}
return -1; // 未找到
}
void addStudent(GradeSystem *sys) {
if(sys->studentCount >= MAX_STUDENTS) {
printf("学生数量已达上限!\n");
return;
}
Student s;
printf("输入学号: ");
scanf("%d", &s.id);
// 检查学号是否已存在
if(findStudentIndex(sys, s.id) != -1) {
printf("该学号已存在!\n");
return;
}
printf("输入姓名: ");
scanf("%s", s.name);
printf("输入班级: ");
scanf("%s", s.className);
sys->students[sys->studentCount++] = s;
saveToFile(sys);
printf("学生添加成功!\n");
}
void deleteStudent(GradeSystem *sys) {
int id;
printf("输入要删除的学生学号: ");
scanf("%d", &id);
int index = findStudentIndex(sys, id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
// 移除学生记录
for(int j = index; j < sys->studentCount-1; j++) {
sys->students[j] = sys->students[j+1];
}
sys->studentCount--;
// 删除该学生的所有成绩
for(int i = 0; i < sys->scoreCount; i++) {
if(sys->scores[i].studentId == id) {
for(int j = i; j < sys->scoreCount-1; j++) {
sys->scores[j] = sys->scores[j+1];
}
sys->scoreCount--;
i--;
}
}
saveToFile(sys);
printf("学生删除成功!\n");
}
void modifyStudent(GradeSystem *sys) {
int id;
printf("输入要修改的学生学号: ");
scanf("%d", &id);
int index = findStudentIndex(sys, id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
printf("输入新姓名(当前: %s): ", sys->students[index].name);
scanf("%s", sys->students[index].name);
printf("输入新班级(当前: %s): ", sys->students[index].className);
scanf("%s", sys->students[index].className);
saveToFile(sys);
printf("修改成功!\n");
}
void findStudent(GradeSystem *sys) {
int id;
printf("输入要查找的学生学号: ");
scanf("%d", &id);
int index = findStudentIndex(sys, id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
printf("\n=== 学生信息 ===\n");
printf("学号: %d\n姓名: %s\n班级: %s\n",
sys->students[index].id,
sys->students[index].name,
sys->students[index].className);
// 显示该学生的成绩
printf("\n=== 成绩信息 ===\n");
for(int j = 0; j < sys->courseCount; j++) {
float score = findScore(sys, id, sys->courses[j].id);
if(score >= 0) {
printf("%s: %.1f\n", sys->courses[j].name, score);
} else {
printf("%s: 未录入\n", sys->courses[j].name);
}
}
}
void addCourse(GradeSystem *sys) {
if(sys->courseCount >= MAX_COURSES) {
printf("课程数量已达上限!\n");
return;
}
Course c;
printf("输入课程编号: ");
scanf("%d", &c.id);
// 检查课程编号是否已存在
for(int i = 0; i < sys->courseCount; i++) {
if(sys->courses[i].id == c.id) {
printf("该课程编号已存在!\n");
return;
}
}
printf("输入课程名称: ");
scanf("%s", c.name);
sys->courses[sys->courseCount++] = c;
saveToFile(sys);
printf("课程添加成功!\n");
}
void deleteCourse(GradeSystem *sys) {
int id;
printf("输入要删除的课程编号: ");
scanf("%d", &id);
// 不允许删除系统默认的三门课程
if(id >= 1 && id <= 3) {
printf("系统默认课程不允许删除!\n");
return;
}
for(int i = 0; i < sys->courseCount; i++) {
if(sys->courses[i].id == id) {
for(int j = i; j < sys->courseCount-1; j++) {
sys->courses[j] = sys->courses[j+1];
}
sys->courseCount--;
// 删除该课程的所有成绩
for(int i = 0; i < sys->scoreCount; i++) {
if(sys->scores[i].courseId == id) {
for(int j = i; j < sys->scoreCount-1; j++) {
sys->scores[j] = sys->scores[j+1];
}
sys->scoreCount--;
i--;
}
}
saveToFile(sys);
printf("课程删除成功!\n");
return;
}
}
printf("未找到该课程!\n");
}
void modifyCourse(GradeSystem *sys) {
int id;
printf("输入要修改的课程编号: ");
scanf("%d", &id);
for(int i = 0; i < sys->courseCount; i++) {
if(sys->courses[i].id == id) {
printf("输入新课程名称(当前: %s): ", sys->courses[i].name);
scanf("%s", sys->courses[i].name);
saveToFile(sys);
printf("修改成功!\n");
return;
}
}
printf("未找到该课程!\n");
}
void findCourse(GradeSystem *sys) {
int id;
printf("输入要查找的课程编号: ");
scanf("%d", &id);
for(int i = 0; i < sys->courseCount; i++) {
if(sys->courses[i].id == id) {
printf("\n=== 课程信息 ===\n");
printf("课程编号: %d\n课程名称: %s\n",
sys->courses[i].id,
sys->courses[i].name);
// 显示选修该课程的学生成绩
printf("\n=== 学生成绩信息 ===\n");
for(int j = 0; j < sys->studentCount; j++) {
float score = findScore(sys, sys->students[j].id, id);
if(score >= 0) {
printf("%s (学号:%d): %.1f\n",
sys->students[j].name,
sys->students[j].id,
score);
}
}
return;
}
}
printf("未找到该课程!\n");
}
void inputScore(GradeSystem *sys) {
int studentId, courseId;
float score;
printf("输入学生学号: ");
scanf("%d", &studentId);
printf("输入课程编号: ");
scanf("%d", &courseId);
// 检查学生和课程是否存在
int studentExists = 0, courseExists = 0;
for(int i = 0; i < sys->studentCount; i++) {
if(sys->students[i].id == studentId) {
studentExists = 1;
break;
}
}
for(int i = 0; i < sys->courseCount; i++) {
if(sys->courses[i].id == courseId) {
courseExists = 1;
break;
}
}
if(!studentExists || !courseExists) {
printf("学生或课程不存在!\n");
return;
}
printf("输入成绩: ");
scanf("%f", &score);
// 检查成绩范围
if(score < 0 || score > 100) {
printf("成绩必须在0-100之间!\n");
return;
}
// 检查是否已有成绩记录
for(int i = 0; i < sys->scoreCount; i++) {
if(sys->scores[i].studentId == studentId &&
sys->scores[i].courseId == courseId) {
sys->scores[i].score = score;
saveToFile(sys);
printf("成绩更新成功!\n");
return;
}
}
// 添加新成绩
if(sys->scoreCount < MAX_STUDENTS * MAX_COURSES) {
sys->scores[sys->scoreCount].studentId = studentId;
sys->scores[sys->scoreCount].courseId = courseId;
sys->scores[sys->scoreCount].score = score;
sys->scoreCount++;
saveToFile(sys);
printf("成绩录入成功!\n");
} else {
printf("成绩记录已达上限!\n");
}
}
// 查找特定学生和课程的成绩
float findScore(GradeSystem *sys, int studentId, int courseId) {
for(int i = 0; i < sys->scoreCount; i++) {
if(sys->scores[i].studentId == studentId &&
sys->scores[i].courseId == courseId) {
return sys->scores[i].score;
}
}
return -1; // 未找到成绩
}
// 显示所有信息
void displayAll(GradeSystem *sys) {
// 显示学生信息
printf("\n=== 学生信息 (%d 人) ===\n", sys->studentCount);
printf("%-10s %-15s %-15s\n", "学号", "姓名", "班级");
for(int i = 0; i < sys->studentCount; i++) {
printf("%-10d %-15s %-15s\n",
sys->students[i].id,
sys->students[i].name,
sys->students[i].className);
}
// 显示课程信息
printf("\n=== 课程信息 (%d 门) ===\n", sys->courseCount);
printf("%-10s %-15s\n", "课程号", "课程名");
for(int i = 0; i < sys->courseCount; i++) {
printf("%-10d %-15s\n",
sys->courses[i].id,
sys->courses[i].name);
}
// 显示成绩信息
printf("\n=== 成绩信息 ===\n");
if(sys->studentCount == 0) {
printf("当前没有学生记录!\n");
return;
}
// 打印表头
printf("%-10s %-15s %-15s", "学号", "姓名", "班级");
for(int i = 0; i < sys->courseCount; i++) {
printf(" %-15s", sys->courses[i].name);
}
printf("\n");
// 打印每个学生的所有成绩
for(int i = 0; i < sys->studentCount; i++) {
printf("%-10d %-15s %-15s",
sys->students[i].id,
sys->students[i].name,
sys->students[i].className);
for(int j = 0; j < sys->courseCount; j++) {
float score = findScore(sys, sys->students[i].id, sys->courses[j].id);
if(score >= 0) {
printf(" %-15.1f", score);
} else {
printf(" %-15s", "未录入");
}
}
printf("\n");
}
}请你直接上手修改,帮我解决这个问题