学生信息管理系统 (C语言实现)
下面是一个完整的学生信息管理系统的C语言代码实现,包含添加、删除、修改、查询和显示所有学生信息的功能。

(图片来源网络,侵删)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 50
#define ID_LEN 10
// 学生结构体
typedef struct {
char id[ID_LEN]; // 学号
char name[MAX_NAME_LEN]; // 姓名
int age; // 年龄
float score; // 成绩
} Student;
// 全局变量
Student students[MAX_STUDENTS];
int studentCount = 0;
// 函数声明
void addStudent();
void deleteStudent();
void modifyStudent();
void searchStudent();
void displayAllStudents();
void saveToFile();
void loadFromFile();
void displayMenu();
int main() {
loadFromFile(); // 程序启动时加载数据
int choice;
do {
displayMenu();
printf("请输入您的选择: ");
scanf("%d", &choice);
getchar(); // 清除输入缓冲区中的换行符
switch(choice) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
modifyStudent();
break;
case 4:
searchStudent();
break;
case 5:
displayAllStudents();
break;
case 6:
saveToFile();
printf("数据已保存,程序退出,\n");
break;
default:
printf("无效的选择,请重新输入,\n");
}
} while(choice != 6);
return 0;
}
// 显示菜单
void displayMenu() {
printf("\n========== 学生信息管理系统 ==========\n");
printf("1. 添加学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 查询学生信息\n");
printf("5. 显示所有学生信息\n");
printf("6. 保存并退出\n");
printf("=====================================\n");
}
// 添加学生信息
void addStudent() {
if(studentCount >= MAX_STUDENTS) {
printf("学生数量已达上限,无法添加,\n");
return;
}
Student s;
printf("请输入学号: ");
scanf("%s", s.id);
getchar(); // 清除输入缓冲区中的换行符
// 检查学号是否已存在
for(int i = 0; i < studentCount; i++) {
if(strcmp(students[i].id, s.id) == 0) {
printf("该学号已存在,添加失败,\n");
return;
}
}
printf("请输入姓名: ");
scanf("%s", s.name);
getchar();
printf("请输入年龄: ");
scanf("%d", &s.age);
getchar();
printf("请输入成绩: ");
scanf("%f", &s.score);
getchar();
students[studentCount++] = s;
printf("学生信息添加成功,\n");
}
// 删除学生信息
void deleteStudent() {
if(studentCount == 0) {
printf("没有学生信息可删除,\n");
return;
}
char id[ID_LEN];
printf("请输入要删除的学生学号: ");
scanf("%s", id);
getchar();
int found = 0;
for(int i = 0; i < studentCount; i++) {
if(strcmp(students[i].id, id) == 0) {
found = 1;
// 将后面的学生前移
for(int j = i; j < studentCount - 1; j++) {
students[j] = students[j + 1];
}
studentCount--;
printf("学生信息删除成功,\n");
break;
}
}
if(!found) {
printf("未找到该学号的学生,\n");
}
}
// 修改学生信息
void modifyStudent() {
if(studentCount == 0) {
printf("没有学生信息可修改,\n");
return;
}
char id[ID_LEN];
printf("请输入要修改的学生学号: ");
scanf("%s", id);
getchar();
int found = 0;
for(int i = 0; i < studentCount; i++) {
if(strcmp(students[i].id, id) == 0) {
found = 1;
printf("当前学生信息:\n");
printf("学号: %s, 姓名: %s, 年龄: %d, 成绩: %.2f\n",
students[i].id, students[i].name, students[i].age, students[i].score);
printf("请输入新的姓名(直接回车保持不变): ");
char newName[MAX_NAME_LEN];
fgets(newName, MAX_NAME_LEN, stdin);
newName[strcspn(newName, "\n")] = '\0'; // 去除换行符
if(strlen(newName) > 0) {
strcpy(students[i].name, newName);
}
printf("请输入新的年龄(输入0保持不变): ");
int newAge;
scanf("%d", &newAge);
getchar();
if(newAge > 0) {
students[i].age = newAge;
}
printf("请输入新的成绩(输入-1保持不变): ");
float newScore;
scanf("%f", &newScore);
getchar();
if(newScore >= 0) {
students[i].score = newScore;
}
printf("学生信息修改成功,\n");
break;
}
}
if(!found) {
printf("未找到该学号的学生,\n");
}
}
// 查询学生信息
void searchStudent() {
if(studentCount == 0) {
printf("没有学生信息可查询,\n");
return;
}
int choice;
printf("请选择查询方式:\n");
printf("1. 按学号查询\n");
printf("2. 按姓名查询\n");
printf("请输入选择: ");
scanf("%d", &choice);
getchar();
if(choice == 1) {
char id[ID_LEN];
printf("请输入要查询的学生学号: ");
scanf("%s", id);
getchar();
int found = 0;
for(int i = 0; i < studentCount; i++) {
if(strcmp(students[i].id, id) == 0) {
printf("学号: %s, 姓名: %s, 年龄: %d, 成绩: %.2f\n",
students[i].id, students[i].name, students[i].age, students[i].score);
found = 1;
break;
}
}
if(!found) {
printf("未找到该学号的学生,\n");
}
} else if(choice == 2) {
char name[MAX_NAME_LEN];
printf("请输入要查询的学生姓名: ");
scanf("%s", name);
getchar();
int found = 0;
for(int i = 0; i < studentCount; i++) {
if(strcmp(students[i].name, name) == 0) {
printf("学号: %s, 姓名: %s, 年龄: %d, 成绩: %.2f\n",
students[i].id, students[i].name, students[i].age, students[i].score);
found = 1;
}
}
if(!found) {
printf("未找到该姓名的学生,\n");
}
} else {
printf("无效的选择,\n");
}
}
// 显示所有学生信息
void displayAllStudents() {
if(studentCount == 0) {
printf("没有学生信息可显示,\n");
return;
}
printf("\n%-10s %-20s %-5s %-5s\n", "学号", "姓名", "年龄", "成绩");
printf("------------------------------------------------\n");
for(int i = 0; i < studentCount; i++) {
printf("%-10s %-20s %-5d %-5.2f\n",
students[i].id, students[i].name, students[i].age, students[i].score);
}
}
// 保存数据到文件
void saveToFile() {
FILE *file = fopen("students.dat", "wb");
if(file == NULL) {
printf("无法打开文件进行保存,\n");
return;
}
fwrite(&studentCount, sizeof(int), 1, file);
fwrite(students, sizeof(Student), studentCount, file);
fclose(file);
}
// 从文件加载数据
void loadFromFile() {
FILE *file = fopen("students.dat", "rb");
if(file == NULL) {
printf("未找到数据文件,将创建新文件,\n");
return;
}
fread(&studentCount, sizeof(int), 1, file);
fread(students, sizeof(Student), studentCount, file);
fclose(file);
}
功能说明
- 添加学生信息:输入学号、姓名、年龄和成绩,系统会检查学号是否已存在
- 删除学生信息:通过学号删除学生记录
- 修改学生信息:通过学号查找学生并修改其信息(姓名、年龄、成绩)
- 查询学生信息:可以按学号或姓名查询学生信息
- 显示所有学生信息:以表格形式显示所有学生记录
- 保存并退出:将数据保存到二进制文件并退出程序
使用说明
- 编译并运行程序
- 使用菜单选择相应功能
- 按照提示输入相关信息
- 数据会自动保存到"students.dat"文件中,下次启动程序时会自动加载
扩展建议
- 可以添加按成绩排序功能
- 可以添加统计功能(如平均分、最高分等)
- 可以增加密码保护功能
- 可以改进用户界面,使其更友好
这个实现使用了简单的控制台界面,数据保存在二进制文件中,如果需要更复杂的功能或图形界面,可以在此基础上进行扩展。

(图片来源网络,侵删)
