一、题目
模拟手机通信录管理系统 主要功能有: (1)查看功能:选择此功能,列出手机通信录得分类,如A同事、B家人、C朋友、D同学等分类,但选中某分类时,像是出此类所有数据中的姓名和电话号码; (2)增加功能:录入新数据(包括姓名、电话号码、分类),当录入重复的姓名和电话号码时,提示结果错误并取消录入。 (3)修改功能:对选择(选择的方式自定)的联系人,修改其通信录的相关信息,但如果修改姓名,不能跟其他已有的联系人的姓名不能重复。 (4)删除功能:选择某个联系人的姓名,可对此人的相应数据进行删除。 (5)其他功能:自行分析设计有特色效果的功能,作为加分点。如:排序、分组、个人收藏、最近联系人等。 (6)要求:设计合理的数据结构,实现合理美观的操作界面。
二、效果图
主界面第一页![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619125948128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 主界面第二页 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130012771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 我写的通讯录主要想尽力的模拟真实情况下的通讯录,首先这里我设定了一页内容只能显示三个联系人,可以通过W和S来进行一个翻页的操作,就像是我们在手机上滑上滑下浏览联系人一样,这里显示的主要是联系人姓名,我们可以输入联系人名字前的数字来访问联系人详细情况。 按下主界面相应联系人数字 进入联系人详情界面(这里★代表已收藏) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130045583.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 我们按下数字键后进入联系人详情界面可以看到联系人的姓名、电话、邮箱、生日、是否被收藏和分组的信息,进入联系人详情界面后我们还可以继续对当前联系人进行操作,都只要输入相应的数字键即可。 按下1拨打电话 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130350109.png) 通话界面 按下1可挂断 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130406104.png) 按下数字键1我们可以模拟打电话给当前联系人,同时通话结束后我们会将这个通话记录写入最近联系人中,这里的呼叫时间我用了一个随机数模拟,随机5以内的随机数,通话的过程中再次按下数字键1就可以返回刚才的界面 按下2可进行收藏和取消收藏的操作(这里☆代表取消收藏),这里的收藏可以随时按下,只要一按下当前页面就会做出相应的反应,刷新一次显示正确的字符,同时之后的收藏列表也会做出相应的记录。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130809867.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 按下3进入联系人修改界面 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130853799.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 名字修改重名的情况 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130909648.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 正常修改名字 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619130940895.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 名字已被修改完成 手机号修改重复 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131001838.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 正常修改手机号 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131044348.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 手机号修改完成 开始修改邮箱 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131104850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 邮箱修改完成 开始修改生日 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131122385.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 生日修改完成 开始修改分组 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131138582.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 修改后的样子![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131147510.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 删除联系人(二次确认) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131227360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 联系人被删除后 在通讯录上消失 同时人数显示减少(可以删除当前联系人,删除完后会马上进行一次保存,同时对总人数和联系人结构体数组进行更新,这样的话在通讯录显示界面就看不到被删除的联系人。) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131249245.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 姓名查找(模糊查找) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131546430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 姓名查找找不到输入的姓名 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131609628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 手机号查找(模糊查找) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131633602.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 手机号查找找不到输入的手机号 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131650358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 姓名查找到后按下相应数字键 可进入联系人详细界面进行其他操作(手机号查找同理),查找联系人的主要方法也是模拟手机的查找,输入的信息不完全时,会输出比较符合条件的联系人,而输入信息完全找不到时,就什么都不会显示,查找完联系人后我们还可以进入联系人详细界面进行其他操作。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131739425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 添加新联系人重名检测 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061913182852.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 添加新联系人重复手机号检测 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619131846449.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 添加新联系人成功 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619132023267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70) 新联系人显示在通讯录中 同时人数显示加一
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200619132041759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjYzMjYz,size_16,color_FFFFFF,t_70)
打开收藏的联系人列表 按下相应数字键可进入联系人详细界面进行其他操作 打开分组 打开“家人”分组 打开“朋友”分组 按下相应数字键可进入联系人详细界面进行其他操作 打开最近联系人 查看最近通话过的人 通讯录.txt中的记录的信息
三、分析
整体的思路主要就是通过一个结构体数组和对文件的读写来完成整个通讯录的模拟,主要的难点在于各个功能之间的协调和各个功能之间的也要保持独立性,涉及到的变量和函数比较多,运用到的数据结构主要也是一个队列,不运用链表的原因是各个联系人之间的关联性没有那么强,只要做好排序和分组即可,我们运用结构体来完成完全足以 ,我们将文件中的信息存入结构体数组中,同时对数组进行字典序排序,这里有点不足是没办法做到中文和英文混合排序,只能英文名字排序完后再对中文进行排序,排序完的结构体数组我们才进行输出,然后我们再利用写好的菜单界面来对排完序的数组进行增删查改的操作,每次操作完以后都要及时保存,同时也要对数组及时地重新排序。
四、代码
//XMUT ZRZ 2020.6.19
//jack 123456 [email protected] 1 2000 3 1 4
//rise 164459225 [email protected] 1 1999 3 5 2
//rose 134568974 [email protected] 1 2001 1 28 3
//开锁王师傅 7777776 [email protected] - 1 1995 2 6 1
//老李 2313313 [email protected] 1 1331 4 45 2
//郑润泽 1248845 [email protected] -1 2000 3 29 4
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define page_capacity 3
typedef struct Person {
string name;
string phonenumber;
string email;
int year = 0;
int month = 0;
int day = 0;
int kind = 0;//5——家人 4——朋友 3——同事 2——同学 1——其他
int like = 0;//1——被收藏 0——没被收藏
}Person;
Person person[100],callperson[100];
int total = 0,call_total=0;
int page = 1;
int index = 0;
void AutoRead()
{
string file = "通讯录.txt";
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
string s;
string name, phonenumber, email;
int year, month, day, kind, like;
char c;
infile >> name;
while ((c = infile.get()) != EOF)
{
infile >> phonenumber >> email >> like >> year >> month >> day>>kind ;
person[total].name = name;
person[total].phonenumber= phonenumber;
person[total].email = email;
person[total].year = year;
person[total].month = month;
person[total].day = day;
person[total].kind = kind;
person[total++].like = like;
//cout |