学校人员信息系统
设计过程描述
根据作业要求,每个类型的记录(学生,教授,工人)都应该有自己的班级;所有类都应该有继承,如下图所示。所有的记录都应该存储在任何 C++ STL 容器中(因为它们可靠快速,并且它被认为是 C++ 编码的一种现代风格),并且这些记录的所有变化都应该在内存中执行,然后输出到某个文件(我认为这是最好的方法,尽管它有一些缺点,特别是当记录数据库非常大/多时)。这要求为每个类重载 I/O 操作符,因为每个类型都存储它自己的特定信息。在我看来,即使输入运算符不在原始任务中,也可以将输入运算符重载,以便将此程序作为一个唯一的接口来管理此类记录。程序界面需要输入一个数字以便在菜单中选择一个部分,因此使用 switch 语句在代码中能提高代码的可读性。在 switch 结构程序的每个部分执行操作后,应返回到之前一样的菜单屏幕。我认为在每个 case 之后使用 goto 而不是 break,尽管被认为是不好的编码风格,但是使用 goto 不在循环内,我觉得它是可以接受的。但首先,程序应该检查你是否已经有一个记录的数据库。所有不正确的输入都应在程序的任何阶段处理需要的用户输入信息。
各类之间关系与它们的内容
小结
类中的所有变量都在 protected 中,所以它们可以从友函数和继承类访问,并同时保持安全。因为三个最重要的类(Student,Professor,Worker)都是继承类,所以有必要为每个主类编写构造函数。当程序处理单词时,我决定使用字符串和 getline()函数,因为输入可能有空格,所以没有任何信息会丢失。我正在使用以下处理异常的方法。
while (!cin) {
cin.clear(); //这两行是清除cin缓冲区并忽略未知表达式
cin.ignore(999, '\n'); //因此程序不会停留在无限循环中,
cerr << "\nWrong input.”
... //并且它们在循环中直到正确输入
break;
}
对于每个主类,我定义了比较运算符来实现删除函数。因为定义很小,所以我把它放在类的主体中,并给它 inline 指定符。
lookup()函数:使用类型为 auto 的迭代器 it(被认为比使用迭代器类型本身更优选),该函数使用来自 algorithm 库的函数 find_if(),该函数采用 lambda 表达式只比较工作/学生号(这就是任务所要求的),作为参数。函数返回 true 或 false 是否发现使用这种编号的记录。
change()函数:具有相同的迭代器 it,它不仅用于在屏幕上输出消息,还用于从容器中删除记录。在这里新对象被初始化并保存到容器中。
print()函数:具有相同的迭代器 it(尽管可能会调用 lookup()函数)。其余的都是不言自明的。
add()函数:调用 lookup()函数来检查这个记录是否已经存在。对于 Student 类来说,这是毫无用处的。对于 Professor 和 Worker 类,它是使用 Staff 类中的模板定义的,因为它们都是从同一个类继承的,因此它会减少代码行数。
加新记录或定义我自己的容器之后,我决定使用所有类的 vector 容器,因为跟 deque 我遇到一些问题;且 vector 的 push_back()函数被认为是在重新分配内存时非常快速且非常高效。
整个程序分为两个主屏幕,所以我定义了 first_screen()和 second_screen()为了打印屏幕的界面。它们都使用 Clear Screen()函数,我无法正确调试它,它的实现是否适用于所有机器,但是如果程序是从可执行文件启动的,它会在基于 UNIX 系统上清除屏幕。所谓数据库的输入是由 initialization()函数处理的,initialization()函数本身处理打开文件流并使用 operator>> 从文件流中获取信息,然后存储到每个类的向量中(如果已找到这些信息)。另一方面,函数 fin_out()将所有来自向量的信息写入文件。新类型的循环被使用在这里并且为每个类 operator<< 重载。
在 main 函数中从一个 switch 的 case 到另一个,我使用了类型为 short 的变量 temp(不需要使用更大的类型)。
补充笔记:
· 我没有使用 throw-catch 结构来做到这一点,因为它被认为很慢,已经过时并已被弃用好多次。
· 我没有使用 using namespace std,因为它被认为是不好的代码风格,特别是如果我们考虑改进框架。 但因为它是作业而已,我仍然使用 using 声明,以保持代码可读性并且不会增加行数量。
· 在这个项目中,main()函数的第一行是完全没有必要性,但是我让它提高了对这个特性的认识,并且潜在地改进了 C ++ 的 I / O 接口。
· 为了提高可读性,所有的类定义和声明都应该移到不同的头文件中以。
代码(缩短版)
records.h
测试结果
Windows
Mac OS