通讯录管理系统

  

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

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

要求:

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

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

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

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

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

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

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

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

e)     浏览:显示所有联系人的信息

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

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

5.     要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点

6.     提交程序源码和课程设计报告。

课程设计评分说明:实现功能:通过;使用了继承技术:中;实现了运算符的重载:良;支持多态:优

心得体会:

无从下手到看老师实验提示的慢慢串联,一个个功能写,一个个功能测试,一遍遍修改,一次次添加新功能,一次次美化,最后形成了1600多行代码,俩天半的全部心血。下面是老师的实验分析,后面有我的实验经验。

实现过程分析:

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

建立以下几个类:

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

          数据成员包括:

姓名

电话号码

成员函数包括

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

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

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

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

 

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

新增数据成员:

籍贯

QQ号
成员函数包括

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

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

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

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

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

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

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

                         修改某一联系人的信息:

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

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

                 数据成员包括:

                         手机联系人的数量

                         手机联系人对象数组

                 成员函数包括

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

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

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

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

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

                         修改某一联系人的信息:

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

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

                 数据成员包括:

                         手机联系人的数量

                         手机联系人对象数组

                 成员函数包括

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

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

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

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

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

                         修改某一联系人的信息:

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

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

                 数据成员包括:

                         两个通讯簿对象

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

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

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

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

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

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

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

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

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

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

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

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

                 成员函数:

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

 

 实验经验:

1.vector好用,优点如下:

a)      不定长,想压多少就压多少,当然肯定有最大值,但一般程序够用。

b)     可以删除任意标号数组元素,普通数组还需要一个个删除,一个个往前压。

c)      Vector可以查找数组元素(本代码未用)

d)      mulimap应该更好用,能二分查找 ,大大提高效率,打算暑假进行优化。

2.本人建议代码顺序

a)      可以把每一个类按照老师的实验分析大体写下了,可以只写一个架构,比如说增加删除函数你不清楚怎么写,可以先写一个空函数。

b)     菜单类只是一个界面,可以说是当中思维力最低的一个,但极其麻烦。但是可以帮助理清思路,本人建议可以先写这个,而且方便调用。

c)      然后在操作类中一个个功能写,假如现在在写增加这一个功能,用户类函数补充代码,调用数据类手机通讯录或手机卡通讯录里面的增加函数,补充增加函数的代码,然后运行找错,测试数据。、

d)     其实主要分两个类别,写好一个类别,其实就可以复制到第二个类别中,比如手机通讯录的增加联系人函数,确保无误后,就可以复制到手机卡通讯录中,在进行相应的更改。

3.如何动态的存在文本文件

可能大部分人文件只能在退出系统后保存,因为写文件的程序只写在了析构函数当中,所以只能在退出后保存。建议在写一个成员函数,用于写文件,即实现了可以随时保存文件。

4.要想改动数据成员的值,最好调用函数,本身类中进行修改,不然就得调用友元类,但这样就破坏了封装性。

5.实现核心,用户类中通过通讯录函数进行操作,具体数据操作在数据类中实现。

实现细节:

1.vector是从0下标开始的。

2.抽象类的纯虚函数必须在派生类全部实现,派生类才能定义对象。

3.在函数实现写文件,要用追加的形式。

4.姓名,电话号码等一些数据成员最好定义成string类型

5.老师给的实验分析是代码的大体架构,一定要好好看。

通讯录管理系统 C++实验报告_文本文件

 代码实现:

#include<iostream>
#include<fstream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
bool vis; //移动复制是否有重复数据的标志

界面菜单类

/*****************************界面菜单类*****************************************/

class menu
{
public:
void mainmenu(); //主菜单
void intmenu(); //介绍菜单
void addmenu(); //添加菜单
void delmenu(); //删除菜单
void modmenu(); //修改菜单
void inqmenu(); //查询菜单
void dismenu(); //显示菜单
void mocomenu(); //移动复制菜单
void sortmenu(); //排序菜单
void filemenu(); //文件操作菜单
};
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;
}

menu m; //创建全局菜单对象,便于调用

手机联系人类

/***************************手机联系人类*****************************************/
class Phone_contact
{
protected:
string name,tel;
public:
Phone_contact(string i="无姓名",string j="无电话号码")//构造函数
{
name=i;tel=j;
}
//Phone_contact(){}

int set(string i,string j);//成员赋值函数
int modify();//修改成员函数
friend ostream&operator <<(ostream&out,Phone_contact&p); //重载<<
friend istream&operator >>(istream&in, Phone_contact&p); //重载>>
string getname(); //获得姓名
string gettel(); //获得电话号码

};
int Phone_contact::set(string i,string j)
{
name=i;tel=j;
return 0;
}
istream&operator >>(istream&in,Phone_contact&p)
{
cout<<"请输入姓名:";in>>p.name;
cout<<"请输入电话号码:";in>>p.tel;
return in;
}
ostream&operator <<(ostream&out,Phone_contact&p)
{


out<<"姓名:"<<p.name;
out<<" 电话号码:"<<p.tel<<endl;
return out;
}
string Phone_contact::getname()
{
return name;
}
string Phone_contact::gettel()
{
return tel;
}
int Phone_contact::modify()
{
cout<<endl;
cout<<"*************************************"<<endl;
cout<<"* 1.修改姓名 2.修改电话号码 *"<<endl;
cout<<"* *"<<endl;
cout<<"* 3.全部修改 4.退出此次修改 *"<<endl;
cout<<"*************************************"<<endl;
cout<<endl;
cout<<"请输入选择"<<endl;
char choice;
while(cin>>choice)
{
switch(choice)
{
case '1':
{
string ss;
cout<<"请输入在手机通讯录该联系人要修改的姓名:"<<endl;
cin>>ss;
name=ss;
cout<<"更改成功"<<endl;
break;
}


case '2':
{
string ss;
cout<<"请输入在手机通讯录该联系人要修改的电话号码:"<<endl;
cin>>ss;
tel=ss;
cout<<"更改成功"<<endl;
break;
}
case '3':
{
string ss;
cout<<"请输入在手机通讯录该联系人要修改的姓名:"<<endl;
cin>>ss;
name=ss;
cout<<"请输入在手机通讯录该联系人要修改的电话号码:"<<endl;
cin>>ss;
tel=ss;
cout<<"更改成功"<<endl;
break;
}
case '4':{cout<<"退出修改"<<endl;break;}
default:
cout<<"输入错误,请重新输入"<<endl;
}
cout<<"修改后信息"<<endl;
cout<<"姓名:"<<name<<" 电话号码:"<<tel<<endl<<endl;
cout<<endl;
cout<<"*************************************"<<endl;
cout<<"* 1.修改姓名 2.修改电话号码 *"<<endl;
cout<<"* *"<<endl;
cout<<"* 3.全部修改 4.退出修改系统 *"<<endl;
cout<<"*************************************"<<endl;
cout<<endl;
cout<<"请输入选择"<<endl;
if(choice=='4') break;
}
return 0;
}



手机卡联系人类

/***************************手机卡联系人类*****************************************/
class SIM_contact:public Phone_contact  //手机卡联系人类
{
string origo,qq;
public:
SIM_contact(string i="无姓名",string j="无电话号码",string a="无籍贯",string b="无qq"):Phone_contact(i,j) //构造函数
{
Phone_contact::set(i,j);origo=a;qq=b;
}
int set(string i,string j,string a,string b);//成员赋值函数
int modify();//修改成员函数
friend ostream&operator <<(ostream&out,SIM_contact&s); //重载<<
friend istream&operator >>(istream&in, SIM_contact&s); //重载>>
string getorigo();
string getqq();
};
int SIM_contact::set(string i,string j,string a,string b)
{
Phone_contact::set(i,j);origo=a;qq=b;
return 0;
}
int SIM_contact::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;
char choice;
while(cin>>choice)
{
switch(choice)
{
case '1':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的姓名:"<<endl;
cin>>ss;
name=ss;
cout<<"更改成功"<<endl;
break;
}


case '2':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的电话号码:"<<endl;
cin>>ss;
tel=ss;
cout<<"更改成功"<<endl;
break;
}
case '3':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的籍贯:"<<endl;
cin>>ss;
origo=ss;
cout<<"更改成功"<<endl;
break;
}
case '4':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的QQ号码:"<<endl;
cin>>ss;
qq=ss;
cout<<"更改成功"<<endl;
break;
}
case '5':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的姓名:"<<endl;
cin>>ss;
name=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的电话号码:"<<endl;
cin>>ss;
tel=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的籍贯:"<<endl;
cin>>ss;
origo=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的QQ号码:"<<endl;
cin>>ss;
qq=ss;
cout<<"更改成功"<<endl;
break;
}
case '6':{cout<<"退出修改"<<endl;break;}
default:
cout<<"输入错误,请重新输入"<<endl;
}
cout<<"修改后信息"<<endl;
cout<<"姓名:";
cout.width(25);
cout.setf(ios::left);
cout<<name<<" 电话号码:"<<tel<<endl;
cout<<"籍贯:" ;
cout.width(25);
cout<<name<<" QQ号码:"<<tel<<endl<<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(choice=='6') break;
}
return 0;
}
istream&operator >>(istream&in,SIM_contact&s)
{
string pname,ptel;
cout<<"请输入姓名:"; in>>pname;
cout<<"请输入电话号码:";in>>ptel;
s.Phone_contact::set(pname,ptel);
cout<<"请输入籍贯:"; in>>s.origo;
cout<<"请输入qq:"; in>>s.qq;
return in;
}
ostream&operator <<(ostream&out,SIM_contact&s)
{
out<<"*姓名:";
out.width(25);
out.setf(ios::left);
out<<s.getname()<<" *电话号码:"<<s.gettel()<<endl;
out<<"*籍贯:";
out.width(25);
out<<s.origo<<" *qq:"<<s.qq<<endl;
return out;
}
string SIM_contact::getorigo()
{
return origo;
}
string SIM_contact::getqq()
{
return qq;
}



通讯簿抽象类

/***************************通讯簿抽象类*****************************************/

class Book
{
public:
virtual int add()=0; //增加函数:增加一个联系人
virtual int del(string Tel)=0; //删除操作:删除一个联系人
virtual int display()=0; //Display:显示所有联系人的信息
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();
};

手机通讯簿类

/***************************手机通讯簿类*****************************************/
bool cmp1(  Phone_contact a,  Phone_contact b)   //按姓名升序排列函数
{
return a.getname()< b.getname();
}
class Phone_book:public Book
{
int sum; //手机联系人的数量,
vector<Phone_contact> p; //vector实现手机联系人动态数组
public:
Phone_book();
~Phone_book();
int add(); //增加函数:增加一个联系人
int del(string Tel); //删除操作:删除一个联系人
int display(); //Display:显示所有联系人的信息
int modify(string Tel); //修改某一联系人的信息:
int inquire(string Name); //查询并显示某一联系人的信息
int getsum(); //获取已有联系人数量
int moco(string sname,string stel); //移动复制操作
string getname(int i); //获取手机第i个姓名p[i].name
string gettel(int i); //获取手机卡第i个电话号码s[i].tel
int read(); //读取手机通讯录文件
int write(); //读取手机通讯录文件
int save(); //保存工作
int search(int low, int high, string x); //二分查找
int clear() ; //清空

};
Phone_book::Phone_book()
{
sum=-1; //vector从0开始
char s[100];
char pname[30],ptel[30];
Phone_contact t; //创建手机联系人临时对象
//ofstream out("d://Phone book.txt",ios::out);
ifstream in("d://Phone book.txt",ios::in); //读的方式打开文件,读取文本文件中的数据
if(!in)
{
cerr<<"无法打开手机通讯录文件"<<endl;
return ;
}
in.getline(s,100);
in.getline(s,100);
in.getline(s,100);
in.getline(s,100); //省略标题行

while(in>>pname>>ptel&&pname!="无姓名")
{
t.set(pname,ptel);
p.push_back(t);
sum++;
}
in.close();
}
Phone_book::~Phone_book()
{
ofstream out("d://Phone book.txt",ios::out); //写的方式打开文件
if(!out)
{
cerr<<"无法打开手机通讯录文件"<<endl;
return ;
}
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();
}
int Phone_book::read()
{

char s[100];
char pname[30],ptel[30];
ifstream in("d://Phone book.txt",ios::in); //读的方式打开文件,读取文本文件中的数据
if(!in)
{
cerr<<"无法打开手机通讯录文件"<<endl;
return 0;
}
in.getline(s,100);
in.getline(s,100);
in.getline(s,100);
in.getline(s,100); //省略标题行
cout.width(20);
cout.setf(ios::left);
cout<<"姓名";
cout<<"电话号码"<<endl;
while(in>>pname>>ptel&&pname!="无姓名")
{
cout.width(20);
cout<<pname<<ptel<<endl;
}
}
int Phone_book::write()
{
Phone_contact t;
ofstream out("d://Phone book.txt",ios::app); //写的方式打开文件
if(!out)
{
cerr<<"无法打开手机通讯录文件"<<endl;
return 1;
}
cin>>t;
out<<t.getname()<<"\t"<<t.gettel()<<endl;
p.push_back(t);
sum++;
out.close();
}
int Phone_book::save()
{
ofstream out("d://Phone book.txt",ios::out); //写的方式打开文件
if(!out)
{
cerr<<"无法打开手机通讯录文件"<<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();
}
int Phone_book::add()
{

if(sum>999){cout<<"手机通讯容量已满,无法添加,即将返回"<<endl;return 0;}
Phone_contact t;
cin>>t;
cout<<t<<endl;
cout<<"该联系人是否添加到手机,Y/N"<<endl;
string s;
cin>>s;
if(s[0]=='Y')
{
p.push_back(t);
sum++;
cout<<"手机添加联系人成功"<<endl;
}
else if(s[0]=='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];
cout<<"是否在手机上删除该联系人信息,Y/N"<<endl;
string s;
cin>>s;
if(s[0]=='Y')
{
p.erase(p.begin()+i);
sum--;
cout<<"在手机上删除该联系人成功"<<endl;
cout<<"是否在手机继续寻找具有相同电话号码的联系人,Y/N"<<endl;
cin>>s;
if(s[0]=='Y'){cout<<"继续搜索......"<<endl;}
else if(s[0]=='N') break;
}
else
{
cout<<"是否在手机继续寻找具有相同电话号码的联系人,Y/N"<<endl;
cin>>s;
if(s[0]=='Y'){cout<<"继续搜索......"<<endl;}
else if(s[0]=='N') {break;}
}
}

cout<<"搜索结束"<<endl;

}
if(flag==0) //容错性
{
cout<<"在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y/N"<<endl;
string s;
cin>>s;
if(s[0]=='N')
break;
else if(s[0]=='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;
cout<<"?";
string ss;
cin>>ss;
if(ss[0]=='Y')
{
p[i].modify();
cout<<p[i]<<endl;
cout<<"验证修改信息,是否重新修改。Y/N"<<endl;
cout<<"?";
string sss;
cin>>sss;
if(sss[0]=='Y') {p[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;}
}
}

cout<<"搜索结束:无"<<endl;

}
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 Phone_book::inquire(string Name)
{
if(sum<0) {cout<<"手机通讯容量已空,无法查询,即将返回"<<endl;return 0;}
sort(p.begin(),p.end(),cmp1);//按姓名升序排列
while(1)
{
cout<<"手机通讯录查询到的联系人信息"<<endl;
int i=search(0,sum,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(p[i].getname()==Name)
cout<<p[i]<<endl<<endl;
}
for(;j>=0;j--)
{
if(p[j].getname()==Name)
cout<<p[j]<<endl<<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(),cmp1);//按姓名升序排列 ,一次就够,省时间
cout<<"**************************************"<<endl;
cout<<"* 手机通讯录 *"<<endl;
cout<<"**************************************"<<endl;
switch(ch)
{
case '2':
{
for(int i=0;i<=sum;i++)
cout<<p[i]<<endl;
break;
}
case '1':
{
for(int i=sum;i>=0;i--)
cout<<p[i]<<endl;
break;
}
case '3':break;
default:
cout<<"操作错误,退出显示菜单"<<endl;
}

}
int Phone_book::getsum()
{
return sum;
}
string Phone_book::getname(int i)
{
return p[i].getname();
}
string Phone_book::gettel(int i)
{
return p[i].gettel();
}

int Phone_book::moco(string sname,string stel)
{

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

Phone_contact t;
t.set(sname,stel);
p.push_back(t); //添加
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;
int t=mid;
while(p[t].getname()==" "&&t<=high)
t++;
if(t>high)
{
high=mid-1;
}
else
{
if(p[t].getname()==x)
return t;
else if(p[t].getname()>x)
high=mid-1;
else
low=t+1;
}
}
return -1;
}
int Phone_book::clear()
{
p.clear();
sum=-1;
}



手机卡通讯簿类

/***************************手机卡通讯簿类*****************************************/
class SIM_book:public Book      //手机卡通讯簿录基于手机通讯簿录 ,实现基本相同
{
int sum; //手机联系人的数量
vector<SIM_contact>s; //vector实现手机卡联系人动态数组
public:
SIM_book();
~SIM_book();
int add(); //增加函数:增加一个联系人
int del(string Tel); //删除操作:删除一个联系人
int display(); //Display:显示所有联系人的信息
int modify(string Tel); //修改某一联系人的信息:
int inquire(string Name); //查询并显示某一联系人的信息
int moco(string pname,string ptel); //复制移动函数
int getsum(); //获取已有联系人数量
string getname(int i); //获取手机卡第i个姓名s[i].name
string gettel(int i); //获取手机卡第i个电话号码s[i].tel
string getorigo(int i); //获取手机卡第i个籍贯s[i].origo
string getqq(int i); //获取手机卡第i个QQs[i].qq
int read(); //读取手机卡通讯录文件
int write(); //写入手机卡通讯录文件
int save(); //保存文件
int search(int low, int high, string x); //二分搜索
int clear(); //清空工作

};
SIM_book::SIM_book()
{
sum=-1;
char ss[100];
char sname[30],stel[30],sorigo[30],sqq[30];
SIM_contact t; //创建手机联系人临时对象
//ofstream out("d://SIM book.txt",ios::out);
ifstream in("d://SIM book.txt",ios::in); //读的方式打开文件,读取文本文件中的数据
if(!in)
{
cerr<<"无法打开手机卡通讯录文件"<<endl;
return ;
}
in.getline(ss,100);
in.getline(ss,100);
in.getline(ss,100);
in.getline(ss,100); //省略标题行
while(in>>sname>>stel>>sorigo>>sqq&&sname!="无姓名")
{
t.set(sname,stel,sorigo,sqq);
s.push_back(t);
sum++;
}
in.close();
}
SIM_book::~SIM_book()
{
SIM_contact t;
if(sum>999) {cout<<"手机卡通讯录文件已满"<<endl;cout<<endl;}
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(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].getorigo();
out<<s[i].getqq()<<endl;
}
out.close();

}
int SIM_book::read()
{
char ss[100];
char sname[30],stel[30],sorigo[30],sqq[30];
ifstream in("d://SIM book.txt",ios::in); //读的方式打开文件,读取文本文件中的数据
if(!in)
{
cerr<<"无法打开手机卡通讯录文件"<<endl;
return 0;
}
in.getline(ss,100);
in.getline(ss,100);
in.getline(ss,100);
in.getline(ss,100); //省略标题行
cout.width(20);
cout.setf(ios::left);
cout<<"姓名";
cout.width(20);
cout<<"电话号码";
cout.width(20);
cout<<"籍贯";
cout.width(20);
cout<<"QQ"<<endl;
while(in>>sname>>stel>>sorigo>>sqq&&sname!="无姓名")
{
cout.setf(ios::left);
cout.width(20);
cout<<sname;
cout.width(20);
cout<<stel;
cout.width(20);
cout<<sorigo;
cout.width(20);
cout<<sqq<<endl;;
}
in.close();
}
int SIM_book::write()
{
SIM_contact t;
ofstream out("d://SIM book.txt",ios::app); //写的方式打开文件
if(!out)
{
cerr<<"无法打开手机卡通讯录文件"<<endl;
return 1;
}

cin>>t;
out.setf(ios::left);
out.width(20);
out<<t.getname();
out.width(20);
out<<t.gettel();
out.width(20);
out<<t.getorigo();
out.width(20);
out<<t.getqq()<<endl;
s.push_back(t);
sum++;
out.close();
}
int SIM_book::add()
{
if(sum>999){cout<<"手机卡通讯容量已满,无法添加,即将返回"<<endl;return 0;}
SIM_contact t;
cin>>t;
cout<<t;
cout<<"该联系人是否添加到手机卡,Y/N"<<endl;
string ss;
cin>>ss;
if(ss[0]=='Y')
{
s.push_back(t);
sum++;
cout<<"手机卡添加联系人成功"<<endl;
}
else if(ss[0]=='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(),cmp1);//按姓名升序排列
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_contact &a, SIM_contact &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(),cmp1);//按姓名升序排列 ,一次就够,省时间
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_contact t;
t.set(pname,ptel,"无籍贯","无QQ");
s.push_back(t); //添加
sum++;
return 0;
}
string SIM_book::getname(int i)
{
return s[i].getname();
}
string SIM_book::gettel(int i)
{
return s[i].gettel();
}
string SIM_book::getorigo(int i)
{
return s[i].getorigo();
}
string SIM_book::getqq(int i)
{
return s[i].getqq();
}
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].getorigo();
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 movp_s(); //把联系人信息从手机移动到手机卡
int movs_p(); //把联系人信息从手机卡移动到手机
int copyp_s(); //把联系人信息从手机移动到手机卡
int copys_p(); //把联系人信息从手机卡复制到手机
int file(); //文件操作
int save(); //保存工作
~user();
};
user::user()
{
cout<<" **********************************"<<endl;
cout<<" ** ^ ^欢迎来到通讯录管理系统^ ^ **"<<endl;
cout<<" **********************************"<<endl;
cout<<endl;
}
user::~user()
{
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++)
{ vis=0; //标记是否成功移动
if(s.getsum()>999) {cout<<"手机卡通讯录已满,无法移动,即将返回"<<endl;return 0;}
s.moco(p.getname(i),p.gettel(i)); //函数调用Phone_book中数组,这里p和Phone_book 中存放联系人vector的p是不一样的
if(vis==1) p.del(i); //成功移动,删除

}
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是不一样的
if(vis==1) s.del(i); //成功移动,删除
}
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;
}