完整代码:开源地址
一、任务书
手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(假设每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含姓名和电话号码两项信息。存储在电话卡上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
要求:
创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的联系人的信息)。
以菜单方式工作(字符界面即可)
存储在手机上的联系人的信息包括:姓名和电话号码;存储在手机卡上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
管理系统的功能包括:
新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中,并且要检查目标位置上是否存在相同的电话号码)
删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
查询:根据名字查询联系人信息(查询结果可能不唯一)
浏览:显示所有联系人的信息
将联系人的信息从手机转存到手机卡上(转存过程中,要避免重复数据(姓名和电话号码相同)的存在;并且在转存是要检查容量是否受限 。下同。)
将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在)
要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点。
二、总体设计
三、各功能模块实现
3.1.增加联系人
首先选择添加联系人功能,基类指针a会调用派生类手机卡通讯录类的添加功能,当手机卡的内存不超过1000时可以进行添加,按照提示输入姓名和手机号即可,如果出现重复电话号码,会提示已经存在该联系人,如果不存在重复联系人,则添加成功,并询问用户是否继续添加。
流程图见图3.1
图3.1 新增联系人流程图
运行效果见图 3.2
图 3.2 新增联系人运行效果图
3.2.删除联系人
选择删除联系人功能,根据用户的输入,先查询是否存在,然后调用派生类功能,在两个地方同时删除 。
流程图见3.3
图3.3删除联系人功能流程图
运行效果图见图3.4
图3.4删除联系人运行效果图
3.3.查询联系人
用户选择在手机或手机卡上查询联系人,根据基类指针调用派生类查询函数,输入姓名,查询是否存在,存在则输出该联系人信息。
流程图见3.5
图3.5查询联系人流程图
运行效果见图3.6
图3.6查询联系人运行效果图
3.4.浏览联系人
用户选择浏览手机还是手机卡中联系人,根据不同选择,基类指针调用不同派生类的display函数。
流程图见图3.7
图3.7 浏览联系人流程图
运行效果见图3.8
图3.8 浏览联系人运行效果图
3.5.修改联系人
根据用户选择,在手机卡或手机上进行修改,通过基类指针调用派生类函数,用户选择修改什么信息,不存在会提示。
图3.9 修改联系人流程图
运行效果见图3.10
图3.10 修改联系人运行效果图
3.6.将手机卡联系人复制到手机中
首先创建文件流,如果打开成功,则读取手机卡中的联系人信息,如果内存已满,则提示,如果内存不满且不重复出现,则将姓名和电话号码写入到phone文件中。复制成功。
流程图见图3.11
图3.11 手机卡联系人复制到手机流程图
运行效果见图3.12
图3.12 手机卡联系人复制到手机中功能运行效果
3.7.将手机联系人复制到手机卡中
首先创建文件流,如果打开成功,则读取手机中的联系人信息,如果内存已满,则提示,如果内存不满且不重复出现,则将姓名和电话号码写入到sim文件中。复制成功。
流程图见图3.11
3.13手机联系人复制到手机卡流程图
运行效果见图3.14
图3.14手机联系人复制到手机卡运行效果图
3.8.将手机联系人移动到手机卡中
打开"sim.txt"和"phone.txt"文件,检查打开是否成功。若有任一文件打开失败,则输出错误信息并终止执行。使用循环从person.txt文件中逐行读取联系人信息,每行包含姓名和电话号码。对于每行读取的联系人信息,进行以下操作:初始化标记变量flag为0,用于判断该联系人是否已存在。检查内存是否已满,如果已满则输出错误信息并跳出循环。遍历已存储的联系人列表,检查该联系人是否已存在。如果存在,将flag设为1表示重复。如果flag为0,即该联系人不重复,则将其添加到联系人列表simpersons中,并将计数器SimpersonNum增加1。输出当前成功移动的联系人姓名。循环读取并处理文件中的所有联系人信息。将手机联系人长度设置为0,关闭"sim.txt"和"phone.txt"的文件流。
流程图见图3.15
图3.15手机联系人移动到手机卡功能流程图
运行效果见图3.16
图3.16手机联系人移动到手机卡功能运行效果
3.9.将手机卡联系人移动到手机中
打开"sim.txt"和"phone.txt"文件,检查打开是否成功。若有任一文件打开失败,则输出错误信息并终止执行。使用循环从sim.txt文件中逐行读取联系人信息,每行包含姓名和电话号码和籍贯和QQ。对于每行读取的联系人信息,进行以下操作:初始化标记变量flag为0,用于判断该联系人是否已存在。检查内存是否已满,如果已满则输出错误信息并跳出循环。遍历已存储的联系人列表,检查该联系人是否已存在。如果存在,将flag设为1表示重复。如果flag为0,即该联系人不重复,则将其添加到联系人列表persons中,并将计数器personNum增加1。输出当前成功移动的联系人姓名。循环读取并处理文件中的所有联系人信息。将手机卡的长度设置为0。关闭"sim.txt"和"phone.txt"的文件流。
流程图见图3.17
图3.17手机卡联系人移动到手机中
运行效果见图3.18
图3.18手机卡联系人移动到手机功能运行效果图
四、总结
在这一学期的c++学习当中,我了解了面向对象(opp)的三大特性:封装,继承和多态,同时也学习了一些文件流操作的方法和重载的实现,在本次课程设计当中,涉及了大部分的c++特性和知识,在控制手机通讯录和手机卡通讯录的时候更是使用到了多态,比如去用基类指针调用子类的方法在本次课程设计中,我也遇到了一些问题,比如文件流操作的时候一开始无法写入,后来发现是没有关闭文件流,还有清空文件内容的时候遇到了问题,在老师的指导下发现是没有将计数变量设为0,我认为我对c++的认识还不够完全,需要进一步深入学习研究。
标签:课程设计,流程图,联系人,C++,信息,手机卡,通讯录,手机,见图 From: https://blog.csdn.net/basai123/article/details/139637490