C语言学分管理系统设计与实现
C语言学分管理系统设计与实现
本项目使用C语言实现了一个简单的学分管理系统,用于管理学生已完成的学分信息。系统包含添加、查询、修改、删除学生信息,以及显示可毕业学生的功能。
1. 系统设计
1.1 数据结构
使用结构体Student存储学生信息,包括学号、姓名、班级、入学时间以及各个类别课程的已完成学分。
struct Student {
int id; // 学号
char name[20]; // 姓名
char class[10]; // 班级
char entryDate[11]; // 入学时间 (YYYY-MM-DD)
int basicCredits; // 基础课学分
int majorCredits; // 专业课学分
int electiveCredits; // 选修课学分
int humanitiesCredits; // 人文类课程学分
int experimentCredits; // 实验课程学分
};
使用链表存储所有学生信息。
1.2 功能模块
系统包含以下功能模块:
- 添加学生信息:输入学生的学号、姓名、班级、入学时间,并检查学号是否已存在。如果学号不存在,则将学生信息添加到链表中。
- 查询学生信息:输入学号,查找该学生的信息并显示。如果学生不存在,则提示用户。
- 修改学生信息:输入学号,查找该学生的信息,并允许用户修改已完成的学分。如果学生不存在,则提示用户。
- 删除学生信息:输入学号,查找该学生的信息并将其从链表中删除。如果学生不存在,则提示用户。
- 显示可毕业学生:遍历链表,判断每个学生的已完成学分是否满足毕业要求,并显示满足条件的学生信息。
1.3 菜单设计
系统运行后,首先显示主菜单,允许用户选择操作功能:
学分管理系统
-----------------
1. 添加学生信息
2. 查询学生信息
3. 修改学生信息
4. 删除学生信息
5. 显示可毕业学生
0. 退出系统
请输入您的选择:
2. 代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生结构体
struct Student {
int id; // 学号
char name[20]; // 姓名
char class[10]; // 班级
char entryDate[11]; // 入学时间 (YYYY-MM-DD)
int basicCredits; // 基础课学分
int majorCredits; // 专业课学分
int electiveCredits; // 选修课学分
int humanitiesCredits; // 人文类课程学分
int experimentCredits; // 实验课程学分
};
// 链表节点
struct Node {
struct Student student; // 学生信息
struct Node* next; // 指向下一个节点
};
// 创建一个新的学生节点
struct Node* createNode(struct Student student) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("内存分配失败!
");
exit(1);
}
newNode->student = student;
newNode->next = NULL;
return newNode;
}
// 插入学生信息到链表
struct Node* insertStudent(struct Node* head, struct Student student) {
struct Node* newNode = createNode(student);
newNode->next = head;
return newNode;
}
// 查找学生信息
struct Node* findStudent(struct Node* head, int id) {
struct Node* current = head;
while (current != NULL) {
if (current->student.id == id) {
return current;
}
current = current->next;
}
return NULL; // 学生不存在
}
// 修改学生信息
void modifyStudent(struct Node* head, int id) {
struct Node* studentNode = findStudent(head, id);
if (studentNode != NULL) {
printf("请输入要修改的学分信息:\n");
printf("基础课学分:");
scanf("%d", &studentNode->student.basicCredits);
printf("专业课学分:");
scanf("%d", &studentNode->student.majorCredits);
printf("选修课学分:");
scanf("%d", &studentNode->student.electiveCredits);
printf("人文类课程学分:");
scanf("%d", &studentNode->student.humanitiesCredits);
printf("实验课程学分:");
scanf("%d", &studentNode->student.experimentCredits);
printf("修改成功!\n");
} else {
printf("学号 %d 的学生不存在!\n", id);
}
}
// 删除学生信息
struct Node* deleteStudent(struct Node* head, int id) {
struct Node* current = head;
struct Node* previous = NULL;
while (current != NULL) {
if (current->student.id == id) {
if (previous == NULL) {
head = current->next; // 删除第一个节点
} else {
previous->next = current->next; // 删除中间节点
}
free(current);
printf("学生 %d 已成功删除!\n", id);
return head;
}
previous = current;
current = current->next;
}
printf("学号 %d 的学生不存在!\n", id);
return head;
}
// 显示学生信息
void displayStudent(struct Node* head, int id) {
struct Node* studentNode = findStudent(head, id);
if (studentNode != NULL) {
printf("学号:%d\n", studentNode->student.id);
printf("姓名:%s\n", studentNode->student.name);
printf("班级:%s\n", studentNode->student.class);
printf("入学时间:%s\n", studentNode->student.entryDate);
printf("基础课学分:%d\n", studentNode->student.basicCredits);
printf("专业课学分:%d\n", studentNode->student.majorCredits);
printf("选修课学分:%d\n", studentNode->student.electiveCredits);
printf("人文类课程学分:%d\n", studentNode->student.humanitiesCredits);
printf("实验课程学分:%d\n", studentNode->student.experimentCredits);
} else {
printf("学号 %d 的学生不存在!\n", id);
}
}
// 显示可毕业学生
void displayGraduates(struct Node* head) {
struct Node* current = head;
printf("可毕业的学生:\n");
while (current != NULL) {
if (current->student.basicCredits >= 50 &&
current->student.majorCredits >= 50 &&
current->student.electiveCredits >= 24 &&
current->student.humanitiesCredits >= 8 &&
current->student.experimentCredits >= 20) {
printf("学号:%d, 姓名:%s\n", current->student.id, current->student.name);
}
current = current->next;
}
}
// 主函数
int main() {
struct Node* head = NULL; // 链表头指针
int choice, id;
struct Student student;
do {
printf("学分管理系统\n-----------------\n");
printf("1. 添加学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 显示可毕业学生\n");
printf("0. 退出系统\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d", &student.id);
if (findStudent(head, student.id) != NULL) {
printf("学号已存在,请重新输入!\n");
break;
}
printf("姓名:");
scanf("%s", student.name);
printf("班级:");
scanf("%s", student.class);
printf("入学时间 (YYYY-MM-DD):");
scanf("%s", student.entryDate);
student.basicCredits = 0;
student.majorCredits = 0;
student.electiveCredits = 0;
student.humanitiesCredits = 0;
student.experimentCredits = 0;
head = insertStudent(head, student);
printf("学生信息已成功添加!\n");
break;
case 2:
printf("请输入要查询的学号:");
scanf("%d", &id);
displayStudent(head, id);
break;
case 3:
printf("请输入要修改的学号:");
scanf("%d", &id);
modifyStudent(head, id);
break;
case 4:
printf("请输入要删除的学号:");
scanf("%d", &id);
head = deleteStudent(head, id);
break;
case 5:
displayGraduates(head);
break;
case 0:
printf("退出系统!\n");
break;
default:
printf("无效的选择!\n");
}
} while (choice != 0);
return 0;
}
3. 测试
- 添加多个学生信息。
- 查询学生信息。
- 修改学生信息。
- 删除学生信息。
- 显示可毕业学生。
4. 总结
本项目使用C语言实现了一个简单的学分管理系统,包含了添加、查询、修改、删除学生信息,以及显示可毕业学生的功能。该系统使用链表存储数据,并采用模块化编程方式,方便代码维护和扩展。
**注意:**该系统仅供学习参考,需要进一步完善才能应用于实际环境。例如:
- 添加数据校验,确保输入数据的合法性。
- 使用文件存储数据,以保证系统重启后数据不会丢失。
- 增加其他功能,如统计学生数量、查询特定课程的学分等。
- 使用图形界面,提高用户体验。
原文地址: https://www.cveoy.top/t/topic/oKIH 著作权归作者所有。请勿转载和采集!