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 =