/*--------------------------------------------------
学生成绩管理系统
功能:添加、查询、修改、删除、保存、加载数据
--------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_STUDENTS 100
#define DATA_FILE "students.dat"
// 学生信息结构体
typedef struct {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
float score; // 成绩
int isActive; // 是否有效记录(0=已删除)
} Student;
Student students[MAX_STUDENTS]; // 学生数组
int studentCount = 0; // 当前学生数量
// 函数声明
void showMenu();
void addStudent();
void displayAll();
void searchStudent();
void updateScore();
void deleteStudent();
void saveToFile();
void loadFromFile();
int main() {
loadFromFile(); // 启动时加载数据
int choice;
do {
showMenu();
printf("请输入选项:");
scanf("%d", &choice);
switch(choice) {
case 1: addStudent(); break;
case 2: displayAll(); break;
case 3: searchStudent(); break;
case 4: updateScore(); break;
case 5: deleteStudent(); break;
case 6: saveToFile(); break;
case 0: printf("系统已退出\n"); break;
default: printf("无效选项!\n");
}
} while(choice != 0);
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(studentCount >= MAX_STUDENTS) {
printf("学生数量已达上限!\n");
return;
}
Student s;
printf("请输入学号:");
scanf("%d", &s.id);
printf("请输入姓名:");
scanf("%s", s.name);
printf("请输入成绩:");
scanf("%f", &s.score);
s.isActive = 1;
students[studentCount++] = s;
printf("添加成功!\n");
}
// 显示所有学生信息
void displayAll() {
printf("\n%-8s %-20s %-8s\n", "学号", "姓名", "成绩");
printf("--------------------------------\n");
for(int i = 0; i < studentCount; i++) {
if(students[i].isActive) {
printf("%-8d %-20s %-8.1f\n",
students[i].id,
students[i].name,
students[i].score);
}
}
}
// 查找学生信息
void searchStudent() {
int targetId;
printf("请输入要查找的学号:");
scanf("%d", &targetId);
for(int i = 0; i < studentCount; i++) {
if(students[i].isActive && students[i].id == targetId) {
printf("\n找到学生信息:\n");
printf("学号:%d\n姓名:%s\n成绩:%.1f\n",
students[i].id,
students[i].name,
students[i].score);
return;
}
}
printf("未找到该学生!\n");
}
// 修改学生成绩
void updateScore() {
int targetId;
printf("请输入要修改的学号:");
scanf("%d", &targetId);
for(int i = 0; i < studentCount; i++) {
if(students[i].isActive && students[i].id == targetId) {
printf("请输入新成绩:");
scanf("%f", &students[i].score);
printf("成绩修改成功!\n");
return;
}
}
printf("未找到该学生!\n");
}
// 删除学生记录(逻辑删除)
void deleteStudent() {
int targetId;
printf("请输入要删除的学号:");
scanf("%d", &targetId);
for(int i = 0; i < studentCount; i++) {
if(students[i].isActive && students[i].id == targetId) {
students[i].isActive = 0;
printf("删除成功!\n");
return;
}
}
printf("未找到该学生!\n");
}
// 保存数据到文件
void saveToFile() {
FILE *fp = fopen(DATA_FILE, "wb");
if(fp == NULL) {
printf("文件保存失败!\n");
return;
}
fwrite(students, sizeof(Student), studentCount, fp);
fclose(fp);
printf("数据保存成功!\n");
}
// 从文件加载数据
void loadFromFile() {
FILE *fp = fopen(DATA_FILE, "rb");
if(fp == NULL) return;
studentCount = fread(students, sizeof(Student), MAX_STUDENTS, fp);
fclose(fp);
}