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

一、实验目的

本次实验的目的是通过使用C语言的数据结构知识,设计并实现一个简单的学生选课系统。

二、实验内容

  1. 学生信息包括姓名、学号、班级、学院,使用结构体来存储学生信息。

  2. 课程信息包括课程名称、上课时间、上课地点,使用结构体来存储课程信息。

  3. 实现菜单功能,包括以下选项: (1) 添加学生信息 (2) 添加课程信息 (3) 查询学生信息 (4) 查询课程信息 (5) 选课 (6) 退课 (7) 退出系统

  4. 实现选课和退课功能,需要使用链表来存储学生选课和退课信息。

三、实验步骤

  1. 定义学生信息结构体和课程信息结构体。
typedef struct {
    char name[20]; // 姓名
    char id[20]; // 学号
    char cls[20]; // 班级
    char college[20]; // 学院
} student;

typedef struct {
    char name[20]; // 课程名称
    char time[20]; // 上课时间
    char place[20]; // 上课地点
} course;
  1. 定义链表节点结构体和链表结构体。
typedef struct node {
    student stu;
    struct node *next;
} node;

typedef struct {
    node *head;
    node *tail;
    int size;
} list;
  1. 实现菜单功能,根据用户输入的选项执行相应的操作。
while (1) {
    printf("请选择操作:\n");
    printf("1. 添加学生信息\n");
    printf("2. 添加课程信息\n");
    printf("3. 查询学生信息\n");
    printf("4. 查询课程信息\n");
    printf("5. 选课\n");
    printf("6. 退课\n");
    printf("7. 退出系统\n");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            add_student(&stu_list);
            break;
        case 2:
            add_course(&course_list);
            break;
        case 3:
            query_student(&stu_list);
            break;
        case 4:
            query_course(&course_list);
            break;
        case 5:
            select_course(&stu_list, &course_list);
            break;
        case 6:
            drop_course(&stu_list, &course_list);
            break;
        case 7:
            printf("谢谢使用!\n");
            exit(0);
        default:
            printf("输入有误,请重新输入!\n");
            break;
    }
}
  1. 实现添加学生信息功能,将学生信息添加到链表中。
void add_student(list *stu_list) {
    student stu;

    printf("请输入学生姓名:");
    scanf("%s", stu.name);
    printf("请输入学生学号:");
    scanf("%s", stu.id);
    printf("请输入学生班级:");
    scanf("%s", stu.cls);
    printf("请输入学生学院:");
    scanf("%s", stu.college);

    node *new_node = (node *) malloc(sizeof(node));
    new_node->stu = stu;
    new_node->next = NULL;

    if (stu_list->head == NULL) {
        stu_list->head = new_node;
        stu_list->tail = new_node;
    } else {
        stu_list->tail->next = new_node;
        stu_list->tail = new_node;
    }

    stu_list->size++;

    printf("添加成功!\n");
}
  1. 实现添加课程信息功能,将课程信息添加到链表中。
void add_course(list *course_list) {
    course course;

    printf("请输入课程名称:");
    scanf("%s", course.name);
    printf("请输入上课时间:");
    scanf("%s", course.time);
    printf("请输入上课地点:");
    scanf("%s", course.place);

    node *new_node = (node *) malloc(sizeof(node));
    new_node->course = course;
    new_node->next = NULL;

    if (course_list->head == NULL) {
        course_list->head = new_node;
        course_list->tail = new_node;
    } else {
        course_list->tail->next = new_node;
        course_list->tail = new_node;
    }

    course_list->size++;

    printf("添加成功!\n");
}
  1. 实现查询学生信息功能,根据学号查询学生信息。
void query_student(list *stu_list) {
    char id[20];

    printf("请输入学生学号:");
    scanf("%s", id);

    node *p = stu_list->head;
    while (p != NULL) {
        if (strcmp(p->stu.id, id) == 0) {
            printf("姓名:%s\n", p->stu.name);
            printf("学号:%s\n", p->stu.id);
            printf("班级:%s\n", p->stu.cls);
            printf("学院:%s\n", p->stu.college);
            return;
        }
        p = p->next;
    }

    printf("未找到该学生!\n");
}
  1. 实现查询课程信息功能,根据课程名称查询课程信息。
void query_course(list *course_list) {
    char name[20];

    printf("请输入课程名称:");
    scanf("%s", name);

    node *p = course_list->head;
    while (p != NULL) {
        if (strcmp(p->course.name, name) == 0) {
            printf("课程名称:%s\n", p->course.name);
            printf("上课时间:%s\n", p->course.time);
            printf("上课地点:%s\n", p->course.place);
            return;
        }
        p = p->next;
    }

    printf("未找到该课程!\n");
}
  1. 实现选课功能,将学生选课信息添加到链表中。
void select_course(list *stu_list, list *course_list) {
    char id[20];
    char name[20];

    printf("请输入学生学号:");
    scanf("%s", id);
    printf("请输入要选的课程名称:");
    scanf("%s", name);

    node *stu_p = stu_list->head;
    while (stu_p != NULL) {
        if (strcmp(stu_p->stu.id, id) == 0) {
            node *course_p = course_list->head;
            while (course_p != NULL) {
                if (strcmp(course_p->course.name, name) == 0) {
                    node *new_node = (node *) malloc(sizeof(node));
                    new_node->course = course_p->course;
                    new_node->next = NULL;

                    if (stu_p->stu.head == NULL) {
                        stu_p->stu.head = new_node;
                        stu_p->stu.tail = new_node;
                    } else {
                        stu_p->stu.tail->next = new_node;
                        stu_p->stu.tail = new_node;
                    }

                    stu_p->stu.size++;

                    printf("选课成功!\n");
                    return;
                }
                course_p = course_p->next;
            }
        }
        stu_p = stu_p->next;
    }

    printf("选课失败!\n");
}
  1. 实现退课功能,将学生退课信息从链表中删除。
void drop_course(list *stu_list, list *course_list) {
    char id[20];
    char name[20];

    printf("请输入学生学号:");
    scanf("%s", id);
    printf("请输入要退的课程名称:");
    scanf("%s", name);

    node *stu_p = stu_list->head;
    while (stu_p != NULL) {
        if (strcmp(stu_p->stu.id, id) == 0) {
            node *p = stu_p->stu.head;
            node *prev = NULL;
            while (p != NULL) {
                if (strcmp(p->course.name, name) == 0) {
                    if (prev == NULL) {
                        stu_p->stu.head = p->next;
                    } else {
                        prev->next = p->next;
                    }

                    if (p->next == NULL) {
                        stu_p->stu.tail = prev;
                    }

                    stu_p->stu.size--;

                    printf("退课成功!\n");
                    return;
                }
                prev = p;
                p = p->next;
            }
        }
        stu_p = stu_p->next;
    }

    printf("退课失败!\n");
}

四、实验结果

经过实验,我们成功地实现了一个简单的学生选课系统,具有以下功能:

  1. 添加学生信息
  2. 添加课程信息
  3. 查询学生信息
  4. 查询课程信息
  5. 选课
  6. 退课
  7. 退出系统

五、实验总结

本次实验通过使用C语言的数据结构知识,设计并实现了一个简单的学生选课系统。在实现过程中,我们使用了结构体来存储学生信息和课程信息,使用链表来存储学生选课和退课信息,实现了菜单功能,并按照用户选择的选项执行相应的操作。

通过本次实验,我们对数据结构的应用有了更深入的理解,同时也掌握了C语言的基本语法和编程技巧。


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

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