基于C++实现(控制台)学校人员信息系统

学校人员信息系统

设计过程描述

根据作业要求,每个类型的记录(学生,教授,工人)都应该有自己的班级;所有类都应该有继承,如下图所示。所有的记录都应该存储在任何 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值