首页 > 编程语言 >【C++课程设计】通讯录管理系统

【C++课程设计】通讯录管理系统

时间:2024-06-16 15:59:49浏览次数:12  
标签:课程设计 流程图 联系人 C++ 信息 手机卡 通讯录 手机 见图

完整代码:开源地址

一、任务书  

手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(假设每个位置上的存储容量为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

相关文章

  • C++题解—1140—亲密数对(东方博宜OJ)
    题目描述:键盘输入 N,N 在2至 2000之间,求 2 至 N 中的亲密数对,就是A的因子和等于B,B的因子和等于A ,且A≠B。如 48和 75是亲密数对。48的因子和为2+3+4+6+8+12+16+24=75 ,而 75的因子和3+5+15+25=48 。输入:只有一行,为一个整数 N( 2≤N≤2000 )。输出:输出......
  • C++双端队列deque源码的深度学习(stack,queue的默认底层容器)
    什么是deque?deque是C++标准模板库(STL)中的一个容器,代表“双端队列”(double-endedqueue)。deque支持在其前端(front)和后端(back)进行快速插入和删除操作,并且它在序列的中间插入和删除元素时通常比vector或list更高效。deque的特点双端插入和删除:你可以在deque的头部和尾部快速......
  • C++面向对象三大特性
    C++三大特性包括了封装、继承、多态。封装:封装是将数据属性和操作这些数据的函数(方法)捆绑在一起的过程。它隐藏了实现细节,只暴露出一个可以被外界访问的接口。封装允许开发者将对象的实现细节保护起来,只提供必要的操作界面,从而减少错误和提高代码的可维护性。继承:继承是一种......
  • Qt/C++音视频开发77-获取本地有哪些摄像头名称/ffmpeg命令日志方式
    一、前言上一篇文章讲使用ffmpeg函数接口去获取本地摄像头信息,这种方式只能从ffmpeg5版本开始才具备,那ffmpeg3/4只能干瞪眼?那肯定不行的,必须要想办法打通这个功能,查阅信息发现可以执行命令ffmpeg-fdshow-list_devicestrue-idummy去获取,会通过日志打印出来,这是一个非常好......
  • C++U7-09-并查集
    并查集(DisjointSetUnion)是一种树型的数据结构,主要用于处理一些不相交集合(DisjointSets)的合并及查询问题。并查集能解决什么问题?在线游戏公会管理:应用场景:在一个大型多人在线游戏中,玩家可以创建或加入公会(公会相当于一个团队或群体)。随着时间的推移,公会可能会合并或解散。......
  • C++PrimerPlus:第十三章类和继承:静态联编和动态联编001
    第十三章类和继承:静态联编和动态联编提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:静态联编和动态联编提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录第十三章类和继承:静态联编和动态联编前言一、指针和引用类型的兼......
  • C++前期概念(重)
    目录命名空间命名空间定义1.正常的命名空间定义2.命名空间可以嵌套 3.头文件中的合并 命名空间使用命名空间的使用有三种方式:1:加命名空间名称及作用域限定符(::)2:用using将命名空间中某个成员引入3:使用usingnamespace命名空间名称引入C++输入&输出说明:std......
  • 蓝桥杯备考冲刺必刷题(C++) | 3791 珠宝的最大交替和
    学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(C++)|汇总-CSDN博客【题目描述】小莉是一位珠宝设计师,她非常喜欢玩珠子。她有一个长度为N......
  • 蓝桥杯备考冲刺必刷题(C++) | 3250 最大的卡牌价值
    学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(C++)|汇总-CSDN博客【题目描述】给定nnn副卡牌,每张卡牌具......
  • 算法02 递归算法及其相关问题【C++实现】
    递归在编程中,我们把函数直接或者间接调用自身的过程叫做递归。递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。递归的三大要素函数的参数。在用递归解决问题时,要合理地去设计函数的参数,达到当前问题与子问题之间的变化,可......