C语言数据结构实验报告:学生选课系统
实验目的
通过本次实验,了解数据结构的基本操作,熟悉 C 语言的语法和指针操作,设计并实现一个学生选课系统,包括学生信息和课程信息的管理。
实验要求
- 学生信息包括姓名、学号、班级、学院,课程信息包括课程名称、课程容量、上课时间、上课地点。
- 学生可以选择课程,并且每门课程的容量有限,当课程已满员时,不能再选该课程。
- 实现菜单功能,包括添加学生、添加课程、查询学生、查询课程、选课、退课、退出程序等功能。
实验步骤
- 定义学生结构体,包括姓名、学号、班级、学院等信息。
typedef struct student {
char name[30];
int id;
char clazz[30];
char college[30];
} Student;
- 定义课程结构体,包括课程名称、课程容量、上课时间、上课地点等信息。
typedef struct course {
char name[30];
int capacity;
char time[30];
char place[30];
} Course;
- 定义链表节点结构体,包括学生结构体和课程结构体的指针。
typedef struct node {
Student *stu;
Course *cou;
struct node *next;
} Node;
- 实现添加学生功能,通过输入学生信息,创建一个学生结构体并插入到链表中。
void addStudent(Node **head) {
Student *stu = (Student *)malloc(sizeof(Student));
printf('请输入学生姓名:');
scanf('%s', stu->name);
printf('请输入学生学号:');
scanf('%d', &stu->id);
printf('请输入学生班级:');
scanf('%s', stu->clazz);
printf('请输入学生学院:');
scanf('%s', stu->college);
Node *node = (Node *)malloc(sizeof(Node));
node->stu = stu;
node->cou = NULL;
node->next = *head;
*head = node;
printf('添加成功!\n');
}
- 实现添加课程功能,通过输入课程信息,创建一个课程结构体并插入到链表中。
void addCourse(Node **head) {
Course *cou = (Course *)malloc(sizeof(Course));
printf('请输入课程名称:');
scanf('%s', cou->name);
printf('请输入课程容量:');
scanf('%d', &cou->capacity);
printf('请输入课程上课时间:');
scanf('%s', cou->time);
printf('请输入课程上课地点:');
scanf('%s', cou->place);
Node *node = (Node *)malloc(sizeof(Node));
node->stu = NULL;
node->cou = cou;
node->next = *head;
*head = node;
printf('添加成功!\n');
}
- 实现查询学生功能,通过输入学号,查找学生结构体并打印出学生信息。
void searchStudent(Node *head) {
int id;
printf('请输入学生学号:');
scanf('%d', &id);
Node *p = head;
while (p != NULL) {
if (p->stu != NULL && p->stu->id == id) {
printf('姓名:%s\n', p->stu->name);
printf('学号:%d\n', p->stu->id);
printf('班级:%s\n', p->stu->clazz);
printf('学院:%s\n', p->stu->college);
return;
}
p = p->next;
}
printf('未找到该学生!\n');
}
- 实现查询课程功能,通过输入课程名称,查找课程结构体并打印出课程信息。
void searchCourse(Node *head) {
char name[30];
printf('请输入课程名称:');
scanf('%s', name);
Node *p = head;
while (p != NULL) {
if (p->cou != NULL && strcmp(p->cou->name, name) == 0) {
printf('课程名称:%s\n', p->cou->name);
printf('课程容量:%d\n', p->cou->capacity);
printf('上课时间:%s\n', p->cou->time);
printf('上课地点:%s\n', p->cou->place);
return;
}
p = p->next;
}
printf('未找到该课程!\n');
}
- 实现选课功能,通过输入学号和课程名称,找到对应的学生结构体和课程结构体,如果课程容量未满,则将课程结构体插入到学生结构体中的课程链表中。
void selectCourse(Node *head) {
int id;
char name[30];
printf('请输入学生学号:');
scanf('%d', &id);
printf('请输入课程名称:');
scanf('%s', name);
Node *p = head;
while (p != NULL) {
if (p->stu != NULL && p->stu->id == id) {
Node *q = head;
while (q != NULL) {
if (q->cou != NULL && strcmp(q->cou->name, name) == 0) {
if (q->cou->capacity > 0) {
q->cou->capacity--;
Node *node = (Node *)malloc(sizeof(Node));
node->stu = NULL;
node->cou = q->cou;
node->next = p->stu->couList;
p->stu->couList = node;
printf('选课成功!\n');
return;
} else {
printf('该课程已满员!\n');
return;
}
}
q = q->next;
}
printf('未找到该课程!\n');
return;
}
p = p->next;
}
printf('未找到该学生!\n');
}
- 实现退课功能,通过输入学号和课程名称,找到对应的学生结构体和课程结构体,将课程结构体从学生结构体中的课程链表中删除。
void dropCourse(Node *head) {
int id;
char name[30];
printf('请输入学生学号:');
scanf('%d', &id);
printf('请输入课程名称:');
scanf('%s', name);
Node *p = head;
while (p != NULL) {
if (p->stu != NULL && p->stu->id == id) {
Node *pre = p->stu->couList;
Node *cur = pre->next;
while (cur != NULL) {
if (cur->cou != NULL && strcmp(cur->cou->name, name) == 0) {
pre->next = cur->next;
free(cur);
printf('退课成功!\n');
return;
}
pre = cur;
cur = cur->next;
}
printf('未找到该课程!\n');
return;
}
p = p->next;
}
printf('未找到该学生!\n');
}
- 实现菜单功能,通过输入数字选择对应的功能。
void menu() {
printf('1.添加学生\n');
printf('2.添加课程\n');
printf('3.查询学生\n');
printf('4.查询课程\n');
printf('5.选课\n');
printf('6.退课\n');
printf('7.退出程序\n');
}
int main() {
Node *head = NULL;
int op;
do {
menu();
printf('请输入数字选择对应的功能:');
scanf('%d', &op);
switch (op) {
case 1:
addStudent(&head);
break;
case 2:
addCourse(&head);
break;
case 3:
searchStudent(head);
break;
case 4:
searchCourse(head);
break;
case 5:
selectCourse(head);
break;
case 6:
dropCourse(head);
break;
case 7:
printf('退出程序!\n');
break;
default:
printf('输入有误,请重新输入!\n');
break;
}
} while (op != 7);
return 0;
}
实验结果
成功实现了学生选课系统的设计和实现,能够通过菜单选择对应的功能,实现添加学生、添加课程、查询学生、查询课程、选课、退课等操作,能够对学生和课程信息进行管理和查询。
原文地址: https://www.cveoy.top/t/topic/ocrN 著作权归作者所有。请勿转载和采集!