课程设计报告 C++通讯录管理系统


目录

. 设计要求 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);     //创建pnameptel联系人压入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);//创建pnameptel联系人压入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的联系人的name
	string gettel(int i);           //返回下标为i的联系人的tel
	void copyset(string pname,string ptel);//创建pname,ptel联系人压入vector
	void 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/74518905
	for(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的联系人的name
	string gettel(int i);                       //返回下标为i的联系人的tel
	void copyset(string pname,string ptel);     //创建pname,ptel联系人压入vector
	void 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;
}


猜你喜欢

转载自blog.csdn.net/qq_40268306/article/details/80859331