通讯录管理系统详解

#include<iostream>
#include<fstream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
bool vis;     //移动复制是否有重复数据的标志
///根据系统功能要求,首先要设计一个菜单类,描述系统所拥有的功能。
class menu
{
	public:
     void mainmenu();   ///主菜单,系统主要功能。
     void addmenu();    ///因为要求有有手机通讯录和手机卡通讯录,所以需要一个添加菜单
     void delmenu();    ///删除菜单
     void modmenu();    ///修改菜单
     void inqmenu();    ///查询菜单
     void dismenu();    ///显示菜单
     void mocomenu();    ///移动复制菜单
     void sortmenu();    ///排序菜单
     void filemenu();    ///文件操作菜单
}m;///创建全局菜单对象,便于调用
void menu::mainmenu()
{
    cout<<"                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cout<<"                          ~                   通讯录管理系统主菜单                        ~"<<endl;
    cout<<"                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cout<<"                          ~                                                               ~"<<endl;
    cout<<"                          ~  1.新建联系人.                           2.删除联系人.        ~"<<endl;
	cout<<"                          ~                                                               ~"<<endl;
    cout<<"                          ~  3.修改联系人的信息.                     4.查询联系人信息.    ~"<<endl;
    cout<<"                          ~                                                               ~"<<endl;
    cout<<"                          ~  5.浏览所有联系人的信息.                 6.移动、复制联系人 . ~"<<endl;
    cout<<"                          ~                                                               ~"<<endl;
    cout<<"                          ~  7.读、写文件                            8.保存工作到文件.    ~"<<endl;
	cout<<"                          ~                                                               ~"<<endl;
	cout<<"                          ~                         0.退出并保存                          ~"<<endl;
	cout<<"                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cout<<"                          请输入您的选择:"<<endl;
}
void menu::addmenu()
{
	cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  |         请选择添加联系人到一个通讯录:         |"<<endl;
	cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             1.手机通讯录.                      |"<<endl;
    cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             2.手机卡通讯录.                    |"<<endl;
    cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             3.两个通讯录都添加.                |"<<endl;
	cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             4.返回主菜单.                      |"<<endl;
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  请输入您的选择:"<<endl;
}
void menu::delmenu()
{
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  |         请选择删除哪一个通讯录的联系人:       |"<<endl;
	cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             1.手机通讯录.                      |"<<endl;
    cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             2.手机卡通讯录.                    |"<<endl;
    cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             3.两个通讯录都添加.                |"<<endl;
	cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             4.返回主菜单.                      |"<<endl;
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  请输入您的选择:"<<endl;
}
void menu::modmenu()
{
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  |         请选择修改哪一个通讯录的联系人:       |"<<endl;
	cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             1.手机通讯录.                      |"<<endl;
    cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             2.手机卡通讯录.                    |"<<endl;
    cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             3.两个通讯录都添加.                |"<<endl;
	cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             4.返回主菜单.                      |"<<endl;
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  请输入您的选择:"<<endl;
}
void menu::inqmenu()
{
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  |         请选择查询哪一个通讯录的联系人:       |"<<endl;
	cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             1.手机通讯录.                      |"<<endl;
    cout<<"                                  |                                                |"<<endl;
    cout<<"                                  |             2.手机卡通讯录.                    |"<<endl;
    cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             3.两个通讯录都添加.                |"<<endl;
	cout<<"                                  |                                                |"<<endl;
	cout<<"                                  |             4.返回主菜单.                      |"<<endl;
    cout<<"                                  --------------------------------------------------"<<endl;
    cout<<"                                  请输入您的选择:"<<endl;
}
void menu::dismenu()
{
    cout<<"                                  ********************************************"<<endl;
    cout<<"                                  *           请选择浏览的通讯录             *"<<endl;
	cout<<"                                  *                                          *"<<endl;
    cout<<"                                  *            1.手机通讯录.                 *"<<endl;
    cout<<"                                  *                                          *"<<endl;
    cout<<"                                  *            2.手机卡通讯录.               *"<<endl;
    cout<<"                                  *                                          *"<<endl;
    cout<<"                                  *            3.返回主菜单.                 *"<<endl;
    cout<<"                                  ********************************************"<<endl;
    cout<<"                                  请输入您的选择:"<<endl;
}
void menu::mocomenu()
{
    cout<<"                          ###############################################################"<<endl;
    cout<<"                          #                     请选择要进行的操作.                     #"<<endl;
    cout<<"                          #                                                             #"<<endl;
	cout<<"                          #        1.将联系人的信息从手机移动到手机卡上.                #"<<endl;
    cout<<"                          #                                                             #"<<endl;
    cout<<"                          #        2.将联系人的信息从手机卡上移动到手机上.              #"<<endl;
	cout<<"                          #                                                             #"<<endl;
    cout<<"                          #        3.将手机中的存储的联系人的信息复制到手机卡中         #"<<endl;
    cout<<"                          #                                                             #"<<endl;
    cout<<"                          #        4.将手机卡中存储的联系人的信息复制到手机中           #"<<endl;
    cout<<"                          #                                                             #"<<endl;
    cout<<"                          #                     5.返回主菜单.                           #"<<endl;
    cout<<"                          ###############################################################"<<endl;
    cout<<"                          请输入您的选择:"<<endl;
}
void menu::sortmenu()
{

	 cout<<"                                  **************************************"<<endl;
	 cout<<"                                  *         请选择输出排序方式         *"<<endl;
	 cout<<"                                  *                                    *"<<endl;
	 cout<<"                                  *            1.降序输出              *"<<endl;
	 cout<<"                                  *                                    *"<<endl;
	 cout<<"                                  *            2.升序输出              *"<<endl;
	 cout<<"                                  *                                    *"<<endl;
	 cout<<"                                  *            3.退出                  *"<<endl;
	 cout<<"                                  **************************************"<<endl;
	 cout<<"                                  请输入您的选择:"<<endl;
}
void menu::filemenu()
{
	cout<<"                                  ************************************************"<<endl;
    cout<<"                                  *           请选择要进行的操作.                *"<<endl;
    cout<<"                                  *                                              *"<<endl;
	cout<<"                                  *           1.读取手机通讯录文件.              *"<<endl;
    cout<<"                                  *                                              *"<<endl;
    cout<<"                                  *           2.写入手机通讯录文件               *"<<endl;
	cout<<"                                  *                                              *"<<endl;
    cout<<"                                  *           3.读取手机卡通讯录文件             *"<<endl;
    cout<<"                                  *                                              *"<<endl;
    cout<<"                                  *           4.写入手机卡通讯录文件             *"<<endl;
    cout<<"                                  *                                              *"<<endl;
    cout<<"                                  *           5.返回主菜单.                      *"<<endl;
    cout<<"                                  ************************************************"<<endl;
    cout<<                                  "请输入您的选择:"<<endl;
}

///根据题目要求设计手机联系人类。

class Phone_LXR
{
	protected:
	string name,tel;
public:
	Phone_LXR(string na="无姓名",string te="无电话号码")///带默认值的构造函数
	{
		name=na;tel=te;
	}
	//Phone_contact(){}
	void set(string na,string te);///数据成员赋值
	int modify();///修改成员函数
	friend ostream&operator<<(ostream&out,Phone_LXR&p); ///友元函数重载<<
	friend istream&operator>>(istream&in, Phone_LXR&p);  ///重载>>
	string getname();  ///获取姓名
	string gettel();   ///获2取电话号码

};
void Phone_LXR::set(string na,string te)
	{
		name=na;
		tel=te;
	}
istream&operator>>(istream&in,Phone_LXR&p)
	{
		cout<<"请输入联系人姓名:";in>>p.name;
		cout<<"请输入联系人电话号码:";in>>p.tel;
		return in;
	}
ostream&operator<<(ostream&out,Phone_LXR&p)
	{


		out<<"姓名:"<<p.name;
		out<<" 电话号码:"<<p.tel<<endl;
		return out;
	}
string Phone_LXR::getname()
{
	return name;
}
string Phone_LXR::gettel()
{
	return tel;
}
int Phone_LXR::modify()
{
	    cout<<"                                  *************************************"<<endl;
	    cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
        cout<<"                                  *                                   *"<<endl;
        cout<<"                                  * 3.全部修改        4.退出此次修改  *"<<endl;
	    cout<<"                                  *************************************"<<endl;
        cout<<"                                  请输入选择"<<endl;
        int xuan;
        string xinxi;
        while(cin>>xuan)
        {
			switch(xuan)
			{
			 case 1:
				 {

				  cout<<"请输入要修改的联系人姓名:"<<endl;
				  cin>>xinxi;
				  name=xinxi;
				  cout<<"更改成功"<<endl;break;
				 }


		     case 2:
		    	{
				  cout<<"请输入要修改的联系人电话号码:"<<endl;
				  cin>>xinxi;
				  tel=xinxi;
				  cout<<"更改成功"<<endl;break;
		    	}
			 case 3:
	            {
				  cout<<"请输入要修改的联系人姓名:"<<endl;
				  cin>>xinxi;
				  name=xinxi;
				  cout<<"请输入要修改的联系人电话号码:"<<endl;
				  cin>>xinxi;
				  tel=xinxi;
				  cout<<"更改成功"<<endl;break;
	            }
			 case 4:
			     {
			         cout<<"退出修改"<<endl;break;
                 }
			 default:
	           cout<<"输入错误,请重新输入."<<endl;
			 }
            cout<<"                                  修改成功,请按下面提示进行操作"<<endl;
            //cout<<"姓名:"<<name<<"  电话号码:"<<tel<<endl;
			cout<<"                                  *************************************"<<endl;
	        cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
	        cout<<"                                  *                                   *"<<endl;
	        cout<<"                                  * 3.全部修改        4.退出修改系统  *"<<endl;
			cout<<"                                  *************************************"<<endl;
			cout<<"                                  请输入您的选择:"<<endl;
			 if(xuan==4)
                break;
        }
			return 0;
}

///根据要求写手机卡联系人派生类

class SIM_LXR:public Phone_LXR  //手机卡联系人类
{
	string jiguang,qq;
public:
	SIM_LXR(string na="无姓名",string te="无电话号码",string jg="无籍贯",string q="无qq"):Phone_LXR(na,te) ///带参的构造函数
	{
		//Phone_LXR::set(na,te);
		jiguang=jg;
		qq=q;
	}
	void set(string na,string te,string jg,string q);///成员赋值函数
	int modify();///修改成员函数
	friend ostream&operator <<(ostream&out,SIM_LXR&s); ///友元函数重载<<
	friend istream&operator >>(istream&in, SIM_LXR&s);  ///重载>>
	string getjiguang()
	{
	    return jiguang;
    }
	string getqq()
	{
	    return qq;
	}
};
void  SIM_LXR::set(string na,string te,string jg,string q)
{
	Phone_LXR::set(na,te);
	jiguang=jg;
	qq=q;
}
int SIM_LXR::modify()
{
	  //cout<<endl;
	  cout<<"                                  *************************************"<<endl;
	  cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
	  cout<<"                                  *                                   *"<<endl;
	  cout<<"                                  * 3.修改籍贯        4.修改QQ号码    *"<<endl;
	  cout<<"                                  *                                   *"<<endl;
	  cout<<"                                  * 5.全部修改        6.退出修改系统  *"<<endl;
	  cout<<"                                  *************************************"<<endl;
	  //cout<<endl;
	   cout<<"                                 请输入选择"<<endl;
			int xuan;
			string xinxi;
			while(cin>>xuan)
			{
			switch(xuan)
			{
			 case 1:
				 {

				  cout<<"请输入要修改的联系人姓名:"<<endl;
				  cin>>xinxi;
				  name=xinxi;
				  cout<<"更改成功"<<endl;
				  break;
				 }
		     case 2:
		    	{
				  string xinxi;
				  cout<<"请输入要修改的联系人电话号码:"<<endl;
				  cin>>xinxi;
				  tel=xinxi;
				  cout<<"更改成功"<<endl;
				  break;
		    	}
		    	case 3:
		    	{
				  string xinxi;
				  cout<<"请输入要修改的联系人籍贯:"<<endl;
				  cin>>xinxi;
				  jiguang=xinxi;
				  cout<<"更改成功"<<endl;
				  break;
		    	}
		    	case 4:
		    	{
				  string xinxi;
				  cout<<"请输入要修改的联系人QQ号码:"<<endl;
				  cin>>xinxi;
				  qq=xinxi;
				  cout<<"更改成功"<<endl;
				  break;
		    	}
			 case 5:
	            {
		          string xinxi;
				  cout<<"请输入要修改的联系人姓名:"<<endl;
				  cin>>xinxi;
				  name=xinxi;
				  cout<<"请输入要修改的联系人电话号码:"<<endl;
				  cin>>xinxi;
				  tel=xinxi;
				  cout<<"请输入要修改的联系人籍贯:"<<endl;
				  cin>>xinxi;
				  jiguang=xinxi;
				  cout<<"请输入要修改的联系人QQ号码:"<<endl;
				  cin>>xinxi;
				  qq=xinxi;
				  cout<<"更改成功"<<endl;
				  break;
	            }
			 case 6:
			     {
			         cout<<"退出修改"<<endl;
			         break;
			     }
			 default:
	           cout<<"输入错误,请重新输入"<<endl;
			 }
			  cout<<"                                  修改成功,请按下面提示进行操作"<<endl;
			  //cout<<endl;
	         cout<<"                                  *************************************"<<endl;
	         cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
	         cout<<"                                  *                                   *"<<endl;
	         cout<<"                                  * 3.修改籍贯        4.修改QQ号码    *"<<endl;
             cout<<"                                  *                                   *"<<endl;
             cout<<"                                  * 5.全部修改        6.退出修改系统  *"<<endl;
	         cout<<"                                  *************************************"<<endl;
	         //cout<<endl;
	          cout<<"请输入您的选择"<<endl;
			 if(xuan==6) break;
			}
			return 0;
}
istream&operator>>(istream&in,SIM_LXR&s)
	{
		//string pname,ptel;
		cout<<"请输入姓名:";  in>>s.name;
		cout<<"请输入电话号码:";in>>s.tel;
		s.Phone_LXR::set(s.name,s.tel);
		cout<<"请输入籍贯:";    in>>s.jiguang;
		cout<<"请输入qq:";      in>>s.qq;
		return in;
	}
ostream&operator<<(ostream&out,SIM_LXR&s)
	{

		out.setf(ios::left);///控制长度
		out.width(25);
		out<<"姓名:"<<s.getname()<<endl;
		out.width(25);
		out<<"电话号码:"<<s.gettel()<<endl;
		out.width(25);
		out<<"籍贯:"<<s.jiguang<<endl;
		out.width(25);
		out<<"qq:"<<s.qq<<endl;
		return out;
	}

///根据要求写通讯簿抽象类

class Book
{
	public:
	virtual int add()=0;                 ///增加纯虚函数,增加一个联系人
	virtual int del(string Tel)=0;       ///删除纯虚函数:删除一个联系人
	virtual int display()=0;             ///显示纯虚函数,显示所有联系人的信息
	virtual int modify(string Tel)=0;    ///修改纯虚函数,修改某一联系人的信息:
    virtual int inquire(string Name)=0;  ///查询纯虚函数,查询并显示某一联系人的信息
    virtual int read()=0;                ///读文件
	virtual int write()=0;               ///写文件
	virtual int save()=0;               ///保存文件
    //virtual ~Book();
};

///根据要求写手机通讯簿类(数据库类,继承于通讯簿抽象类)用于记录手机中储存的所有联系人信息

class Phone_book:public Book
{
	int sum;                  ///表示手机联系人的数量,
	vector<Phone_LXR> p;  ///实现手机联系人动态数组,不怕数组越界
public:
	 Phone_book();///构造函数读取文本文件中的数据,并根据文件内容创建联系人对象数组。
	 ~Phone_book();///将对象数组中的内容写入到文本文件中
	 int add();                ///增加函数:增加一个联系人
	 int del(string Tel);      ///删除操作:删除一个联系人
	 int display();            ///显示所有联系人的信息
	 int modify(string Tel);   ///修改某一联系人的信息:
     int inquire(string Name); ///查询并显示某一联系人的信息
	 int moco(string sname,string stel);//移动复制操作
	 int getsum(){return sum;}//获取已有联系人数量(附加功能)
	 string getname(int i){return p[i].getname();}///获取手机第i个姓名p[i].name
	 string gettel(int i){return p[i].gettel();}///获取手机卡第i个电话号码s[i].tel
	 int read();               ///读取手机通讯录文件
	 int write();              ///读取手机通讯录文件
     int save();               ///保存工作
     int search(int low, int high, string x); ///二分查找
     int  clear()///清空
     {
         p.clear();
         sum=-1;
    }

};
Phone_book::Phone_book()///构造函数读取数据
{
	sum=-1;                                      ///vector从0开始算起
	char s[100];
	char  pname[30],ptel[30];
	Phone_LXR lxr;                            ///创建手机联系人临时对象,方便进行调用手机联系人函数进行输入。
	//ofstream out("d://Phone book.txt",ios::out);
	ifstream in("D://Phone book.txt",ios::in); ///读的方式打开文件,读取文本文件中的数据
	if(!in)
	{
		cout<<"无法打开手机通讯录文件"<<endl;
		return ;
	}
	 in.getline(s,100);///读取标题栏信息
	 in.getline(s,100);
	 in.getline(s,100);
	 in.getline(s,100);
	 while(in>>pname>>ptel&&pname!="无姓名")
	 {
	 	lxr.set(pname,ptel);
	 	p.push_back(lxr);
	 	sum++;
	 }
	 in.close();
}
Phone_book::~Phone_book()///析构函数写入数据
{
   ofstream out("D://Phone book.txt",ios::out); ///写的方式打开文件。写入数据
   if(!out)
	{
		cout<<"无法打开手机通讯录文件"<<endl;
		return ;
	}
	out<<"                                  ********************************************"<<endl;
	out<<"                                  *                 手机通讯簿               *"<<endl;
    out<<"                                  ********************************************"<<endl;
    out.setf(ios::left);///控制长度
	out.width(25);
    out<<"姓名";
    out.width(25);
    out<<"电话号码";
	for(int i=0;i<=sum;i++)     ///注意这里是小于等于
	{
        out.setf(ios::left);///控制长度
		out.width(25);
		out<<p[i].getname();
		out.width(25);
		out<<p[i].gettel();
		out<<endl;
	}
	out.close();
}
int Phone_book::add()
{

	if(sum>1000)///要求能存储1000人。
        {
            cout<<"对不起您的手机通讯容量已满,即将返回"<<endl;
            return 0;
        }
	Phone_LXR lxr;///创建临时手机联系人对象方便调用函数。
	cin>>lxr;
	cout<<lxr<<endl;
	cout<<"该联系人是否添加到手机,Y(是)/N(否)"<<endl;
	char s;
	cin>>s;
	if(s=='Y')
	{
	p.push_back(lxr);
	sum++;
	cout<<"成功添加联系人到手机通讯簿"<<endl;
	}
	else if(s=='N')
        cout<<"已经取消操作"<<endl;
	else
	    cout<<"您的输入有误,请重新输入"<<endl;
}
int Phone_book::del(string Tel)
{
	if(sum<0)
	{
            cout<<"对不起,您的手机通讯暂无联系人,无法删除,即将返回"<<endl;
	        return 0;
	}
	bool flag=0;
	while(1)
	{
	 for(int i=0;i<=sum;i++)        ///注意这里是小于等于,因为sum从-1开始
	  {
	  	if(p[i].gettel()==Tel)
	  	{
	  		 flag=1;
	  		cout<<"将要删除手机联系人的信息如下"<<endl;
	  		cout<<p[i].getname()<<": "<<p[i].gettel()<<endl;
	  		cout<<"是否删除该联系人信息,Y(是)/N(否)"<<endl;
	  		char s;
	  		cin>>s;
	  		if(s=='Y')
	  		{
	  			p.erase(p.begin()+i);///动态数组的指定删除操作
	  			sum--;
	  			cout<<"删除该联系人成功"<<endl;
	  			cout<<"是否在手机继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;
	  			cin>>s;
	  			if(s=='Y')
	  			{cout<<"继续搜索中"<<endl;}
	  			else if(s=='N')
	  			  break;
	  		}
	  		else
			{
               cout<<"是否在手机继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;
	  			cin>>s;
	  			if(s=='Y')
	  			{cout<<"继续搜索中"<<endl;}
	  			else if(s=='N')
	  			break;
			}
	  	}
	  	cout<<"搜索结束"<<endl;

	  }
	  if(flag==0)           ///容错性
	  {
		cout<<"在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)"<<endl;
		char s;
		cin>>s;
		if(s=='N')
		break;
		else if(s=='Y')
		{
		    cout<<"请重新输入要删除联系人的电话号码"<<endl;
		    cin>>Tel;
		    continue;
        }
		else
		{
		    cout<<"输入错误,本次删除取消"<<endl;
		    break;
        }
	  }
	  else break;
	 }
}
int Phone_book::modify(string Tel)
{
   if(sum<0)
	{
            cout<<"对不起,您的手机通讯暂无联系人,无法修改,即将返回"<<endl;
	        return 0;
	}
	bool flag=0;
	while(1)
	{
	 for(int i=0;i<=sum;i++)        ///注意这里是<=,sum从-1开始
	  {
	  	if(p[i].gettel()==Tel)
	  	{
	  		 flag=1;
	  		cout<<"将要修改手机通讯录联系人的信息如下"<<endl;
	        cout<<p[i]<<endl;///重载了运算符输出方便
	  		cout<<"是否修改该联系人信息,Y(是)/N(否)"<<endl;
	  		char s;
	  		cin>>s;
	  		if(s=='Y')
	  		{
			    p[i].modify();
				cout<<p[i]<<endl;
				cout<<"验证修改信息,是否重新修改。Y(是)/N(否)"<<endl;
				cin>>s;
				if(s=='Y')
                    {p[i].modify();}
	  			cout<<"是否继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;///按照顺序继续循环(就相当于查找后面同号码的联系人)
	  			cin>>s;
	  			if(s=='Y')
	  			   {cout<<"继续搜素中"<<endl;}
	  			else if(s=='N') break;
	  		}
	  		else
			{
               cout<<"是否继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;
	  			cin>>s;
	  			if(s=='Y')
                    {cout<<"继续搜素中"<<endl;}
	  			else if(s=='N') break;
			}
	  	}
	  	cout<<"搜索结束:对不起,未能查询到您要查找的联系人"<<endl;
	  }
	  if(flag==0)           ///容错性
	  {
		cout<<"在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)"<<endl;
		char s;
		cin>>s;
		if(s=='N')
		break;
		else if(s=='Y')
		{cout<<"请重新输入要修改联系人的电话号码"<<endl;
		cin>>Tel;continue;}
		else
		{cout<<"输入错误,本次修改取消"<<endl;break;}
	  }
	  else break;
	 }
}
bool cmp(Phone_LXR a,Phone_LXR b)   ///按姓名升序排列函数
{
	   return a.getname()< b.getname();
}
int Phone_book::inquire(string Name)
{
	if(sum<0)
	{
            cout<<"对不起,您的手机通讯暂无联系人,无法修改,即将返回"<<endl;
	        return 0;
	}
    sort(p.begin(),p.end(),cmp);///通过自定义比较函数,实现按姓名升序排列
	while(1)
	{
     cout<<"手机通讯录查询到的联系人信息"<<endl;
      int i=search(0,sum,Name); ///二分查找,找到中间点,提高效率
	  if(i==-1)           ///容错性
	  {
		cout<<"在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)"<<endl;
		char s;
		cin>>s;
		if(s=='N')
		break;
		else if(s=='Y')
		{cout<<"请重新输入要查询联系人的姓名"<<endl;cin>>Name;continue;}
		else
		{cout<<"输入错误,本次查询取消"<<endl;break;}
	  }
	  else
	  {
	     int j=i-1;
	      for(;i<sum;i++)
	       {
            if(p[i].getname()==Name)
            cout<<p[i]<<endl;
	       }
         for(;j>=0;j--)
	       {
	           if(p[j].getname()==Name)
	           cout<<p[j]<<endl;
	       }
		  cout<<"本次查询完成"<<endl;break;
	  }
	 }
}
int Phone_book::display()
{
	if(sum<0)
	{
            cout<<"对不起,您的手机通讯暂无联系人,无法修改,即将返回"<<endl;
	        return 0;
	}
	 cout<<"目前手机通讯录人数:"<<sum+1<<endl;
	 m.sortmenu();
	 char ch;
	 cin>>ch;
	 sort(p.begin(),p.end(),cmp);///按姓名升序排列 ,一次就够,省时间
	 cout<<"                                  **************************************"<<endl;
	 cout<<"                                  *            手机通讯录              *"<<endl;
	 cout<<"                                  **************************************"<<endl;
	 switch(ch)
	 {
    case '1':///降序
		{
			 for(int i=sum;i>=0;i--)
		 	cout<<p[i]<<endl;
		 	break;
		}
	case '2':///升序
	   {
		 for(int i=0;i<=sum;i++)
		 	cout<<p[i]<<endl;
		 	break;
	   }

	case '3':break;
	default:
	cout<<"操作错误,退出显示菜单"<<endl;
	 }

}
int Phone_book::moco(string Name,string Tel)
{

	for(int i=0;i<=sum;i++)
	{
		if(Name==p[i].getname()&&Tel==p[i].gettel())
		{
			return 0;
		}
	}

	Phone_LXR lxr;
	lxr.set(Name,Tel);
	p.push_back(lxr);    ///添加
	sum++;
	return 0;

}
int Phone_book::search(int low, int high, string x)///二分搜索常规代码
{
  if(x==" ")
  return -1;
  while(low<=high)
  {
    int mid=low+(high-low)/2;
    while(p[mid].getname()==" "&&mid<=high)
    mid++;
    if(mid>high)
     {
    high=mid-1;
     }
    else
     {
       if(p[mid].getname()==x)
        return mid;
       else if(p[mid].getname()>x)
        high=mid-1;
       else
        low=mid+1;
     }
    }
   return -1;
}
int Phone_book::read()
{

	char s[100];
	char  pname[100],ptel[100];
	ifstream in("D://Phone book.txt"); ///读的方式打开文件,读取文本文件中的数据
	if(!in)
	{
		cout<<"无法打开手机通讯录文件"<<endl;
		return 0;
	}
	 in.getline(s,100);///读取标题栏信息的操作
	 in.getline(s,100);
	 in.getline(s,100);
	 in.getline(s,100);
	 while(in>>pname>>ptel&&pname!="无姓名")
	 {
	  cout<<"姓名: "<<pname<<"\t"<<"电话号码: "<<ptel<<endl;
	 }
	 in.close();///很重要,记得关闭
}
int Phone_book::write()
{
   Phone_LXR lxr;
   ofstream out("D://Phone book.txt"); ///写的方式打开文件,写入数据。
   if(!out)
	{
		cout<<"无法打开手机通讯录文件"<<endl;
		return 0;
	}
	 cin>>lxr;
     out.setf(ios::left);
		out.width(25);
		out<<lxr.getname();
		out.width(25);
		out<<lxr.gettel();
		out<<endl;
     p.push_back(lxr);
     sum++;
	 out.close();
}
int Phone_book::save()///保存操作。
{
   ofstream out("D://Phone book.txt"); ///写的方式打开文件
   if(!out)
	{
		cout<<"无法打开手机通讯录文件"<<endl;
		return  0;
	}
	out<<"                                  ********************************************"<<endl;
	out<<"                                  *                手机通讯簿                *"<<endl;
    out<<"                                  ********************************************"<<endl;
    out<<"姓名"<<"\t"<<"电话号码"<<endl;
	for(int i=0;i<=sum;i++)     ///注意这里是小于等于
	{
     out<<"姓名: "<<p[i].getname()<<"\t"<<"电话号码: "<<p[i].gettel()<<endl;///写入联系人信息
	}
	out.close();///记得关闭
}

///根据要求写手机卡通讯簿派生类(数据库类,继承于通讯簿抽象类)用于记录手机卡中储存的所有联系人信息

class SIM_book:public Book      ///其实跟手机通讯簿的写法差不多,实现基本相同
{
	int sum;                   ///手机卡联系人的数量
	vector<SIM_LXR>s;         ///实现手机卡联系人动态数组,不用担心数组越界
public:
	 SIM_book();///构造函数读取文本文件中的数据,并根据文件内容创建联系人对象数组。
	 ~SIM_book();///析构函数将对象数组中的内容写入到文本文件中。
	 int add();                 ///增加函数,增加一个联系人
	 int del(string Tel);       ///删除函数,删除一个联系人
	 int display();             ///显示所有联系人的信息
	 int modify(string Tel);    ///修改某一联系人的信息:
     int inquire(string Name);  ///查询并显示某一联系人的信息
     int moco(string pname,string ptel);             ///复制移动函数
     int getsum();               ///获取已有联系人数量
     string getname(int i){return s[i].getname();}       ///获取手机卡第i个姓名
     string gettel(int i){return s[i].gettel();}       ///获取手机卡第i个电话号码
     string getjiguang(int i){return s[i].getjiguang();}     ///获取手机卡第i个籍贯
     string getqq(int i){return s[i].getqq();}        ///获取手机卡第i个
     int read();                 ///读取手机卡通讯录文件
     int write();                ///写入手机卡通讯录文件
     int save();                 ///保存文件
     int search(int low, int high, string x);  ///二分搜索
     int  clear();          ///清空工作

};
SIM_book::SIM_book()
{
	sum=-1;
	char a[100];
	char  sname[100],stel[100],sjg[100],sqq[100];
	SIM_LXR lxr;                   ///创建手机联系人临时对象,方便调用。
	 //ofstream out("d://SIM book.txt",ios::out);
	 ifstream in("D://SIM book.txt",ios::in); //读的方式打开文件,读取文本文件中的数据
	 if(!in)
	{
		cout<<"无法打开手机卡通讯录文件"<<endl;
		return ;
	}
	 in.getline(a,100);///读取信息
	 in.getline(a,100);
	 in.getline(a,100);
	 in.getline(a,100);
	 while(in>>sname>>stel>>sjg>>sqq&&sname!="无姓名")
	 {
	 	lxr.set(sname,stel,sjg,sqq);
	 	s.push_back(lxr);
	 	sum++;
	 }
	 in.close();///记得关闭文件
}
SIM_book::~SIM_book()
{
	SIM_LXR lxr;
    ofstream out("D://SIM book.txt",ios::out); ///写的方式打开文件
    if(!out)
	{
		cerr<<"无法打开手机卡通讯录文件"<<endl;
		return ;
	}
	out<<"                                  ********************************************"<<endl;
	out<<"                                  *                手机卡通讯簿              *"<<endl;
    out<<"                                  ********************************************"<<endl;
    out.setf(ios::left);///控制长度
	out.width(25);
    out<<"姓名";
    out.width(25);
    out<<"电话号码";
    out.width(25);
    out<<"籍贯";
    out.width(25);
    out<<"qq"<<endl;
	for(int i=0;i<=sum;i++)
	{

		out.setf(ios::left);
		out.width(25);
		out<<s[i].getname();
		out.width(25);
		out<<s[i].gettel();
		out.width(25);
		out<<s[i].getjiguang();
		out.width(25);
		out<<s[i].getqq()<<endl;
	}
	out.close();
}
int SIM_book::read()
{
	char a[100];
	char  sname[100],stel[100],sjg[100],sqq[100];
	 ifstream in("D://SIM book.txt",ios::in); ///读的方式打开文件,读取文本文件中的数据
	 if(!in)
	{
		cerr<<"无法打开手机卡通讯录文件"<<endl;
		return 0;
	}
	 in.getline(a,100);///读取标题栏信息
	 in.getline(a,100);
	 in.getline(a,100);
	 in.getline(a,100);
	 cout.setf(ios::left);
     cout.width(25);
	 cout<<"姓名";
	 cout.width(25);
	 cout<<"电话号码";
	 cout.width(25);
	 cout<<"籍贯";
	 cout.width(25);
	 cout<<"QQ"<<endl;
	 while(in>>sname>>stel>>sjg>>sqq&&sname!="无姓名")
	 {
	 cout.setf(ios::left);
	 cout.width(25);
	 cout<<sname;
	 cout.width(25);
	 cout<<stel;
	 cout.width(25);
	 cout<<sjg;
	 cout.width(25);
	 cout<<sqq<<endl;;
	 }
	 in.close();///关闭文件
}
int SIM_book::write()///写法都差不多
{
   SIM_LXR lxr;
   ofstream out("D://SIM book.txt",ios::out); ///写的方式打开文件
   if(!out)
	{
		cout<<"无法打开手机卡通讯录文件"<<endl;
		return 0;
	}
	 cin>>lxr;
     out.setf(ios::left);
	 out.width(25);
	 out<<lxr.getname();
	 out.width(25);
	 out<<lxr.gettel();
	 out.width(25);
	 out<<lxr.getjiguang();
	 out.width(25);
	 out<<lxr.getqq()<<endl;
     s.push_back(lxr);
     sum++;
	 out.close();///关闭文件
}
int SIM_book::add()
{
	if(sum>1000)///要求能存储1000人。
        {
            cout<<"对不起您的手机通讯容量已满,即将返回"<<endl;
            return 0;
        }
	SIM_LXR lxr;
	cin>>lxr;
	cout<<lxr;
	cout<<"是否将该联系人添加到手机卡,Y(是)/N(否)"<<endl;
	char a;
	cin>>a;
	if(a=='Y')
	{
	s.push_back(lxr);
	sum++;
	cout<<"手机卡添加联系人成功"<<endl;
	}
	else if(a=='N')
        cout<<"取消操作"<<endl;
	else
	    cout<<"输入错误,请重新输入"<<endl;
}
int SIM_book::del(string Tel)
{
	if(sum<0) {cout<<"手机通讯容量已空,无法删除,即将返回"<<endl;return 0;}
	bool flag=0;
	while(1)
	{

	 for(int i=0;i<=sum;i++)
	  {
	  	if(s[i].gettel()==Tel)
	  	{    flag=1;
	  		cout<<"将要删除手机联系人的信息"<<endl;
	  		cout<<s[i];
	  		cout<<"是否在手机卡上删除该联系人信息,Y/N"<<endl;
	  		string ss;
	  		cin>>ss;
	  		if(ss[0]=='Y')
	  		{
	  			s.erase(s.begin()+i);
	  			sum--;
	  			cout<<"在手机卡上删除该联系人成功"<<endl;
	  			cout<<"是否在手机卡继续寻找具有相同电话号码的联系人,Y/N"<<endl;
	  			cin>>ss;
	  			if(ss[0]=='N') break;
				if(ss[0]=='Y'){cout<<"继续搜素......"<<endl;}
	  		}
	  		else
			{
				cout<<"是否在手机卡继续寻找具有相同电话号码的联系人,Y/N"<<endl;
	  			cin>>ss;
	  			if(ss[0]=='Y'){cout<<"继续搜素......"<<endl;}
	  			else if(ss[0]=='N') break;
			}
	  	}
	  		cout<<"搜素结束"<<endl;
	    }
	    if(flag==0)
	    {
		cout<<"在手机卡通讯录无法找到具有该电话号码的联系人,是否重新输入?Y/N"<<endl;
		string ss;
		cin>>ss;
		if(ss[0]=='N')
		break;
		else if(ss[0]=='Y')
		{cout<<"请重新输入要删除联系人的电话号码"<<endl;cin>>Tel;continue;}
		else
		{cout<<"输入错误,本次删除取消"<<endl;break;}
	  }
	  else break;

	}
}
int SIM_book::modify(string Tel)
{
  if(sum<0) {cout<<"手机卡通讯容量已空,无法修改,即将返回"<<endl;return 0;}
	bool flag=0;
	while(1)
	{

	 for(int i=0;i<=sum;i++)        //注意这里是<=,sum从-1开始
	  {
	  	if(s[i].gettel()==Tel)
	  	{
	  		 flag=1;
	  		cout<<"将要修改手机通讯录联系人的信息"<<endl;
	        cout<<s[i]<<endl;
	  		cout<<"是否在手机卡通讯录上修改该联系人信息,Y/N"<<endl;
	  		cout<<"?";
	  		string ss;
	  		cin>>ss;
	  		if(ss[0]=='Y')
	  		{
			    s[i].modify();
				cout<<s[i]<<endl;
				cout<<"验证修改信息,是否重新修改。Y/N"<<endl;
				cout<<"?";
				string sss;
				cin>>sss;
				if(sss[0]=='Y') {s[i].modify();}
	  			cout<<"是否在手机卡继续寻找具有相同电话号码的联系人,Y/N"<<endl;
	  			cout<<"?";
	  			cin>>ss;
	  			if(ss[0]=='Y'){cout<<"继续搜素......"<<endl;}
	  			else if(ss[0]=='N') break;
	  		}
	  		else
			{
               cout<<"是否在手机卡继续寻找具有相同电话号码的联系人,Y/N"<<endl;
               cout<<"?";
	  			cin>>ss;
	  			if(ss[0]=='Y'){cout<<"继续搜素......"<<endl;}
	  			else if(ss[0]=='N') {break;}
			}
	  	}


	  }
	  if(flag==0)           //容错性
	  {
		cout<<"在手机卡通讯录无法找到具有该电话号码的联系人,是否重新输入?Y/N"<<endl;
		cout<<"?";
		string ss;
		cin>>ss;
		if(ss[0]=='N')
		break;
		else if(ss[0]=='Y')
		{cout<<"请重新输入要删除联系人的电话号码"<<endl;cin>>Tel;continue;}
		else
		{cout<<"输入错误,本次删除取消"<<endl;break;}
	  }
	  else break;
	 }
}
int SIM_book::inquire(string Name)
{
	 if(sum<0) {cout<<"手机卡通讯录容量已空,无法查询,即将返回"<<endl;return 0;}
	 int l=0,r=sum;
	while(1)
	{
     sort(s.begin(),s.end(),cmp);//按姓名升序排列
     cout<<"手机卡通讯录查询到的联系人信息"<<endl;
	  int i=search(l,r,Name);
	  if(i==-1)           //容错性
	  {
	  	cout<<"搜索结束:无"<<endl;
		cout<<"在手机卡通讯录无法找到具有该电话号码的联系人,是否重新输入?Y/N"<<endl;
		cout<<"?";
		string ss;
		cin>>ss;
		if(ss[0]=='N')
		break;
		else if(ss[0]=='Y')
		{cout<<"请重新输入要查询联系人的电话号码"<<endl;cin>>Name;continue;}
		else
		{cout<<"输入错误,本次查询取消"<<endl;break;}
	  }
	  else
	  {
	      int j=i-1;
	      for(;i<sum;i++)
	       {
            if(s[i].getname()==Name)
            cout<<s[i]<<endl<<endl;
	       }
         for(;j>=0;j--)
	       {
	           if(s[j].getname()==Name)
	           cout<<s[j]<<endl<<endl;
	       }
		  cout<<"本次查询完成"<<endl;break;
      }
	 }
}
bool cmp2( SIM_LXR &a, SIM_LXR &b)   //按姓名降序排列 函数   ?引用为什么不对
{
	   return a.getname()<b.getname();
}
int SIM_book::display()
{
	if(sum<0) {cout<<"手机卡通讯容量已空,即将返回"<<endl;return 0;}

	 cout<<"目前手机卡通讯录人数:"<<sum+1<<endl;
	 m.sortmenu();
	 char ch;
	 cin>>ch;
	 sort(s.begin(),s.end(),cmp);//按姓名升序排列 ,一次就够,省时间
	 cout<<"                                  **************************************"<<endl;
	 cout<<"                                  *           手机通卡讯录             *"<<endl;
	 cout<<"                                  **************************************"<<endl;
	 switch(ch)
	 {
	case '2':
	   {
		 for(int i=0;i<=sum;i++)
		 	cout<<s[i]<<endl;;
		 	break;
	   }
	case '1':
		{
			 for(int i=sum;i>=0;i--)
		 	cout<<s[i]<<endl;;
		 	break;
		}
	case '3':break;
	default:
	cout<<"操作错误,退出显示菜单"<<endl;
	 }
}
int SIM_book::getsum()
{return sum;}
int SIM_book::moco(string pname,string ptel)
{
	for(int i=0;i<=sum;i++)
	{
		if(pname==s[i].getname()&&ptel==s[i].gettel())
		{
			return 0;
		}
	}
	vis=1;         //标记删除成功
	SIM_LXR t;
	t.set(pname,ptel,"无籍贯","无QQ");
	s.push_back(t);    //添加
	sum++;
	return 0;
}
int SIM_book::save()
{

    ofstream out("d://SIM book.txt",ios::out); //写的方式打开文件
   if(!out)
	{
		cerr<<"无法打开手机卡通讯录文件"<<endl;
		return 1;
	}
	out<<"                                  ********************************************"<<endl;
	out<<"                                  *                手机卡通讯簿              *"<<endl;
    out<<"                                  ********************************************"<<endl;
     out.setf(ios::left);
	out.width(20);
    out<<"姓名";
    out.width(20);
    out<<"电话号码";
     out.width(20);
    out<<"籍贯";
    out<<"qq"<<endl;
	for(int i=0;i<=sum;i++)
	{

		out.setf(ios::left);
		out.width(20);
		out<<s[i].getname();
		out.width(20);
		out<<s[i].gettel();
		out.width(20);
		out<<s[i].getjiguang();
		out<<s[i].getqq()<<endl;
	}
	out.close();
}
int SIM_book::search(int low, int high, string x)
{
  if(x==" ")
  return -1;
  while(low<=high)
  {
    int mid=low+(high-low)/2;
    int t=mid;
    while(s[t].getname()==" "&&t<=high)
    t++;
    if(t>high)
     {
    high=mid-1;
     }
    else
     {
       if(s[t].getname()==x)
        return t;
       else if(s[t].getname()>x)
        high=mid-1;
       else
        low=t+1;
     }
   }
   return -1;
}
int  SIM_book::clear()
{
    s.clear();
    sum=-1;
}

///根据要求写用户类(操作类,完成通讯簿的操作)能对两个通讯录进行管理操作。

class user
 {
 	Phone_book p;///手机通讯录类数据成员
 	SIM_book s;///手机卡通讯录类数据成员
public:
	 user() ;
	 int add();       ///添加联系人(基类指针调用两通讯录对象实现多态,下面操作同理)
	 int del();       ///删除联系人
 	 int modify();    ///修改联系人
 	 int inquire();   ///查询联系人
 	 int display();   ///显示联系人
 	 int moco();      ///移动复制
     int movs_p();    ///把联系人信息从手机卡移动到手机
     int movp_s();    ///把联系人信息从手机移动到手机卡
 	 int copys_p();   ///把联系人信息从手机卡复制到手机
 	 int copyp_s();   ///把联系人信息从手机移动到手机卡

	 int file();      ///文件操作
	 int save();      ///保存工作
 	 ~user();
 };
 user::user()
 {
    cout<<"                                         @*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@"<<endl;
    cout<<"                                         *                                 *"<<endl;
 	cout<<"                                         @     欢迎使用通讯录管理系统      @"<<endl;
 	cout<<"                                         *                                 *"<<endl;
    cout<<"                                         @*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@"<<endl;
 	cout<<endl;
 }
user::~user()
 {
    cout<<"                                         @*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@"<<endl;
    cout<<"                                         *                                 *"<<endl;
 	cout<<"                                         @     已退出系统,谢谢您的使用    @"<<endl;
 	cout<<"                                         *                                 *"<<endl;
    cout<<"                                         @*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@"<<endl;
 	cout<<endl;;
 }
int user::add()
{
	char ch;
	Book *q;   //创建基类指针
	while(cin>>ch)
	{
	 switch(ch)
	 {
	 case '1':
	  q=&p;       //基类指针指向派生类对象 ,实现多态
	  q->add();
	  break;
	 case '2':
	   q=&s;
	   q->add();
	   break;
	 case '3':
	 	q=&p;
	   q->add();
	   q=&s;
	   q->add();

	   break;
	 case '4':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }
	 if(ch=='4') break;
	  m.addmenu();
	}
	return 0;

}
int user::del()
{
	char ch;
	Book *q;   //创建基类指针

	while(cin>>ch)
	{

	 switch(ch)
	 {
	 case '1':
	  {
	  q=&p;     //基类指针指向派生类对象 ,实现多态
	  string ss;
	  cout<<"请输入在手机通讯录要删除联系人的电话号码:"<<endl;
	  cin>>ss;
	  q->del(ss);
	  break;
	  }
	 case '2':
	   {
	   	q=&s;
	   string ss;
	   cout<<"请输入在手机卡通讯录要删除联系人的电话号码:"<<endl;
	   cin>>ss;
	   q->del(ss);
	   break;
	   }
	 case '3':
	   {
	   	q=&p;
	   string ss;
	   cout<<"请输入在手机和手机卡通讯录要删除联系人的电话号码:"<<endl;
	   cin>>ss;    //基类指针指向派生类对象 ,实现多态
	   q->del(ss);
	   q=&s;
	   q->del(ss);
	   break;
	   }
	 case '4':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }

	 if(ch=='4') break;
	 m.delmenu();
	}
	return 0;
}
int user::modify()
{
	char ch;
	Book *q;   //创建基类指针

	while(cin>>ch)
	{
	 switch(ch)
	 {
	 case '1':
	  {
	  q=&p;     //基类指针指向派生类对象 ,实现多态
	  string ss;
	  cout<<"请输入在手机通讯录要修改联系人的电话号码:"<<endl;
	  cin>>ss;
	  q->modify(ss);
	  break;
	  }
	 case '2':
	   {
	   	q=&s;
	   string ss;
	   cout<<"请输入在手机卡通讯录要修改联系人的电话号码:"<<endl;
	   cin>>ss;
	   q->modify(ss);
	   break;
	   }
	 case '3':
	   {
	   	q=&p;
	   string ss;
	   cout<<"请输入在手机和手机卡通讯录要修改联系人的电话号码:"<<endl;
	   cin>>ss;    //基类指针指向派生类对象 ,实现多态
	   q->modify(ss);
	   q=&s;
	   q->modify(ss);
	   break;
	   }
	 case '4':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }

	 if(ch=='4') break;
	 m.modmenu();
	}
	return 0;
}
int user::inquire()
{
	 char ch;
	 Book *q;   //创建基类指针

	 while(cin>>ch)
	 {
	 switch(ch)
	 {
	 case '1':
	  {
	  q=&p;     //基类指针指向派生类对象 ,实现多态
	  string ss;
	  cout<<"请输入在手机通讯录要查询联系人的姓名:"<<endl;
	  cin>>ss;
	  q->inquire(ss);
	  break;
	  }
	 case '2':
	   {
	   	q=&s;
	   string ss;
	   cout<<"请输入在手机卡通讯录要查询联系人的姓名:"<<endl;
	   cin>>ss;
	   q->inquire(ss);
	   break;
	   }
	 case '3':
	   {
	   	q=&p;
	   string ss;
	   cout<<"请输入在手机和手机卡通讯录要查询联系人的姓名:"<<endl;
	   cin>>ss;    //基类指针指向派生类对象 ,实现多态
	   q->inquire(ss);
	   q=&s;
	   q->inquire(ss);
	   break;
	   }
	 case '4':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }
	 if(ch=='4') break;
	 m.inqmenu();

	 }
	return 0;
}
int user::display()
{
	 char ch;
	 Book *q;   //创建基类指针

	 while(cin>>ch)
	 {
	 switch(ch)
	 {
	 case '1':
	  {
	  q=&p;     //基类指针指向派生类对象 ,实现多态
	  q->display();
	  break;
	  }
	 case '2':
	   {
	   	q=&s;
	   q->display();
	   break;

	   }
	 case '3':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }

	 if(ch=='3') break;
	 m.dismenu();
	 }
	return 0;
}
int user::moco()
{
	 char ch;
	 while(cin>>ch)
	 {
	 switch(ch)
	 {
	 case '1':
	  {
	  movp_s();
	  break;
	  }
	 case '2':
	   {
	   movs_p();
	   break;
	   }
	 case'3':
	 	{
	   copyp_s();
	   break;
	 	}
	 case'4':
	 	{
	  copys_p();
	   break;
	 	}
	 case '5':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }

	 if(ch=='5') break;
	 m.mocomenu();
	}
	return 0;

}
int user::movp_s()
{
	cout<<"******手机联系人信息移动到手机卡中******"<<endl;

	if(p.getsum()<0){cout<<"手机通讯录无联系人,无法移动,即将返回"<<endl;return 0;}
	int sum=p.getsum();         //手机通讯录的联系人是变化的
	for(int i=0;i<=sum;i++)
	{
		if(s.getsum()>999) {cout<<"手机卡通讯录已满,无法移动,即将返回"<<endl;return 0;}
		s.moco(p.getname(i),p.gettel(i));     //函数调用Phone_book中数组,这里p和Phone_book 中存放联系人vector的p是不一样的

	}
	p.clear();
	sum=-1;
	cout<<"操作完成"<<endl<<endl;
	return 0;
}
int user::movs_p()
{
	cout<<"******手机卡联系人信息移动到手机中******"<<endl;
	if(s.getsum()<0){cout<<"手机卡通讯录无联系人,无法移动,即将返回"<<endl;return 0;}
	int sum=s.getsum();         //手机卡通讯录的联系人是变化的
	for(int i=0;i<=sum;i++)
	{

	    vis=0;         //标记是否成功移动
		if(p.getsum()>999) {cout<<"手机通讯录已满,无法移动,即将返回"<<endl;return 0;}
		p.moco(s.getname(i),s.gettel(i));     //函数调用SIM_book中数组,这里s和PSIM_book 中存放联系人vector的s是不一样的
	}
	s.clear();     //清除全部

	cout<<"操作完成"<<endl<<endl;
	return 0;
}
int user::copyp_s()
{
	cout<<"******手机联系人信息复制到手机卡中******"<<endl;
	if(p.getsum()<0){cout<<"手机通讯录无联系人,无法复制,即将返回"<<endl;return 0;}
	for(int i=0;i<=p.getsum();i++)
	{
		if(s.getsum()>999) {cout<<"手机卡通讯录已满,无法复制,即将返回"<<endl;return 0;}
		s.moco(p.getname(i),p.gettel(i));     //函数调用Phone_book中数组,这里p和Phone_book 中存放联系人vector的p是不一样的
	}
	cout<<"操作完成"<<endl<<endl;
	return 0;
}
int user::copys_p()
{
	cout<<"******手机卡联系人信息复制到手机中******"<<endl;
	if(s.getsum()<0){cout<<"手机卡通讯录无联系人,无法复制,即将返回"<<endl;return 0;}
	for(int i=0;i<=s.getsum();i++)
	{
		if(p.getsum()>999) {cout<<"手机通讯录已满,无法复制,即将返回"<<endl;return 0;}
		p.moco(s.getname(i),s.gettel(i));     //函数调用SIM_book中数组,这里s和PSIM_book 中存放联系人vector的s是不一样的

	}
	cout<<"操作完成"<<endl<<endl;
	return 0;

}
int user::file()
{
	char ch;
	Book *q;   //创建基类指针
	while(cin>>ch)
	{
	 switch(ch)
	 {
	 case '1':
	  q=&p;       //基类指针指向派生类对象 ,实现多态
	  q->read();
	  break;
	 case '2':
	   q=&p;
	   q->write();
	   break;
	 case '3':
	   q=&s;      //基类指针指向派生类对象 ,实现多态
	   q->read();
	   break;
	 case '4':
	   q=&s;
	   q->write();
	   break;
	 case '5':
		break;
	 default:
	   cout<<"操作错误,请重新输入"<<endl;
	 }
	 if(ch=='5') break;
	  m.filemenu();
	}
	return 0;
}
int user::save()
{
      Book *q;   //创建基类指针
	  q=&p;       //基类指针指向派生类对象 ,实现多态
	  q->save();
	  q=&s;      //基类指针指向派生类对象 ,实现多态
      q->save();
	  return 0;
}

///主函数进行操作

int main()
{
	user u;
	m.mainmenu();
	char ch;
	while(cin>>ch)
	{
		switch(ch)
		{

			case '1':m.addmenu();
			         u.add();
				     break;
			case '2':m.delmenu();
				     u.del();
					 break;
			case '3':m.modmenu();
			         u.modify();
			         break;
			case '4':m.inqmenu();
				     u.inquire();
			         break;
			case '5':m.dismenu();
			         u.display();
					break;
	        case '6':m.mocomenu();
	                 u.moco();
		    		 break;
			case '7':m.filemenu();
					 u.file();
					 break;
			case '8':u.save();
                     break;
            case '0':break;
			default:
	        cout<<"选择错误,请重新输入"<<endl;
		}
		if(ch=='0') break;
		m.mainmenu();
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值