实验目的

通过本次实验,了解数据结构的基本操作,熟悉 C 语言的语法和指针操作,设计并实现一个学生选课系统,包括学生信息和课程信息的管理。

实验要求

  1. 学生信息包括姓名、学号、班级、学院,课程信息包括课程名称、课程容量、上课时间、上课地点。
  2. 学生可以选择课程,并且每门课程的容量有限,当课程已满员时,不能再选该课程。
  3. 实现菜单功能,包括添加学生、添加课程、查询学生、查询课程、选课、退课、退出程序等功能。

实验步骤

  1. 定义学生结构体,包括姓名、学号、班级、学院等信息。
typedef struct student {
    char name[30];
    int id;
    char clazz[30];
    char college[30];
} Student;
  1. 定义课程结构体,包括课程名称、课程容量、上课时间、上课地点等信息。
typedef struct course {
    char name[30];
    int capacity;
    char time[30];
    char place[30];
} Course;
  1. 定义链表节点结构体,包括学生结构体和课程结构体的指针。
typedef struct node {
    Student *stu;
    Course *cou;
    struct node *next;
} Node;
  1. 实现添加学生功能,通过输入学生信息,创建一个学生结构体并插入到链表中。
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');
}
  1. 实现添加课程功能,通过输入课程信息,创建一个课程结构体并插入到链表中。
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');
}
  1. 实现查询学生功能,通过输入学号,查找学生结构体并打印出学生信息。
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');
}
  1. 实现查询课程功能,通过输入课程名称,查找课程结构体并打印出课程信息。
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');
}
  1. 实现选课功能,通过输入学号和课程名称,找到对应的学生结构体和课程结构体,如果课程容量未满,则将课程结构体插入到学生结构体中的课程链表中。
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');
}
  1. 实现退课功能,通过输入学号和课程名称,找到对应的学生结构体和课程结构体,将课程结构体从学生结构体中的课程链表中删除。
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');
}
  1. 实现菜单功能,通过输入数字选择对应的功能。
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;
}

实验结果

成功实现了学生选课系统的设计和实现,能够通过菜单选择对应的功能,实现添加学生、添加课程、查询学生、查询课程、选课、退课等操作,能够对学生和课程信息进行管理和查询。

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

原文地址: https://www.cveoy.top/t/topic/ocrN 著作权归作者所有。请勿转载和采集!

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