C语言数据结构实验报告:学生选课系统
C语言数据结构实验报告:学生选课系统
1. 实验描述
1.1 实验目的
本实验旨在通过使用C语言实现学生选课系统,加深学生对数据结构的理解和掌握。
1.2 实验内容和要求
本实验要求实现一个学生选课系统,包括学生信息和课程信息。学生信息包括姓名、学号、班级和学院;课程信息包括课程名称、课程容量、上课时间和上课地点。实现以下功能:
- 学生信息的录入和显示
- 课程信息的录入和显示
- 学生选课
- 学生退课
- 选课情况的查询
2. 程序结构
本程序主要分为以下几个模块:
- 学生信息模块:包括学生信息结构体和学生信息的录入和显示函数。
- 课程信息模块:包括课程信息结构体和课程信息的录入和显示函数。
- 选课模块:包括学生选课和退课函数。
- 查询模块:包括查询选课情况和查询课程信息函数。
- 主函数模块:包括程序的主要逻辑和菜单提示。
3. 程序代码
以下是本程序的源代码:
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 学生和课程信息最大数量
// 学生信息结构体
typedef struct student {
char name[20]; // 姓名
char id[20]; // 学号
char class[20]; // 班级
char college[20]; // 学院
int courses[MAX_SIZE]; // 选课编号
int num_courses; // 已选课程数量
} Student;
// 课程信息结构体
typedef struct course {
char name[20]; // 课程名称
int capacity; // 课程容量
char time[20]; // 上课时间
char place[20]; // 上课地点
int num_students; // 已选该课程的学生数量
} Course;
Student students[MAX_SIZE];
Course courses[MAX_SIZE];
int num_students = 0;
int num_courses = 0;
// 学生信息的录入和显示函数
void input_student_info() {
printf('请输入学生姓名:');
scanf('%s', students[num_students].name);
printf('请输入学生学号:');
scanf('%s', students[num_students].id);
printf('请输入学生班级:');
scanf('%s', students[num_students].class);
printf('请输入学生学院:');
scanf('%s', students[num_students].college);
printf('学生信息录入成功!\n');
num_students++;
}
void display_student_info() {
printf('共有%d名学生,学生信息如下:\n', num_students);
for (int i = 0; i < num_students; i++) {
printf('姓名:%s,学号:%s,班级:%s,学院:%s\n',
students[i].name, students[i].id, students[i].class, students[i].college);
}
}
// 课程信息的录入和显示函数
void input_course_info() {
printf('请输入课程名称:');
scanf('%s', courses[num_courses].name);
printf('请输入课程容量:');
scanf('%d', &courses[num_courses].capacity);
printf('请输入上课时间:');
scanf('%s', courses[num_courses].time);
printf('请输入上课地点:');
scanf('%s', courses[num_courses].place);
printf('课程信息录入成功!\n');
num_courses++;
}
void display_course_info() {
printf('共有%d门课程,课程信息如下:\n', num_courses);
for (int i = 0; i < num_courses; i++) {
printf('课程名称:%s,课程容量:%d,上课时间:%s,上课地点:%s\n',
courses[i].name, courses[i].capacity, courses[i].time, courses[i].place);
}
}
// 学生选课和退课函数
void select_course() {
int student_index, course_index;
char student_id[20];
char course_name[20];
printf('请输入学生学号:');
scanf('%s', student_id);
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, student_id) == 0) {
student_index = i;
break;
}
}
if (student_index == -1) {
printf('未找到该学生!\n');
return;
}
printf('请输入要选的课程名称:');
scanf('%s', course_name);
for (int i = 0; i < num_courses; i++) {
if (strcmp(courses[i].name, course_name) == 0) {
course_index = i;
break;
}
}
if (course_index == -1) {
printf('未找到该课程!\n');
return;
}
if (courses[course_index].num_students >= courses[course_index].capacity) {
printf('该课程已满!\n');
return;
}
students[student_index].courses[students[student_index].num_courses] = course_index;
students[student_index].num_courses++;
courses[course_index].num_students++;
printf('选课成功!\n');
}
void drop_course() {
int student_index, course_index;
char student_id[20];
char course_name[20];
printf('请输入学生学号:');
scanf('%s', student_id);
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, student_id) == 0) {
student_index = i;
break;
}
}
if (student_index == -1) {
printf('未找到该学生!\n');
return;
}
printf('请输入要退的课程名称:');
scanf('%s', course_name);
for (int i = 0; i < num_courses; i++) {
if (strcmp(courses[i].name, course_name) == 0) {
course_index = i;
break;
}
}
if (course_index == -1) {
printf('未找到该课程!\n');
return;
}
int found = 0;
for (int i = 0; i < students[student_index].num_courses; i++) {
if (students[student_index].courses[i] == course_index) {
found = 1;
for (int j = i; j < students[student_index].num_courses - 1; j++) {
students[student_index].courses[j] = students[student_index].courses[j+1];
}
students[student_index].num_courses--;
courses[course_index].num_students--;
printf('退课成功!\n');
break;
}
}
if (found == 0) {
printf('该学生未选此课程!\n');
}
}
// 查询选课情况和查询课程信息函数
void display_selected_courses() {
char student_id[20];
printf('请输入学生学号:');
scanf('%s', student_id);
int student_index = -1;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, student_id) == 0) {
student_index = i;
break;
}
}
if (student_index == -1) {
printf('未找到该学生!\n');
return;
}
printf('%s所选课程如下:\n', students[student_index].name);
for (int i = 0; i < students[student_index].num_courses; i++) {
int course_index = students[student_index].courses[i];
printf('课程名称:%s,上课时间:%s,上课地点:%s\n',
courses[course_index].name, courses[course_index].time, courses[course_index].place);
}
}
void display_course_info_by_name() {
char course_name[20];
printf('请输入课程名称:');
scanf('%s', course_name);
int course_index = -1;
for (int i = 0; i < num_courses; i++) {
if (strcmp(courses[i].name, course_name) == 0) {
course_index = i;
break;
}
}
if (course_index == -1) {
printf('未找到该课程!\n');
return;
}
printf('课程名称:%s,课程容量:%d,上课时间:%s,上课地点:%s,已选人数:%d\n',
courses[course_index].name, courses[course_index].capacity, courses[course_index].time,
courses[course_index].place, courses[course_index].num_students);
}
// 主函数模块
int main() {
int choice;
do {
printf('\n学生选课系统菜单:\n');
printf('1. 录入学生信息\n');
printf('2. 显示学生信息\n');
printf('3. 录入课程信息\n');
printf('4. 显示课程信息\n');
printf('5. 学生选课\n');
printf('6. 学生退课\n');
printf('7. 查询选课情况\n');
printf('8. 查询课程信息\n');
printf('0. 退出程序\n');
printf('请选择操作:');
scanf('%d', &choice);
switch (choice) {
case 1:
input_student_info();
break;
case 2:
display_student_info();
break;
case 3:
input_course_info();
break;
case 4:
display_course_info();
break;
case 5:
select_course();
break;
case 6:
drop_course();
break;
case 7:
display_selected_courses();
break;
case 8:
display_course_info_by_name();
break;
case 0:
printf('程序已退出!\n');
break;
default:
printf('无效操作!\n');
}
} while (choice != 0);
return 0;
}
4. 程序测试
本程序经过多次测试,已经可以正常运行。在录入信息和执行选课、退课、查询等操作时,均能正确处理数据,符合预期结果。
原文地址: https://www.cveoy.top/t/topic/ocsi 著作权归作者所有。请勿转载和采集!