本项目是一个简易的学生信息管理系统,用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储,实现了数据持久化。项目采用模块化设计,具有较好的可读性和扩展性。
一,开发环境需求
-
操作系统 :windows, linux
-
开发环境工具 :qt ,vscode, visual studio
-
技术要求:
- 语言: C
- 数据结构: 链表
- 文件操作: 文件读写操作
二,功能说明
三,功能实现
- 录入学生信息
void addStudent(StudentList *list) {
Student newStudent;
printf("请输入学生信息:\n");
printf("学号: ");
scanf("%d", &(newStudent.id));
while(getchar() != '\n');
printf("姓名: ");
fgets(newStudent.name, sizeof(newStudent.name), stdin);
newStudent.name[strlen(newStudent.name)-1] = '\0'; // remove the newline
printf("年龄: ");
scanf("%d", &(newStudent.age));
while(getchar() != '\n');
printf("性别: ");
fgets(newStudent.gender, sizeof(newStudent.gender), stdin);
newStudent.gender[strlen(newStudent.gender)-1] = '\0';
printf("专业: ");
fgets(newStudent.major, sizeof(newStudent.major), stdin);
newStudent.major[strlen(newStudent.major)-1] = '\0';
printf("班级: ");
fgets(newStudent.class_name, sizeof(newStudent.class_name), stdin);
newStudent.class_name[strlen(newStudent.class_name)-1] = '\0';
printf("成绩: ");
scanf("%f", &(newStudent.score));
// add the new student to the list
StudentNode *newNode = (StudentNode*)malloc(sizeof(StudentNode));
newNode->data = newStudent;
newNode->next = list->head;
list->head = newNode;
list->count++;
printf("学生信息已添加成功!\n");
}
此函数用于添加学生信息。
- 删除学生信息
void deleteStudent(StudentList *list) {
int id;
printf("请输入要删除的学生的学号: ");
scanf("%d", &id);
StudentNode *current = list->head;
StudentNode *previous = NULL;
while (current != NULL) {
if (current->data.id == id) {
if (previous == NULL) {
list->head = current->next;
} else {
previous->next = current->next;
}
free(current);
list->count--;
printf("学生信息已删除。\n");
return;
}
previous = current;
current = current->next;
}
printf("未找到该学生的信息。\n");
}
此函数用于删除指定学生信息。
3.s 修改学生信息
void modifyStudent(StudentList *list) {
int id;
printf("请输入要修改的学生的学号: ");
scanf("%d", &id);
StudentNode *current = list->head;
while (current != NULL) {
if (current->data.id == id) {
printf("请输入新的学生信息:\n");
printf("姓名: ");
while(getchar() != '\n'); // clear buffer
fgets(current->data.name, sizeof(current->data.name), stdin);
current->data.name[strlen(current->data.name)-1] = '\0'; // remove newline
printf("年龄: ");
scanf("%d", &(current->data.age));
printf("性别: ");
while(getchar() != '\n');
fgets(current->data.gender, sizeof(current->data.gender), stdin);
current->data.gender[strlen(current->data.gender)-1] = '\0';
printf("专业: ");
while(getchar() != '\n');
fgets(current->data.major, sizeof(current->data.major), stdin);
current->data.major[strlen(current->data.major)-1] = '\0';
printf("班级: ");
while(getchar() != '\n');
fgets(current->data.class_name, sizeof(current->data.class_name), stdin);
current->data.class_name[strlen(current->data.class_name)-1] = '\0';
printf("成绩: ");
scanf("%f", &(current->data.score));
printf("学生信息已修改。\n");
return;
}
current = current->next;
}
printf("未找到该学生的信息。\n");
}
此函数用于修改指定学生信息。
- 查询学生信息
void queryStudent(const StudentList *list) {
int id;
printf("请输入要查询的学生的学号: ");
scanf("%d", &id);
StudentNode *current = list->head;
while (current != NULL) {
if (current->data.id == id) {
printf("学号: %d\n", current->data.id);
printf("姓名: %s\n", current->data.name);
printf("年龄: %d\n", current->data.age);
printf("性别: %s\n", current->data.gender);
printf("专业: %s\n", current->data.major);
printf("班级: %s\n", current->data.class_name);
printf("成绩: %.2f\n", current->data.score);
return;
}
current = current->next;
}
printf("未找到该学生的信息。\n");
}
此函数用于查询指定学生信息。
- 对学生信息排序
// 排序学生信息(这里以学号为例,升序排列)
void sortStudents(StudentList *list) {
// 使用冒泡排序算法
if (list->count < 2) return;
StudentNode *i, *j;
for (i = list->head; i->next != NULL; i = i->next) {
for (j = list->head; j->next != NULL; j = j->next) {
if (j->data.id > j->next->data.id) {
// 交换数据
Student temp = j->data;
j->data = j->next->data;
j->next->data = temp;
}
}
}
printf("学生信息已排序。\n");
}
此函数用于对学生信息进行排序。
- 列出所有学生信息
void displayAllStudents(const StudentList *list) {
if (!list->head) {
printf("没有学生信息可供显示。\n");
return;
}
printf("学号 姓名 年龄 性别 专业 班级 成绩\n");
printf("-----------------------------------------------------------------\n");
StudentNode *current = list->head;
while (current != NULL) {
printf("%-6d %-10s %-4d %-4s %-20s %-10s %.2f\n",
current->data.id, current->data.name, current->data.age,
current->data.gender, current->data.major, current->data.class_name,
current->data.score);
current = current->next;
}
printf("-----------------------------------------------------------------\n");
}
此函数用于显示所有学生的信息。
四,效果图
五,源码
代码已开源,可访问gitee下载。
六,总结
本项目是一个简单的学生信息管理系统,通过命令行界面与用户交互。主要实现了学生信息的增、删、查、改等功能。项目中主要使用C语言进行开发,并使用链表作为主要数据结构。经过严格的测试和修正,现在可以正常运行并满足基本的需求。