目录

一. 设计要求 2

二. 总体设计 4

三. 界面设计与各功能模块实现 8

四. 使用说明及编程体会 10

1)使用说明 10

2)编程体会: 16

五. 附件:代码 17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一. 设计要求

  手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含用户名和电话号码两项信息。存储在电话卡上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。

根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。

1. 创建文本文件,记录联系人的信息(创建两个文本文件,分别存储手机和手机卡上的存储的联系人的信息)。

2. 以菜单方式工作(字符界面即可)

3. 存储在手机上的联系人的信息包括:姓名和电话号码;

4. 存储在手机卡上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息

5. 管理系统的功能包括:

a) 新建联系人:

b) 添加新的联系人(添加时确定是添加到手机上还是手机卡中)

c) 删除:

删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)

d) 修改:

修改某个联系人的信息(输入电话号码,或者输入姓名,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)

e) 查询:

根据名字查询联系人信息(查询结果不唯一)

根据电话查询联系人信息(查询结果不唯一)

f) 浏览:

显示所有联系人的信息

g) 将联系人的信息从手机转存到手机卡上(同时要避免重复数据的存在。并且在转存是要检查容量是否受限。下同。)

h) 将联系人的信息从手机卡上准存到手机上(同时要避免重复数据的存在)

用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理。

二. 
总体设计

程序架构:

建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息

建立以下几个类:

1. 手机联系人类:表示一个联系人

数据成员包括:

姓名

电话号码

成员函数包括

带参并带默认值的构造函数

一组set函数为数据成员赋值

一组modify函数,修改数据成员的值

重载>>,<<运算符,完成对象的输入和输出操作

class Contacts {

protected:

string name,tel;                                        //数据成员有姓名,电话

public:

Contacts(string pname="Noname",string ptel="Notel");    //带参构造函数

void set(string pname="Noname",string ptel="Notel");    //set函数为数据成员赋值

void modify();                                          //按用户需求进行数据修改,所以无参

string getname();                                       //返回姓名

string gettel();                                        //返回电话

friend ostream & operator << (ostream & output,Contacts &);

friend istream & operator >> (istream & input,Contacts &);    //重载流插入和流提取运算符

};

2. 手机卡联系人(继承于手机联系人类):

新增数据成员:

籍贯

QQ号
成员函数包括

一组set函数为数据成员赋值:

内部调用Constacts的set函数

一组modify函数,修改数据成员的值  :

根据用户选择进行不同信息的修改

Get函数返回address,qq

重载>>,<<运算符,完成数据成员的输入输出操作

class Mobile_Contacts : public Contacts

{

protected:

string address,qq;         //新增数据成员籍贯,QQ

public:

Mobile_Contacts(string pname="Noname",string ptel="Notel",string paddress="Noaddress",string pqq="Noqq");

void set(string pname="Noname",string ptel="Notel",string paddress="Noaddress",string pqq="Noqq");

void modify();             //按用户需求进行数据修改,所以无参

string getaddress();

string getqq();

friend ostream & operator <<(ostream &output,Mobile_Contacts &);

friend istream & operator >>(istream &input,Mobile_Contacts &);

};

3. 定义一个通讯簿抽象类,用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数)

增加函数:增加一个联系人

删除操作:删除一个联系人1通过电话2通过姓名

Display:显示所有联系人的信息

修改某一联系人的信息:

查询并显示某一联系人的信息:

class address_list

{public:

virtual void add()=0;                            //添加新的联系人

virtual void removebytel(string ptel)=0;         //输入电话号码,删除该联系人。

virtual void removebyname(string pname)=0;       //输入姓名,删除该联系人。

virtual void change(string ptel)=0;              //输入电话号码,查询到联系人之后进行信息的修改。

virtual void query(string pname)=0;              //根据名字查询联系人信息

virtual void displayup()=0;                      //默认按姓名(ASCll码)降序排列

};

4. 手机通讯簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息

数据成员包括:

手机联系人的数量

手机联系人对象数组  用vector动态数组创建。

成员函数包括

构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组

创建fstream类对象instuf,读取文本文件中的数据,并根据文件                   内容创建联系人对象数组,文件含有标题行4行。

析构函数:将对象数组中的内容写入到文本文件中。

增加函数:增加一个联系人

删除操作:删除一个联系人

Display:显示所有联系人的信息

修改某一联系人的信息:

查询并显示某一联系人的信息:

class mobile_list : public address_list

{

protected:

int num;                                    //记录手机通讯薄中联系人的数量

vector<Mobile_Contacts> mymobilelist;       //用户的手机联系人对象数组

public:

mobile_list();

void add();

void removebytel(string ptel);

void removebyname(string name);

void change(string ptel);

void query(string pname);

void displayup();

void displaydown();                         //用户可选按姓名(ASCll码)升序排列

int getnum();

string getname(int i);                      //返回下标为i的联系人的name

string gettel(int i);                       //返回下标为i的联系人的tel

void copyset(string pname,string ptel);     //创建pname,ptel联系人压入vector

void clearmobile();                         //清空通讯录

~mobile_list();                             //析构函数将数组写入文件

};

5. 手机卡通信簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息

数据成员包括:

手机联系人的数量

手机联系人对象数组

成员函数包括

构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组

析构函数:将对象数组中的内容写入到文本文件中。

增加函数:增加一个联系人

删除操作:删除一个联系人

Display:显示所有联系人的信息

修改某一联系人的信息:

查询并显示某一联系人的信息:

class card_list : public address_list

{

protected:

int num;                        //记录手机卡通讯薄中联系人的数量

vector<Contacts> mycardlist;    //用户的手机卡联系人对象数组

public:

card_list();                    //构造函数从文件中读取手机卡联系人写到数组里,供用户进行操作

void add();

void removebytel(string ptel);

void removebyname(string name);

void change(string ptel);

void query(string pname);

void displayup();               //默认按姓名(ASCll码)降序排列

void displaydown();             //用户可选按姓名(ASCll码)升序排列

int getnum();                   //返回联系人个数

string getname(int i);          //返回下标为i的联系人的name

string gettel(int i);           //返回下标为i的联系人的tel

void copyset(string pname,string ptel);//创建pname,ptel联系人压入vector

void clearcard();               //清空通讯录

~card_list();                   //析构函数将数组写入文件

};

6. 用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理

数据成员包括:

两个通讯簿对象

一个菜单对象

成员函数包括(成员函数体现用户的行为):

添加联系人:利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通 信簿)的增加函数完成联系人的添加。实现动态联编,体现出多 态特点。(下同)

删除联系人:调用相应的通讯簿对象的删除操作删除一个联系人

Display:显示相应的通讯簿中联系人的信息

修改某一联系人的信息:调用通讯簿对象的函数完成操作

查询并显示某一联系人的信息:调用通讯簿对象的函数完成操作

将手机卡中的存储的联系人的信息移动到手机中

将手机中存储的联系人的信息移动到手机卡中

将手机卡中的存储的联系人的信息复制到手机中

将手机中存储的联系人的信息复制到手机卡中

class user {

mobile_list mymobile;          //用户的手机通讯录

card_list mycard;              //用户的手机卡通讯录

menu umenu;

public:

user();

void add();                    //利用基类指针,调用通讯簿对象的函数完成操作(下同),添加时确定是添加到手机上还是手机卡中

void removebytel();    //输入电话号码,删除联系人,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作

void removebyname();    //输入姓名,删除联系人,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作

void change();    //输入电话号码,查询到联系人之后进行信息的修改。如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作

void query();                  //输入姓名,查询联系人,两个通讯录都进行查询

void display();                //显示两个通讯簿中联系人的信息

void copyctom();               //将手机卡中的存储的联系人的信息复制到手机中

void copymtoc();               //将手机中存储的联系人的信息复制到手机卡中

void movectom();               //将手机卡中的存储的联系人的信息移动到手机中

void movemtoc();               //将手机中存储的联系人的信息移动到手机卡中  (之前的就没了)

~user();

};

7. 界面菜单类:用来给出操作提示

数据成员:可以不定义数据成员

成员函数:

Display函数:显示操作菜单的提示。

说明:可以根据需要定义多个函数,显示不同的菜单(操作提示)。

class menu{

public:

void description();

void mainmenu();

void addmenu();

void remove1menu();

void changemenu();

void querymenu();

void displaymenu();

void displaymenu2();

void displaymenu3();

};

三. 界面设计与各功能模块实现

 

switch(choose)

{

case '0': break;system("color 3B");          case '1':

me.add();                        //增加

break;

case '2':

cout<<"请选择操作方式: 1.按电话删除,\n\t\t2.按姓名删除.\n请输入你的选择:"<<endl;

cin>>c;

switch(c)

{

case '1':

me.removebytel();             //用tel删除

break;

case '2':

me.removebyname();            //用name删除

break;

default:

cout<<"选择错误!"<<endl; system("color 3B");    break;

}

break;

case '3':

me.change();                      //修改

break;

case '4':

me.query();                       //查询

break;

case '5':

me.display();                     //浏览

break;

case '6':

cout<<"请选择操作方式: 1.复制,2.移动."<<endl;

cin>>c;

switch(c)

{

case '1':

me.copymtoc();               break;

case '2':

me.movemtoc();             break;

default :

cout<<"选择错误!"<<endl;system("color 3B");

}

break;

case '7':

cout<<"请选择操作方式: 1.复制,2.移动."<<endl;

cin>>c;

switch(c)

{

case '1':

me.copyctom();               break;

case '2':

me.movectom();             break;

default :

cout<<"选择错误!"<<endl;system("color 3B");

}

break;

default :

cout<<"选择错误!"<<endl;system("color 3B");

}

 

四. 使用说明及编程体会

1)使用说明

运行之后自动弹出使用说明,按任意键后进入菜单,即可进行选择。

1. 创建联系人

输入后选择要创建的位置

添加成功后,会显示添加联系人成功!并显示当前联系人的个数;

最后,会询问下一步要求:是否返回主菜单?

2. 修改联系人

输入要修改联系人的位置后,输入要修改人的电话号码

找到后,会输出该联系人的信息;

并且会询问是否要修改该联系人的信息

确定输入您要修改的联系人的信息;

若输入有误,则返回主菜单;

3. 删除联系人

选择删除联系人的位置;之后输入删除联系人的电话号码;

并显示该联系人的信息,确定是否删除。

最后删除成功。

4. 查询并显示联系人

5. 显示联系人

6. 将手机联系人移动到手机卡联系人

7. 将手机卡联系人移动到手机联系人

8. 将手机联系人复制到手机卡联系人

9. 将手机卡联系人复制到手机联系人

若存在则不复制

0. 退出通讯录

10 .补充说明:在对设计说明部分,参考下面的形式对类的定义进行介绍:

类的名字

{

类的数据成员包括 :

成员的名字及其作用进行介绍

类的成员函数包括:

InitList (函数的名字、函数的接口及功能介绍)

前置条件:线性表不存在     //说明:前置条件指函数运行之前的状态

输入:无

功能:线性表的初始化

输出: 无

后置条件:一个空的线性表  //后置条件指函数运行之后的状态

DestroyList

前置条件:线性表已存在

输入:无

功能:销毁线性表

输出:无

后置条件:释放线性表所占用的存储空间

Length

前置条件:线性表已存在

输入:无

功能:求线性表的长度

输出: 线性表中数据元素的个数

后置条件:线性表不变

Get

前置条件:线性表已存在

输入:元素的序号 i

功能:在线性表中取序号为 i 的数据元素

输出:如果序号合法,返回序号为 i 的元素值,否则抛出异常

后置条件:线性表不变

Locate

前置条件:线性表已存在

输入:数据元素 x

功能:在线性表中查找值等于 x 的元素

输出:如果查找成功,返回元素 x 在表中的序号,否则返回 0

后置条件:线性表不变

Insert

前置条件:线性表已存在

输入:插入位置 i ;待插元素 x

功能:在线性表的第 i 个位置处插入一个新元素 x

输出:若插入不成功,抛出异常

后置条件:若插入成功,表中增加了一个新元素

Delete

前置条件:线性表已存在

输入:删除位置 i

功能:删除线性表中的第 i 个元素

输出:若删除成功,返回被删元素,否则抛出异常

后置条件:若删除成功,表中减少了一个元素

Empty

前置条件:线性表已存在

输入:无

功能:判断线性表是否为空表

输出:若是空表,返回 1 ,否则返回 0

后置条件:线性表不变

PrintList

前置条件:线性表已存在

输入:无

功能:按位置的先后次序依次输出线性表中的元素

输出:线性表的各个数据元素

后置条件:线性表不变

}

2)编程体会:

本次编写c++先前没有用动态数组,后来百度了动态数组,千言万语说了很多动态数组的好处,我觉得不能浪费这次机会,于是我推倒了前面的没有利用动态数组的编程,不过利用动态数组的水平确实是有限的,本次借鉴了大量学长的代码,我也修改了诸多的bug,在代码的调试过程中,确实是发现了很多问题,增长了不少知识,在数据结构中能用到的又重新利用了起来。还有就是system的一部分让我能够美化界面去除多余。增加了与用户的交互模式,促进程序的友好性。

还有一点就是我觉得,在代码调用的过程中类与类之间的相互关联,主类中的调用,包含,以及成员函数的嵌套,利用另一些成员函数来完成另一些做不到的艺术感觉,就是虚函数的基类指针,相互利用达到最好资源利用效果。这种艺术感油然而生。

另外提出一点就是懂得了如何自己编写头文件,但是一开始自己在利用自编的头文件的时候,总是出现这样那样的错误,我没法避免各种错误信息,于是舍弃多个文件,这才出现了现在的一个  .cpp文件,估计是我的文件结束/开始标志没有写   extern没有,才会导致我的7个  .h /.cpp不能成功运行

从头回顾一下编写程序的初衷,现实情况下的编程和我们现在所学用到和实现的确实是不同,本以为通讯录程序会像我们用的手机中的选择一样,后来通过谷歌了解到,手机的通讯录,都是底层调用,app也是如此,一些权限功能的开放,在我们现在所学的都是利用不到的,不过涉及的知识也是更加宽泛,在一个就是如何整合UI,界面的封装,数据库的存取交互,以及各种通过api完成的对接。

幸福来之不易,还得多回去练习,提高自己的水平,才能更好的建造艺术。

五. 附件:代码

#include <iostream>
#include<bits/stdc++.h>
using namespace std;/**可以修改以下内容选择存放的额位置*/
const char *mymobilelistfile="D://my_phonelist.txt";            //系统默认在这个文件中读写手机
const char *mycardlistfile="D:\\my_cardlist.txt";            //系统默认在这个文件中读写
/**第一个类***手机联系人  */
class Contacts {
protected:string name,tel;                                        //数据成员有姓名,电话
public:Contacts(string pname="Noname",string ptel="Notel");    //带参构造函数void set(string pname="Noname",string ptel="Notel");    //set函数为数据成员赋值void modify();                                          //按用户需求进行数据修改,所以无参string getname();                                       //返回姓名string gettel();                                        //返回电话friend ostream & operator << (ostream & output,Contacts &);friend istream & operator >> (istream & input,Contacts &);    //重载流插入和流提取运算符
};
Contacts::Contacts(string pname,string ptel)
{name=pname; tel=ptel;
}
void Contacts::set(string pname,string ptel)            //有的函数定义内联函数后会出现连接问题
{name=pname; tel=ptel;
}
void Contacts::modify()
{string pname,ptel;char choose;cout<<"请选择你要修改的内容:(1.修改姓名和电话号码,2.仅修改姓名,3.仅修改号码)"<<endl;cin>>choose;switch(choose){case '1':cout<<"请重新输入姓名 :";cin>>pname;cout<<"请重新输电话号码 :";cin>>ptel;name=pname; tel=ptel;break;case '2':cout<<"请重新输入姓名 :";cin>>pname;name=pname;break;case '3':cout<<"请重新输电话号码 :";cin>>ptel;tel=ptel;break;default :cout<<"选择错误!修改取消!"<<endl;}
}
string Contacts::getname()
{return name;}
string Contacts::gettel()
{return tel;}
ostream& operator<<(ostream& output,Contacts& obj)         //如果Contacts &前面加const,那么get函数也要是const
{output<<"姓名: ";output.width(15);                                         //格式控制代替制表符output.setf(ios::left);output<<obj.getname();output<<"电话号码: "<<obj.gettel()<<endl;return output;
}
istream& operator>>(istream& input,Contacts& obj)        //VC6.0编译器限制需要借助get和set函数
{string pname,ptel;cout<<"请输入姓名 :";input>>pname;cout<<"请输电话号码 :";input>>ptel;obj.set(pname,ptel);return input;
}/**第2个类***卡联系人  */
class Mobile_Contacts : public Contacts
{
protected:string address,qq;         //新增数据成员籍贯,QQ
public:Mobile_Contacts(string pname="Noname",string ptel="Notel",string paddress="Noaddress",string pqq="Noqq");void set(string pname="Noname",string ptel="Notel",string paddress="Noaddress",string pqq="Noqq");void modify();             //按用户需求进行数据修改,所以无参string getaddress();string getqq();friend ostream & operator <<(ostream &output,Mobile_Contacts &);friend istream & operator >>(istream &input,Mobile_Contacts &);
};Mobile_Contacts::Mobile_Contacts(string pname,string ptel,string paddress,string pqq):Contacts(pname,ptel)
{address=paddress; qq=pqq;
}
inline void Mobile_Contacts::set(string pname,string ptel,string paddress,string pqq)
{Contacts::set(pname,ptel);                         //调用基类set函数address=paddress;qq=pqq;
}
void Mobile_Contacts::modify()
{string pname,ptel,paddress,pqq;char choose;cout<<"请选择你要修改的内容:(1.修改全部内容,2.仅修改姓名,3.仅修改号码,4.仅修改籍贯,5.仅修改QQ)"<<endl;cin>>choose;switch(choose)                                     //匹配不同修改方式{case '1':cout<<"请重新输入姓名 :";cin>>pname;cout<<"请重新输电话号码 :";cin>>ptel;cout<<"请重新输入籍贯 :";cin>>paddress;cout<<"请重新输入QQ :";cin>>pqq;name=pname; tel=ptel; address=paddress; qq=pqq;break;case '2':cout<<"请重新输入姓名 :";cin>>pname;name=pname;break;case '3':cout<<"请重新输电话号码 :";cin>>ptel;tel=ptel;break;case '4':cout<<"请重新输入籍贯 :";cin>>paddress;address=paddress;case '5':cout<<"请重新输入QQ :";cin>>pqq;qq=pqq;default :cout<<"选择错误!修改取消!"<<endl;}
}
string Mobile_Contacts::getaddress()
{return address;}
inline string Mobile_Contacts::getqq()
{return qq;}
ostream & operator << (ostream &output,Mobile_Contacts &obj)
{output<<"姓名: "; output.width(12);                //格式控制代替制表符output.setf(ios::left);output<<obj.getname();output<<"电话: "; output.width(12);output<<obj.gettel();output<<"籍贯: "; output.width(12);output<<obj.getaddress();output<<"QQ号: ";output<<obj.getqq()<<endl;return output;
}
istream & operator >> (istream & input,Mobile_Contacts & obj)
{string pname,ptel,paddress,pqq;cout<<"请输入姓名 :";input>>pname;cout<<"请输电话号码 :";input>>ptel;cout<<"请输入籍贯 :";input>>paddress;cout<<"请输入QQ :";input>>pqq;obj.set(pname,ptel,paddress,pqq);return input;
}/**第3个类    通讯录信息**/
class address_list {
public:virtual void add()=0;                            //添加新的联系人virtual void removebytel(string ptel)=0;         //输入电话号码,删除该联系人。virtual void removebyname(string pname)=0;       //输入姓名,删除该联系人。virtual void change(string ptel)=0;              //输入电话号码,查询到联系人之后进行信息的修改。virtual void query(string pname)=0;              //根据名字查询联系人信息virtual void displayup()=0;                      //默认按姓名(ASCll码)降序排列
};/**第4个类    卡通讯录信息**/
class card_list : public address_list
{
protected:int num;                        //记录手机卡通讯薄中联系人的数量vector<Contacts> mycardlist;    //用户的手机卡联系人对象数组
public:card_list();                    //构造函数从文件中读取手机卡联系人写到数组里,供用户进行操作void add();void removebytel(string ptel);void removebyname(string name);void change(string ptel);void query(string pname);void displayup();               //默认按姓名(ASCll码)降序排列void displaydown();             //用户可选按姓名(ASCll码)升序排列int getnum();                   //返回联系人个数string getname(int i);          //返回下标为i的联系人的namestring gettel(int i);           //返回下标为i的联系人的telvoid copyset(string pname,string ptel);//创建pname,ptel联系人压入vectorvoid clearcard();               //清空通讯录~card_list();                   //析构函数将数组写入文件
};bool upcard( Contacts & a, Contacts & b)                      //自定义比较函数,对Contacts类按姓名(ASCll码)升序排列
{return a.getname()>b.getname();
}
bool downcard( Contacts & a, Contacts & b)                     //自定义比较函数,对Contacts类按姓名(ASCll码)降序排列
{return a.getname()<b.getname();
}
card_list::card_list()   //构建就是对内存的操作写入
{num=-1;char s[100],pname[30],ptel[30];Contacts temp;ifstream instuf(mycardlistfile,ios::in);                //建立输入文件流对象,写入到内存中if(!instuf){cerr<<"File could not be open."<<endl;abort();}instuf.getline(s,100);instuf.getline(s,100);instuf.getline(s,100);instuf.getline(s,100);                                 //略去标题行while(instuf>>pname>>ptel&&pname!="Noname")    //字符不相同{temp.set(pname,ptel);mycardlist.push_back(temp);   //写入压入最后num++;}instuf.close();}
void card_list::add()
{if(num>999) {cout<<"手机卡通讯录容量已满!无法增加新联系人!"<<endl; return ;}                //已达到容量上限Contacts temp;cin>>temp;                                             //调用重载>>mycardlist.push_back(temp);num++;                                                 //加入数组cout<<"增加成功!操作完成!"<<endl;
}
void card_list::removebytel(string ptel)
{if(num<0){cout<<"手机卡通讯录当前没有联系人,无法进行删除!"<<endl;return ;     //这里不加任何代表结束函数运行的意思,}while(1){int flag=0;for(int i=0;i<=num;i++){if(mycardlist[i].gettel()==ptel)             //找到了联系人{flag=1;cout<<"将要删除联系人的信息:"<<endl;cout<<mycardlist[i];cout<<"请确认是否删除:(输入Y确认删除,输入其他字符取消操作)"<<endl;                    //容错char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){ mycardlist.erase(mycardlist.begin()+i); num--; cout<<"删除成功!"<<endl;}        //删除else {cout<<"删除取消!返回菜单!"; break;}cout<<"是否继续寻找相同电话号码的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;  //容错cin>>chiose;if(chiose=='Y'||chiose=='y') { flag=0;continue;}else break;}}if(flag==0)                                   //未找到联系人{cout<<"在手机卡通讯录没有找到该电话号码对应的联系人!是否重新输入\n(输入Y确认删除,输入其他字符取消操作)"<<endl; //容错char choose; cin>>choose;if(choose=='Y'||choose=='y'){cout<<"请重新输入电话号码 :"; cin>>ptel; continue;}else  {cout<<"输入取消,删除结束!"<<endl; return;}}else {cout<<"搜索结束,删除完毕!"<<endl; return;}}
}
void card_list::removebyname(string pname)
{if(num==0){cout<<"手机卡通讯录当前没有联系人,无法进行删除!"<<endl;return ;}while(1){int flag=0;for(int i=0;i<=num;i++){if(mycardlist[i].getname()==pname){flag=1;cout<<"将要删除联系人的信息:"<<endl;cout<<mycardlist[i];cout<<"请确认是否删除:(输入Y确认删除,输入其他字符取消操作)"<<endl;char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){ mycardlist.erase(mycardlist.begin()+i); num--;cout<<"删除成功!"<<endl;}else {cout<<"删除取消!返回菜单!"; break;}cout<<"是否继续寻找相同姓名的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;cin>>chiose;if(chiose=='Y'||chiose=='y') { flag=0;continue;}else break;}}if(flag==0){cout<<"在手机卡通讯录没有找到该姓名对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入姓名 :"; cin>>pname; continue;}else  {cout<<"输入取消,删除结束!"<<endl; return;}}else {cout<<"搜索结束,删除完毕!"<<endl; return;}}
}
void card_list::change(string ptel)
{if(num<0)  return ;while(1){int flag=0;for(int i=0;i<=num;i++){if(mycardlist[i].gettel()==ptel){flag=1;cout<<"将要修改联系人的信息:"<<endl;cout<<mycardlist[i];cout<<"请确认是否修改:(输入Y确认修改,输入其他字符取消操作)"<<endl;char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){//cin>>mycardlist[i];mycardlist[i].modify();                         //为什么不能用modify,函数inline了,在别的文件往往不能连接cout<<"修改成功!"<<endl;}cout<<"是否继续寻找相同电话号码的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;cin>>chiose;if(chiose=='Y'||chiose=='y') {flag=0; continue;}else cout<<"操作取消!"; break;}}if(flag==0){cout<<"在手机卡通讯录没有找到该电话号码对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入电话号码 :"; cin>>ptel; continue;}else  {cout<<"输入取消,修改结束!"<<endl; return;}}else {cout<<"搜索结束,修改完毕!"<<endl; return;}}}
void card_list::query(string pname)
{if(num<0)  return;while(1){int flag=0;for(int i=0;i<=num;i++){if(mycardlist[i].getname()==pname){flag=1;cout<<"你要查找联系人的信息:"<<endl;cout<<mycardlist[i];cout<<"是否继续寻找相同姓名的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;char chiose; cin>>chiose;if(chiose=='Y'||chiose=='y') {flag=0; continue;}else break;}}if(flag==0){cout<<"在手机卡通讯录没有找到该电话号码对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入姓名 :"; cin>>pname; continue;}else  {cout<<"输入取消,查询结束!"<<endl; return;}}else {cout<<"搜索结束,查询完毕!"<<endl; return;}}
}
void card_list::displayup()
{if(num<0)  {cout<<"手机卡通讯录当前没有联系人!"<<endl; return;}cout<<"手机卡通讯录中目前共有"<<num+1<<"个联系人."<<endl;sort(mycardlist.begin(),mycardlist.end(),upcard);vector<Contacts>::iterator it;       //这里百度了用法https://blog.csdn.net/yyangzhenjie/article/details/74518905for(it=mycardlist.begin();it!=mycardlist.end();it++){cout<<(*it);}
}
void card_list::displaydown()
{if(num<0)  {cout<<"手机卡通讯录当前没有联系人!"<<endl; return;}cout<<"手机卡通讯录中目前共有"<<num+1<<"个联系人."<<endl;sort(mycardlist.begin(),mycardlist.end(),downcard);vector<Contacts>::iterator it;for(it=mycardlist.begin();it!=mycardlist.end();it++){cout<<(*it);}
}
int card_list::getnum()
{return num;}
string card_list::getname(int i)        //返回下标为i的联系人的信息
{return mycardlist[i].getname();
}
string card_list::gettel(int i)
{return mycardlist[i].gettel();
}
void card_list::copyset(string pname,string ptel)
{for(int i=0;i<=num;i++)              //避免对相同电话和姓名的联系人再次复制{if(mycardlist[i].getname()==pname&&mycardlist[i].gettel()==ptel){cout<<"已存在姓名为:"<<pname<<" 且电话为:"<<ptel<<" 的联系人!"<<endl;return ;}}Contacts temp;temp.set(pname,ptel);mycardlist.push_back(temp);num++;
}
void card_list::clearcard()
{mycardlist.clear();num=-1;
}
card_list::~card_list()
{ofstream outstuf(mycardlistfile,ios::out);         //建立输入文件流对象   内存写入硬件if(!outstuf){cerr<<"File could not be open."<<endl;abort();}outstuf<<"**************************************************"<<endl;outstuf<<"*                手机卡通讯录                    *"<<endl;outstuf<<"**************************************************"<<endl;outstuf<<"姓名"<<"\t\t\t电话号码"<<endl;for(int i=num;i>=0;i--){outstuf.width(24); outstuf.setf(ios::left);outstuf<<mycardlist[i].getname();outstuf<<mycardlist[i].gettel()<<endl;}outstuf.close();mycardlist.clear();
}/***第5个类  手机通讯录  ******/
class mobile_list : public address_list
{
protected:int num;                                    //记录手机通讯薄中联系人的数量vector<Mobile_Contacts> mymobilelist;       //用户的手机联系人对象数组
public:mobile_list();void add();void removebytel(string ptel);void removebyname(string name);void change(string ptel);void query(string pname);void displayup();void displaydown();                         //用户可选按姓名(ASCll码)升序排列int getnum();string getname(int i);                      //返回下标为i的联系人的namestring gettel(int i);                       //返回下标为i的联系人的telvoid copyset(string pname,string ptel);     //创建pname,ptel联系人压入vectorvoid clearmobile();                         //清空通讯录~mobile_list();                             //析构函数将数组写入文件
};bool downmobile(Mobile_Contacts & a, Mobile_Contacts & b)           //自定义比较函数,对Mobile_Contacts类按姓名(ASCll码)降序排列
{return a.getname()>b.getname();
}
bool upmobile( Mobile_Contacts & a, Mobile_Contacts & b)           //自定义比较函数,对Mobile_Contacts类按姓名(ASCll码)升序排列
{return a.getname()<b.getname();
}
mobile_list::mobile_list()
{num=-1;char s[100],pname[30],ptel[30],paddress[30],pqq[20];Mobile_Contacts temp;ifstream instuf(mymobilelistfile,ios::in);                 //建立输入文件流对象  写入到内存中if(!instuf){cerr<<"File could not be open."<<endl;abort();}instuf.getline(s,100);instuf.getline(s,100);instuf.getline(s,100);instuf.getline(s,100);                                     //略去标题行while(instuf>>pname>>ptel>>paddress>>pqq&&pname!="Noname"){                                                          //提取并放入数组temp.set(pname,ptel,paddress,pqq);mymobilelist.push_back(temp);num++;}instuf.close();
}
void mobile_list::add()
{if(num>999) {cout<<"手机通讯录容量已满!无法增加新联系人!"<<endl; return ;} //已达到容量上限Mobile_Contacts temp;cin>>temp;                                                 //调用重载>>mymobilelist.push_back(temp);                              //压入数组num++;cout<<"增加成功!"<<endl;
}
void mobile_list::removebytel(string ptel)
{if(num<0){cout<<"手机通讯录当前没有联系人,无法进行删除!"<<endl;return ;}while(1){int flag=0;for(int i=0;i<=num;i++){if(mymobilelist[i].gettel()==ptel)                //找到了联系人{flag=1;cout<<"将要删除联系人的信息:"<<endl;cout<<mymobilelist[i];cout<<"请确认是否删除:(输入Y确认删除,输入其他字符取消操作)"<<endl;char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){ mymobilelist.erase(mymobilelist.begin()+i); num--;cout<<"删除成功!"<<endl; }                     //删除cout<<"是否继续寻找相同电话号码的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;cin>>chiose;if(chiose=='Y'||chiose=='y') { flag=0;continue;}else break;}}if(flag==0)                                       //未找到联系人{cout<<"在手机通讯录没有找到该电话号码对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入电话号码 :"; cin>>ptel; continue;}else  {cout<<"输入取消,删除结束!"<<endl; return;}}else {cout<<"搜索结束,删除完毕!"<<endl; return;}}
}
void mobile_list::removebyname(string pname)
{if(num==0){cout<<"手机通讯录当前没有联系人,无法进行删除!"<<endl;return ;}while(1){int flag=0;for(int i=0;i<=num;i++){if(mymobilelist[i].getname()==pname){flag=1;cout<<"将要删除联系人的信息:"<<endl;cout<<mymobilelist[i];cout<<"请确认是否删除:(输入Y确认删除,输入其他字符取消操作)"<<endl;char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){ mymobilelist.erase(mymobilelist.begin()+i); num--;cout<<"删除成功!"<<endl; }cout<<"是否继续寻找相同姓名的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;cin>>chiose;if(chiose=='Y'||chiose=='y') { flag=0;continue;}else break;}}if(flag==0){cout<<"在手机通讯录没有找到该姓名对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl; //容错char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入姓名 :"; cin>>pname; continue;}else  {cout<<"输入取消,删除结束!"<<endl; return;}}else {cout<<"搜索结束,删除完毕!"<<endl; return;}}
}
void mobile_list::change(string ptel)
{if(num<0)  return ;while(1){int flag=0;for(int i=0;i<=num;i++){if(mymobilelist[i].gettel()==ptel){flag=1;cout<<"将要修改联系人的信息:"<<endl;cout<<mymobilelist[i];cout<<"请确认是否修改:(输入Y确认修改,输入其他字符取消操作)"<<endl;char chiose;cin>>chiose;if(chiose=='Y'||chiose=='y'){//   cin>>mymobilelist[i];    //这个也可以mymobilelist[i].modify();                     //修改cout<<"修改成功!"<<endl;}cout<<"是否继续寻找相同电话号码的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;cin>>chiose;if(chiose=='Y'||chiose=='y') {flag=0; continue;}else break;}}if(flag==0){cout<<"在手机通讯录没有找到该电话号码对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入电话号码 :"; cin>>ptel; continue;}else  {cout<<"输入取消,修改结束!"<<endl; return;}}else {cout<<"搜索结束,修改完毕!"<<endl; return;}}
}
void mobile_list::query(string pname)
{if(num<0)  return ;while(1){int flag=0;for(int i=0;i<=num;i++){if(mymobilelist[i].getname()==pname){flag=1;cout<<"你要查找联系人的信息:"<<endl;cout<<mymobilelist[i];cout<<"是否继续寻找相同姓名的联系人?(输入Y确认继续,输入其他字符取消操作)"<<endl;char chiose; cin>>chiose;if(chiose=='Y'||chiose=='y') { continue;}else break;}}if(flag==0){cout<<"在手机通讯录没有找到该姓名对应的联系人!是否重新输入(输入Y确认删除,输入其他字符取消操作)"<<endl;char choose; cin>>choose;if(choose=='Y'||choose=='y') {cout<<"请重新输入姓名 :"; cin>>pname; continue;}else  {cout<<"输入取消,查询结束!"<<endl; return;}}else {cout<<"搜索结束,查询完毕!"<<endl; return ;}}
}
void mobile_list::displayup()
{if(num<0)  {cout<<"手机通讯录当前没有联系人!"<<endl; return;}cout<<"手机通讯录中目前共有"<<num+1<<"个联系人."<<endl;sort(mymobilelist.begin(),mymobilelist.end(),downmobile);vector<Mobile_Contacts>::iterator it;for(it=mymobilelist.begin();it!=mymobilelist.end();it++){cout<<(*it);}
}
void mobile_list::displaydown()
{if(num<0)  {cout<<"手机通讯录当前没有联系人!"<<endl; return;}cout<<"手机通讯录中目前共有"<<num+1<<"个联系人."<<endl;sort(mymobilelist.begin(),mymobilelist.end(),upmobile);vector<Mobile_Contacts>::iterator it;for(it=mymobilelist.begin();it!=mymobilelist.end();it++){cout<<(*it);}
}
int mobile_list::getnum()
{return num;}
string mobile_list::getname(int i)
{return mymobilelist[i].getname();
}
string mobile_list::gettel(int i)
{return mymobilelist[i].gettel();
}
void mobile_list::copyset(string pname,string ptel)
{for(int i=0;i<=num;i++)                                                      //避免对相同电话和姓名的联系人再次复制{if(mymobilelist[i].getname()==pname&&mymobilelist[i].gettel()==ptel){cout<<"已存在姓名为:"<<pname<<" 且电话为:"<<ptel<<" 的联系人!"<<endl;return ;}}Mobile_Contacts temp;temp.set(pname,ptel,"Noaddress","NoQQ");mymobilelist.push_back(temp);num++;
}
void mobile_list::clearmobile()
{mymobilelist.clear();num=-1;
}
mobile_list::~mobile_list()
{ofstream outstuf(mymobilelistfile,ios::out);           //建立输出文件流对象if(!outstuf){cerr<<"File could not be open."<<endl;abort();}outstuf<<"***************************************************************"<<endl;outstuf<<"*                          手机通讯录                         *"<<endl;outstuf<<"***************************************************************"<<endl;outstuf<<"姓名"<<"\t\t电话"<<"\t\t籍贯"<<"\t\tQQ"<<endl;for(int i=num;i>=0;i--){outstuf.setf(ios::left);                            //数组内容写入文件 (硬件)outstuf.width(16);outstuf<<mymobilelist[i].getname();outstuf.width(16);outstuf<<mymobilelist[i].gettel();outstuf.width(16);outstuf<<mymobilelist[i].getaddress();outstuf<<mymobilelist[i].getqq()<<endl;}
}/**第6个类  菜单    **/
class menu{
public:void description();void mainmenu();void addmenu();void remove1menu();void changemenu();void querymenu();void displaymenu();void displaymenu2();void displaymenu3();
};
void menu::mainmenu()
{cout<<"*****************************************************************"<<endl;cout<<"*              请输入数字选择相应的操作:                       *"<<endl;cout<<"*---------------------------------------------------------------*"<<endl;cout<<"*                                                               *"<<endl;cout<<"*           0.       退出系统,并保存文件.                      *"<<endl;cout<<"*           1.       新建联系人.                                *"<<endl;cout<<"*           2.       删除一个联系人.                            *"<<endl;cout<<"*           3.       修改联系人的信息.                          *"<<endl;cout<<"*           4.       查询联系人信息.                            *"<<endl;cout<<"*           5.       浏览所有联系人的信息.                      *"<<endl;cout<<"*           6.       将联系人的信息从手机转存到手机卡上.        *"<<endl;cout<<"*           7.       将联系人的信息从手机卡上转存到手机上.      *"<<endl;cout<<"*****************************************************************"<<endl;cout<<"请输入你的选择:"<<endl;
}
void menu::addmenu()
{cout<<"**************************************************"<<endl;cout<<"*           请选择增加联系人到哪个通讯录:       *"<<endl;cout<<"*             1.手机通讯录.                      *"<<endl;cout<<"*             2.手机卡通讯录.                    *"<<endl;cout<<"**************************************************"<<endl;cout<<"请输入你的选择:"<<endl;
}
void menu::remove1menu()
{cout<<"**************************************************"<<endl;cout<<"*           请选择在哪个通讯录删除联系人:       *"<<endl;cout<<"*             1.手机通讯录.                      *"<<endl;cout<<"*             2.手机卡通讯录.                    *"<<endl;cout<<"*             3.两通讯录都进行删除               *"<<endl;cout<<"**************************************************"<<endl;cout<<"请输入你的选择:"<<endl;
}
void menu::changemenu()
{cout<<"**************************************************"<<endl;cout<<"*         请选择在哪个通讯录中修改联系人:       *"<<endl;cout<<"*             1.手机通讯录.                      *"<<endl;cout<<"*             2.手机卡通讯录.                    *"<<endl;cout<<"**************************************************"<<endl;cout<<"请输入你的选择:"<<endl;
}
void menu::querymenu()
{cout<<"**************************************************"<<endl;cout<<"*           请选择在哪个通讯录查询:             *"<<endl;cout<<"*             1.手机通讯录.                      *"<<endl;cout<<"*             2.手机卡通讯录.                    *"<<endl;cout<<"**************************************************"<<endl;cout<<"请输入你的选择:"<<endl;
}
void menu::displaymenu()
{cout<<"****************************************"<<endl;cout<<"*           请选择排序方式:           *"<<endl;cout<<"*             1.降序.                  *"<<endl;cout<<"*             2.升序.                  *"<<endl;cout<<"****************************************"<<endl;
}
void menu::displaymenu2()
{cout<<"**************************************************"<<endl;cout<<"*                手机卡通讯录                    *"<<endl;cout<<"**************************************************"<<endl;
}
void menu::displaymenu3()
{cout<<"************************************************************************"<<endl;cout<<"*                               手机通讯录                             *"<<endl;cout<<"************************************************************************"<<endl;
}
void menu::description()
{cout<<"*****************************************************************"<<endl;cout<<"*                        Description                            *"<<endl;cout<<"*请使用前阅读此说明:                                           *"<<endl;cout<<"*        请注意:只有选择0.退出后才能将进行操作后的通讯录保存   *"<<endl;cout<<"*    到文件里,直接关闭程序会导致操作内容无效,但原通讯录不会   *"<<endl;cout<<"*    丢失。                                                     *"<<endl;cout<<"*        系统默认对手机联系人在mymobilelistdata.txt文件中进     *"<<endl;cout<<"*    行读写,默认对手机卡联系人在mycardlistdata.txt文件中进     *"<<endl;cout<<"*    行读写。当然您也可以自定义文件地址                         *"<<endl;cout<<"*        本系统联系人的信息既可以存储在手机中,也可以存储在手   *"<<endl;cout<<"*    机卡中,也可以同时存储在两个位置上,每个位置上的存储容量   *"<<endl;cout<<"*    为1000。                                                   *"<<endl;cout<<"*        新建,删除,修改,查询都可以选择不同通讯录进行操作。   *"<<endl;cout<<"*    删除、修改输入电话号码操作、查询输入姓名操作。             *"<<endl;cout<<"*        转存联系人时,对姓名、电话都相同的联系人不进行转存,   *"<<endl;cout<<"*    但仅有一项不同时进行转存。                                 *"<<endl;cout<<"*        在输入姓名时,请不要在姓名内部加入空格,否则会造成     *"<<endl;cout<<"*    不可预料的结果。(其他信息的输入类似。)                   *"<<endl;cout<<"*        通讯录中允许相同的联系人存在,但在查询、修改、删除时   *"<<endl;cout<<"*    会对提供相同信息的联系人进行全部搜索。                     *"<<endl;cout<<"*        请你按菜单提示进行选择,否则会影响你的使用体验!但如   *"<<endl;cout<<"*    果你在程序中想结束当前操作时,可以选择屏幕没有提供的选项   *"<<endl;cout<<"*    ,这时操作会停止并返回。                                   *"<<endl;cout<<"*****************************************************************"<<endl;
}
/**第7个类  用户类**/
class user {mobile_list mymobile;          //用户的手机通讯录card_list mycard;              //用户的手机卡通讯录menu umenu;
public:user();void add();                    //利用基类指针,调用通讯簿对象的函数完成操作(下同),添加时确定是添加到手机上还是手机卡中void removebytel();              //输入电话号码,删除联系人,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作void removebyname();          //输入姓名,删除联系人,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作void change();                  //输入电话号码,查询到联系人之后进行信息的修改。如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作void query();                  //输入姓名,查询联系人,两个通讯录都进行查询void display();                //显示两个通讯簿中联系人的信息void copyctom();               //将手机卡中的存储的联系人的信息复制到手机中void copymtoc();               //将手机中存储的联系人的信息复制到手机卡中void movectom();               //将手机卡中的存储的联系人的信息移动到手机中void movemtoc();               //将手机中存储的联系人的信息移动到手机卡中  (之前的就没了)~user();
};user::user()
{cout<<"*=====================================================================*"<<endl;cout<<"*---------------------------------------------------------------------*"<<endl;cout<<"          你的手机通讯录中目前共有"<<mymobile.getnum()+1<<"个联系人. "<<endl;cout<<"*---------------------------------------------------------------------*"<<endl;cout<<"          你的手机卡通讯录中目前共有"<<mycard.getnum()+1<<"个联系人. "<<endl;cout<<"*=====================================================================*"<<endl;
}
void user::add()
{umenu.addmenu();                         //显示菜单address_list *temp;                      //创建基类指针char choose;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':temp=&mymobile;                      //基类指针指向派生类对象temp->add();                         //调用派生类函数break;case '2':temp=&mycard;temp->add();                         //基类指针指向派生类对象break;default:cout<<"选择错误!操作结束!"<<endl;return;}cout<<"*=============================================================================*"<<endl;
}
void user::removebytel()
{umenu.remove1menu();address_list *temp;char choose;string ptel;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人,无法进行删除!"<<endl; break;}cout<<"请输入要删除联系人的电话:"<<endl;cin>>ptel;temp=&mymobile;temp->removebytel(ptel);break;case '2':if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人,无法进行删除!"<<endl; break;}cout<<"请输入要删除联系人的电话:"<<endl;cin>>ptel;temp=&mycard;temp->removebytel(ptel);break;case '3':cout<<"请输入要删除联系人的电话:"<<endl;cin>>ptel;cout<<"<下面是在手机通讯录中进行的删除操作>"<<endl;temp=&mymobile;temp->removebytel(ptel);cout<<"<下面是在手机卡通讯录中进行的删除操作>"<<endl;temp=&mymobile;temp->removebytel(ptel);default:cout<<"选择错误!操作结束!"<<endl;}cout<<"*=============================================================================*"<<endl;
}
void user::removebyname()
{umenu.remove1menu();address_list *temp;char choose;string pname;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人,无法进行删除!"<<endl; break;}cout<<"请输入要删除联系人的姓名:"<<endl;cin>>pname;temp=&mymobile;temp->removebyname(pname);break;case '2':if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人,无法进行删除!"<<endl; break;}cout<<"请输入要删除联系人的姓名:"<<endl;cin>>pname;temp=&mycard;temp->removebyname(pname);break;case '3':cout<<"请输入要删除联系人的姓名:"<<endl;cin>>pname;cout<<"<下面是在手机通讯录中进行的删除操作>"<<endl;temp=&mymobile;temp->removebyname(pname);cout<<"<下面是在手机卡通讯录中进行的删除操作>"<<endl;temp=&mymobile;temp->removebyname(pname);default:cout<<"选择错误!操作结束!"<<endl;}cout<<"*=============================================================================*"<<endl;
}
void user::change()
{umenu.changemenu();address_list *temp;char choose; string ptel;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人,无法进行修改!"<<endl; break;}cout<<"请输入要修改联系人的电话:"<<endl;cin>>ptel;temp=&mymobile;temp->change(ptel);break;case '2':if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人,无法进行修改!"<<endl; break;}cout<<"请输入要修改联系人的电话:"<<endl;cin>>ptel;temp=&mycard;temp->change(ptel);break;default:cout<<"选择错误!操作结束!"<<endl;}cout<<"*=============================================================================*"<<endl;
}
void user::query()
{umenu.querymenu();address_list *temp;char choose; string pname;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人!"<<endl; break;}cout<<"请输入要查询联系人的姓名:"<<endl;cin>>pname;temp=&mymobile;temp->query(pname);break;case '2':if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人!"<<endl; break;}cout<<"请输入要查询联系人的姓名:"<<endl;cin>>pname;temp=&mycard;temp->query(pname);break;default:cout<<"选择错误!操作结束!"<<endl;}cout<<"*=============================================================================*"<<endl;
}
void user::display()
{umenu.displaymenu();address_list *temp;char choose;cin>>choose;cout<<"*=============================================================================*"<<endl;switch(choose){case '1':umenu.displaymenu2();temp=&mycard;temp->displayup();umenu.displaymenu3();temp=&mymobile;temp->displayup();break;case '2':umenu.displaymenu2();mycard.displaydown();           //displaydown函数不是继承来的umenu.displaymenu3();mymobile.displaydown();break;default :cout<<"选择错误!操作结束!"<<endl;break;}cout<<"*=============================================================================*"<<endl;
}
void user::copymtoc()
{cout<<"*=============================================================================*"<<endl;if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人!"<<endl; return;}for(int i=0;i<=mymobile.getnum();i++){if(mycard.getnum()>999) {cout<<"手机通讯录容量已满!无法增加新联系人!"<<endl; return ;}mycard.copyset(mymobile.getname(i),mymobile.gettel(i));}cout<<"操作成功!"<<endl;cout<<"*=============================================================================*"<<endl;
}
void user::copyctom()
{cout<<"*=============================================================================*"<<endl;if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人!"<<endl; return;}for(int i=0;i<=mycard.getnum();i++){if(mycard.getnum()>999) {cout<<"手机通讯录容量已满!无法增加新联系人!"<<endl; return ;}mymobile.copyset(mycard.getname(i),mycard.gettel(i));}cout<<"操作成功!"<<endl;cout<<"*=============================================================================*"<<endl;
}
void user::movemtoc()
{cout<<"*=============================================================================*"<<endl;if(mymobile.getnum()<0) {cout<<"手机通讯录当前没有联系人!"<<endl; return;}for(int i=0;i<=mymobile.getnum();i++){if(mymobile.getnum()>999) {cout<<"手机卡通讯录容量已满!无法增加新联系人!"<<endl; return ;}mycard.copyset(mymobile.getname(i),mymobile.gettel(i));}mymobile.clearmobile();cout<<"操作成功!"<<endl;cout<<"*=============================================================================*"<<endl;
}
void user::movectom()
{cout<<"*=============================================================================*"<<endl;if(mycard.getnum()<0) {cout<<"手机卡通讯录当前没有联系人!"<<endl; return;}for(int i=0;i<=mycard.getnum();i++){if(mymobile.getnum()>999) {cout<<"手机卡通讯录容量已满!无法增加新联系人!"<<endl; return ;}mymobile.copyset(mycard.getname(i),mycard.gettel(i));}mycard.clearcard();cout<<"操作成功!"<<endl;cout<<"*=============================================================================*"<<endl;
}
user::~user()
{cout<<"谢谢使用本系统!您的联系人已存入相关文件中!"<<endl;}
/*
const char *mymobilelistfile="D://my_phonelist.txt";            //系统默认在这个文件中读写手机
const char *mycardlistfile="D:\\my_cardlist.txt";            //系统默认在这个文件中读写*/
int main()
{menu mymenu;                            //菜单类user me;                                //实现user类对象,实现各种操作mymenu.description();system("color 3B");system("pause");system("cls");char choose='1';char c;while(choose!='0'){mymenu.mainmenu();system("color 4A");cin>>choose;switch(choose){case '0': break;system("color 3B");           //保存文件,退出case '1':me.add();                        //增加break;case '2':cout<<"请选择操作方式: 1.按电话删除,\n\t\t2.按姓名删除.\n请输入你的选择:"<<endl;cin>>c;switch(c){case '1':me.removebytel();             //用tel删除break;case '2':me.removebyname();            //用name删除break;default:cout<<"选择错误!"<<endl; system("color 3B");    //用户不想继续操作时,可以错误选择来退出。break;}break;case '3':me.change();                      //修改break;case '4':me.query();                       //查询break;case '5':me.display();                     //浏览break;case '6':cout<<"请选择操作方式: 1.复制,2.移动."<<endl;cin>>c;switch(c){case '1':me.copymtoc();                //将手机中存储的联系人的信息复制到手机卡中break;case '2':me.movemtoc();                //将手机中存储的联系人的信息移动到手机卡中break;default :cout<<"选择错误!"<<endl;system("color 3B");}break;case '7':cout<<"请选择操作方式: 1.复制,2.移动."<<endl;cin>>c;switch(c){case '1':me.copyctom();                 //将手机卡中的存储的联系人的信息复制到手机中break;case '2':me.movectom();                 //将手机卡中的存储的联系人的信息移动到手机中break;default :cout<<"选择错误!"<<endl;system("color 3B");}break;default :cout<<"选择错误!"<<endl;system("color 3B");}system("pause");system("cls");     //这几个函数非常有用对于清除某些屏幕}return 0;
}

课程设计报告 C++通讯录管理系统相关推荐

  1. c语言银行卡管理系统程序设计报告,《c语言程序设计》课程设计报告-职工信息管理系统.doc...

    <c语言程序设计>课程设计报告-职工信息管理系统.doc 还剩 24页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环 ...

  2. c语言声明第一个学生的成绩,C语言课程设计报告--学生成绩管理系统

    <C语言课程设计报告--学生成绩管理系统>由会员分享,可在线阅读,更多相关<C语言课程设计报告--学生成绩管理系统(30页珍藏版)>请在人人文库网上搜索. 1.学生成绩管理系统 ...

  3. 汽车站订票系统mysql实验_数据库课程设计报告-车站售票管理系统

    数据库课程设计报告-车站售票管理系统 吉林工程技术师范学院 课程设计报告 设计名称: 车站售票信息管理系统 姓 名: 孟祥丽 学 号: 23号 专 业: 计算机科学与技术 班 级: C1042 院 系 ...

  4. c语言 输入职工工资资料,通过结构体的数组来进行操作 报告,c语言课程设计报告-职工工资管理系统...

    <c语言课程设计报告-职工工资管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计报告-职工工资管理系统(33页珍藏版)>请在人人文库网上搜索. 1.c 语言课程设计报告 ...

  5. 计算机课程设计收费管理系统,数据结构课程设计报告---收费停车场管理系统

    数据结构课程设计报告---收费停车场管理系统 (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 XX大学计算机与电子 信息学院< ...

  6. 用C语言编程网上购物系统,华中科技大学C语言课程设计报告 -- 网上购物管理系统.pdf...

    华中科技大学自动化学院 C 语言课程设计报告 网上购物管理系统 专 业:自 动 化 班 级:自动化1306 班 组 员: 指导教师:周纯杰 何顶新 彭刚 周凯波 完成时间:2014 年11 月7 日星 ...

  7. 施工管理系统C语言,《C语言课程设计报告-建筑工地信息管理系统》.doc

    <C语言课程设计报告-建筑工地信息管理系统> C语言课程设计报告 班级:中国地质大学计算机学院192091班 姓名: 序号:192091-28(20091003872) 指导老师:时间:2 ...

  8. c语言商品订购系统总结报告,c语言课程设计报告-商业销售管理系统

    c语言课程设计报告-商业销售管理系统 (14页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 C语言课程设计商业销售管理系统学号姓名班级软 ...

  9. c语言程序设计课程设计学生信息管理系统,C语言程序设计课程设计报告----学生信息管理系统.doc...

    河南理工大学计算机学院 <C语言程序设计>课程设计报告 题目: 学生信息管理系统 专业: 计算机科学与技术 班级: 计算机XX班 学号: 311009033232 姓名: ***** 日期 ...

最新文章

  1. Python如何实现穷举搜索?
  2. 路要怎么走?关于程序员成长的一点思考
  3. VTK修炼之道36:图像平滑_均值滤波器
  4. 丑数 Ugly Number
  5. redux ngrx_另一个减少Redux(NGRX)应用程序样板的指南
  6. DetNAS:首个搜索物体检测Backbone的方法 | NeurIPS 2019
  7. 【每日一网】Day16:Inside-Outside Net(ION)讲解
  8. 最接近WeChat的全屏自定义相机(Custom Camera)
  9. 千万别惹程序员之经典的SQL注入式***
  10. 官方 Windows 10 正版系统 ISO 镜像文件
  11. python读取数据库数据类型_从SQL数据库读取二进制数据(图像数据类型)并将其膨胀,Matlab vs.Python...
  12. 软件园区网络设计之网络详细设计
  13. “两步路·户外助手”谷歌类图源
  14. oracle alter system kill,ALTER SYSTEM KILL SESSION详解
  15. Cadence画PCB的傻瓜式教程
  16. C#调用Windows图片和传真查看器打开图片
  17. 光影mod_我的世界:mc十大“最受欢迎”mod,知道半数以上,实为老玩家
  18. c语言两个矩形相交部分坐标,C++判断矩形相交的方法
  19. RT_thread空闲线程及两个常用的钩子函数
  20. 一插usb接口计算机就重启,电脑故障分析:主机一插USB设备就死机,故障原因令人很无语...

热门文章

  1. Spring Security实现RememberMe功能以及原理探究
  2. java异步回调讲解
  3. spring源码分析03-spring依赖注入源码解析
  4. 激流勇进誓破浪,同舟共济达使命
  5. websocket以及nodejs联手打造的类qq群聊天室 教程 附 原代码
  6. 股价跌到“1美元“退市线之下,昔日巨头四季教育成沧海一粟?
  7. 当你手机上有这些APP,那么你就可以把你的兴趣变成赚钱的工具
  8. unity 等待...动画_介绍Unity 2019.1的动画索具预览包
  9. echarts 水球示例
  10. 停车场管理问题——算法与数据结构