运用线性表实现学生选课系统

本文介绍了一个能够管理40000名学生和3000门课程的大学选课系统的实现,包括学生和课程信息的输入、查找、插入、删除功能,以及选课、查看选课信息等操作。程序具有健壮性和用户友好的界面,并使用链表数据结构存储学生和课程信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题描述

为一所拥有接近 40000 名学生和 3000 门课程的大学,生成一个选课系统,具有
如下功能:
(1) 能够输入所有学生信息(学号,姓名,性别,…);
(2) 能够输入所有课程信息(课号,课名,学分,…);
(3) 能够查找、插入、删除学生记录;
(4) 能够查找、插入、删除课程记录;
(5) 能够输入学生选课信息,例如给定(学号 a,课号 b),就表示学生 a 注册
了课程 b;
(6) 能够输出某门课程的所有选课学生的名单,包含学生所有信息(学号、姓名、
性别……);
(7) 能够输出某位学生的所有选课课程清单,包含课程的所有信息(课号、课名、
学分……);

2、基本要求

(1) 程序要添加适当的注释,程序的书写要采用缩进格式 。
(2) 程序要具在一定的健壮性,即当输入数据非法时, 程序也能适当地做出反
应,如 插入删除时指定的位置不对 等等。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

3、数据结构的设计

(1)定义一个学生类型的链表,里面要包含学生的全部有效信息。
(2)定义链表 S_LinkList 存放学生结点。
(3)定义一个课程类型的链表,里面要包含课程的全部有效信息。
(2)定义链表 S_LinkList 存放课程结点。

4、要使用到的函数说明

(1)bool Num(string s)//根据 ASCII 值判断字符串中是否为数字,如果是返回 true,反之返回 false。
(2)int InitList_C(C_LinkList& C)//初始化课程链表,初始化成功返回OK,初始化失败返回 ERROR。
(3)int InitList_S(S_LinkList& S)//初始化学生链表,初始化成功返回OK,初始化失败返回 ERROR。
(4)void Input_C(C_LinkList& C) //输入课程信息。
(5)void Input_S(S_LinkList& S)//输入学生信息。
(6)int NumberSeek_S(S_LinkList S)//根据学号查找学生,找到了返回OK,输入的学号不是七位数字或者不存在该学号则返回 ERROR。
(7)void NameSeek_S(S_LinkList S)//根据姓名查找学生。
(8)void Insert_S(S_LinkList& S)//在学生链表中插入一个学生信息。
(9)void Delete_S(S_LinkList& S)//根据学号删除一个学生的信息。
(10)void ChooseCours(S_LinkList& S,C_LinkList& C)//学生进行选课。
(11)void Output_S(S_LinkList& S)//根据学号输出某学生所选择的课程。
(12)void NumberSeek_C(C_LinkList C)//根据课号查找课程。
(13)void NameSeek_C(C_LinkList C)//根据课程名查找课程。
(13)void Insert_C(C_LinkList& C)//在课程链表中插入一门课程信息。
(14)void Delete_C(C_LinkList& C)//根据课号删除一门课程的信息。
(15)void Output_C(C_LinkList& C)//根据课号输出选择某课的学生信息。
(16)主函数:int main()//进行各项操作。

5、具体代码

//PA1—前提:假设学号为 7 位数字
#include<iostream>
#include<stdlib.h>
#include<string>
#define OK 1
#define ERROR 0
using namespace std;

typedef struct Student{
   
    string s_number;//学生序号
    string s_name;//学生姓名
    string sex;//学生性别
    string c[1000];//学生所选课程的信息
    int k;//n 为 c 中元素个数
}Student;//定义学生类型

typedef struct Course{
   
    string c_number;//课号
    string c_name;//课名
    int score;//课程学分
    string s[1000];//选某课程学生的信息
    int m;//m 为 s 中元素个数
}Course;//定义课程类型

typedef struct S_Lnode{
   
    Student date;//数据域存放学生信息
    int S_length;//学生人数
    struct S_Lnode* next;//指针域
}*S_LinkList;//定义链表 S_LinkList 存放学生结点

typedef struct C_Lnode{
   
    Course date;//数据域存放课程信息
    int C_length;//课程数量
    struct C_Lnode* next;//指针域
}*C_LinkList;//定义链表 C_LinkList 存放课程结点

bool Num(string s) {
   
    for (int i = 0; i < s.size(); i++){
   
    int tmp = (int)s[i];
    if (tmp >= 48 && tmp <= 57) continue;
    else return false;
    } 
    return true;
}//根据 ASCII 值判断字符串中是否为数字

int InitList_C(C_LinkList& C) {
   
    C = new C_Lnode;
    if (!C) return ERROR;//分配空间失败
    C->next = NULL;C->C_length = 0;
    return OK;//分配空间成功
}//初始化课程链表

void Input_C(C_LinkList& C) {
   
    int m = 1;
    C_LinkList r = C;//尾指针
    C_LinkList c;//课程结点
    cout << "请输入课程信息" << endl;
    while (m) {
   
        c = new C_Lnode;
        cout << "课号:";cin >> c->date.c_number;
        int n = c->date.c_number.size();
        if (!Num(c->date.c_number) || n != 4){
   
            cout << "输入错误,课号应为 4 位数字,请重新输入!" << endl;continue;
            }
        cout << "课名:";cin >> c->date.c_name;
        cout << "学分:";cin >> c->date.score;
        cout << endl;
        c->next = NULL;r->next = c;r = c;
        C->C_length++;
        cout << "继续输入请按 1,退出输入请按 0:";
        cin >> m;
        }
        cout << "输入完毕,目前已输入" << C->C_length << "门课程" << endl;
}//输入课程信息

int InitList_S(S_LinkList& S) {
   
    S = new S_Lnode;
    if (!S) {
   
        cout << "初始化学生链表失败,未成功分配空间" << endl;
        return ERROR;
    }
    S->next = NULL;S->S_length = 0;
    cout << "初始化学生链表成功!";
    return OK;//分配空间成功
}//初始化学生链表

void Input_S(S_LinkList& S) {
   
    int m=1;
    S_LinkList r = S;//尾指针
    S_LinkList s;//学生结点
    cout << "请输入学生信息" << endl;
    while (m) {
   
        s = new S_Lnode;
        cout << "学号:";cin >> s->date.s_number;
        int n =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值