因为复制会有格式错误,所以word文本版请下载
百度云链接:https://pan.baidu.com/s/1v4h158ybyIHCOIe5_k8vOA 密码:crve
源代码:
#include
#include
#include
#include
#include
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<<"*****************************************************************"<>(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<<"姓名:"<>choice)
{
switch(choice)
{
case '1':
{
string ss;
cout<<"请输入在手机通讯录该联系人要修改的姓名:"<>ss;
name=ss;
cout<<"更改成功"<>ss;
tel=ss;
cout<<"更改成功"<>ss;
name=ss;
cout<<"请输入在手机通讯录该联系人要修改的电话号码:"<>ss;
tel=ss;
cout<<"更改成功"<>(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<>choice)
{
switch(choice)
{
case '1':
{
string ss;
cout<<"请输入在手机卡通讯录该联系人要修改的姓名:"<>ss;
name=ss;
cout<<"更改成功"<>ss;
tel=ss;
cout<<"更改成功"<>ss;
origo=ss;
cout<<"更改成功"<>ss;
qq=ss;
cout<<"更改成功"<>ss;
name=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的电话号码:"<>ss;
tel=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的籍贯:"<>ss;
origo=ss;
cout<<"请输入在手机卡通讯录该联系人要修改的QQ号码:"<>ss;
qq=ss;
cout<<"更改成功"<>(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< 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<<"无法打开手机通讯录文件"<>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<<"无法打开手机通讯录文件"<>pname>>ptel&&pname!="无姓名")
{
cout.width(20);
cout<>t;
out<999){cout<<"手机通讯容量已满,无法添加,即将返回"<>t;
cout<>s;
if(s[0]=='Y')
{
p.push_back(t);
sum++;
cout<<"手机添加联系人成功"<>s;
if(s[0]=='Y')
{
p.erase(p.begin()+i);
sum--;
cout<<"在手机上删除该联系人成功"<>s;
if(s[0]=='Y'){cout<<"继续搜索......"<>s;
if(s[0]=='Y'){cout<<"继续搜索......"<>s;
if(s[0]=='N')
break;
else if(s[0]=='Y')
{cout<<"请重新输入要删除联系人的电话号码"<>Tel;continue;}
else
{cout<<"输入错误,本次删除取消"<>ss;
if(ss[0]=='Y')
{
p[i].modify();
cout<>sss;
if(sss[0]=='Y') {p[i].modify();}
cout<<"是否在手机继续寻找具有相同电话号码的联系人,Y/N"<>ss;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='N')
break;
else if(ss[0]=='Y')
{cout<<"请重新输入要删除联系人的电话号码"<>Tel;continue;}
else
{cout<<"输入错误,本次删除取消"<>ss;
if(ss[0]=='N')
break;
else if(ss[0]=='Y')
{cout<<"请重新输入要查询联系人的电话号码"<>Name;continue;}
else
{cout<<"输入错误,本次查询取消"<=0;j--)
{
if(p[j].getname()==Name)
cout<>ch;
sort(p.begin(),p.end(),cmp1);//按姓名升序排列 ,一次就够,省时间
cout<<"**************************************"<=0;i--)
cout<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; //手机联系人的数量
vectors; //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<<"无法打开手机卡通讯录文件"<>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<<"手机卡通讯录文件已满"<>sname>>stel>>sorigo>>sqq&&sname!="无姓名")
{
cout.setf(ios::left);
cout.width(20);
cout<>t;
out.setf(ios::left);
out.width(20);
out<999){cout<<"手机卡通讯容量已满,无法添加,即将返回"<>t;
cout<>ss;
if(ss[0]=='Y')
{
s.push_back(t);
sum++;
cout<<"手机卡添加联系人成功"<>ss;
if(ss[0]=='Y')
{
s.erase(s.begin()+i);
sum--;
cout<<"在手机卡上删除该联系人成功"<>ss;
if(ss[0]=='N') break;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='N')
break;
else if(ss[0]=='Y')
{cout<<"请重新输入要删除联系人的电话号码"<>Tel;continue;}
else
{cout<<"输入错误,本次删除取消"<>ss;
if(ss[0]=='Y')
{
s[i].modify();
cout<>sss;
if(sss[0]=='Y') {s[i].modify();}
cout<<"是否在手机卡继续寻找具有相同电话号码的联系人,Y/N"<>ss;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='Y'){cout<<"继续搜素......"<>ss;
if(ss[0]=='N')
break;
else if(ss[0]=='Y')
{cout<<"请重新输入要删除联系人的电话号码"<>Tel;continue;}
else
{cout<<"输入错误,本次删除取消"<>ss;
if(ss[0]=='N')
break;
else if(ss[0]=='Y')
{cout<<"请重新输入要查询联系人的电话号码"<>Name;continue;}
else
{cout<<"输入错误,本次查询取消"<=0;j--)
{
if(s[j].getname()==Name)
cout<>ch;
sort(s.begin(),s.end(),cmp1);//按姓名升序排列 ,一次就够,省时间
cout<<"**************************************"<=0;i--)
cout<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<<" **********************************"<>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<<"操作错误,请重新输入"<>ch)
{
switch(ch)
{
case '1':
{
q=&p; //基类指针指向派生类对象 ,实现多态
string ss;
cout<<"请输入在手机通讯录要删除联系人的电话号码:"<>ss;
q->del(ss);
break;
}
case '2':
{
q=&s;
string ss;
cout<<"请输入在手机卡通讯录要删除联系人的电话号码:"<>ss;
q->del(ss);
break;
}
case '3':
{
q=&p;
string ss;
cout<<"请输入在手机和手机卡通讯录要删除联系人的电话号码:"<>ss; //基类指针指向派生类对象 ,实现多态
q->del(ss);
q=&s;
q->del(ss);
break;
}
case '4':
break;
default:
cout<<"操作错误,请重新输入"<>ch)
{
switch(ch)
{
case '1':
{
q=&p; //基类指针指向派生类对象 ,实现多态
string ss;
cout<<"请输入在手机通讯录要修改联系人的电话号码:"<>ss;
q->modify(ss);
break;
}
case '2':
{
q=&s;
string ss;
cout<<"请输入在手机卡通讯录要修改联系人的电话号码:"<>ss;
q->modify(ss);
break;
}
case '3':
{
q=&p;
string ss;
cout<<"请输入在手机和手机卡通讯录要修改联系人的电话号码:"<>ss; //基类指针指向派生类对象 ,实现多态
q->modify(ss);
q=&s;
q->modify(ss);
break;
}
case '4':
break;
default:
cout<<"操作错误,请重新输入"<>ch)
{
switch(ch)
{
case '1':
{
q=&p; //基类指针指向派生类对象 ,实现多态
string ss;
cout<<"请输入在手机通讯录要查询联系人的姓名:"<>ss;
q->inquire(ss);
break;
}
case '2':
{
q=&s;
string ss;
cout<<"请输入在手机卡通讯录要查询联系人的姓名:"<>ss;
q->inquire(ss);
break;
}
case '3':
{
q=&p;
string ss;
cout<<"请输入在手机和手机卡通讯录要查询联系人的姓名:"<>ss; //基类指针指向派生类对象 ,实现多态
q->inquire(ss);
q=&s;
q->inquire(ss);
break;
}
case '4':
break;
default:
cout<<"操作错误,请重新输入"<>ch)
{
switch(ch)
{
case '1':
{
q=&p; //基类指针指向派生类对象 ,实现多态
q->display();
break;
}
case '2':
{
q=&s;
q->display();
break;
}
case '3':
break;
default:
cout<<"操作错误,请重新输入"<>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<<"操作错误,请重新输入"<999) {cout<<"手机卡通讯录已满,无法移动,即将返回"<999) {cout<<"手机通讯录已满,无法移动,即将返回"<999) {cout<<"手机卡通讯录已满,无法复制,即将返回"<999) {cout<<"手机通讯录已满,无法复制,即将返回"<>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<<"操作错误,请重新输入"<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<<"选择错误,请重新输入"<