C语言数据结构实验报告:学生选课系统

1. 实验描述

1.1 实验目的

本实验旨在通过使用C语言实现学生选课系统,加深学生对数据结构的理解和掌握。

1.2 实验内容和要求

本实验要求实现一个学生选课系统,包括学生信息和课程信息。学生信息包括姓名、学号、班级和学院;课程信息包括课程名称、课程容量、上课时间和上课地点。实现以下功能:

  1. 学生信息的录入和显示
  2. 课程信息的录入和显示
  3. 学生选课
  4. 学生退课
  5. 选课情况的查询

2. 程序结构

本程序主要分为以下几个模块:

  1. 学生信息模块:包括学生信息结构体和学生信息的录入和显示函数。
  2. 课程信息模块:包括课程信息结构体和课程信息的录入和显示函数。
  3. 选课模块:包括学生选课和退课函数。
  4. 查询模块:包括查询选课情况和查询课程信息函数。
  5. 主函数模块:包括程序的主要逻辑和菜单提示。

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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录