通讯录管理系统

纯代码版:点击打开链接

手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为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.老师给的实验分析是代码的大体架构,一定要好好看。

代码实现:

#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].namestring gettel(int i);      //获取手机卡第i个电话号码s[i].telint 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;elselow=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].namestring gettel(int i);       //获取手机卡第i个电话号码s[i].telstring getorigo(int i);     //获取手机卡第i个籍贯s[i].origostring getqq(int i);        //获取手机卡第i个QQs[i].qqint 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;elselow=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;
}

通讯录管理系统 C++实验报告相关推荐

  1. 销售管理系统c语言实验报告,汽车销售信息管理系统程序设计实验报告.DOC

    汽车销售信息管理系统程序设计实验报告.DOC 汽车销售信息管理系统程序设计实验报告 姓名:宁蒙 班级:2009211128班 学号 班内序号:25 手机 邮箱:691342444@ 此次我们小学期需要 ...

  2. c语言个人通讯录管理系统实验报告_C语言个人通讯录管理系统课程设计报告

    语言程序设计> C <课程设计报告 _________:__________C 设计题目语言个人通讯录管理系统 摘要 本次课程设计地题目为个人通讯录管理系统, 要求将程序中所输入地联系人姓 ...

  3. MySQL实验超市管理系统_超市会员管理系统(数据库)实验报告.doc

    PAGE PAGE 2 学号: 成绩:________ 数据库综合实验报告 院 系 计算机与电子信息学院 专 业 计算机科学与技术 班 级 xxxxxxxxxxx 设计题目 超市会员管理系统 姓 名 ...

  4. 实验管理系统java_实验报告管理系统

    该系统使用B/S架构,开发工作全部在服务器端完成,客户端只需要Web浏览器.服务器端使用较为健全的J2EE以及较为合理的TOMCAT服务器,数据库使用较为稳定的Oracle 10g数据库.STRUTS ...

  5. 通讯录管理系统 课程设计报告(上交版)

    因为复制会有格式错误,所以word文本版请下载 百度云链接:https://pan.baidu.com/s/1v4h158ybyIHCOIe5_k8vOA 密码:crve 源代码: #include& ...

  6. 差点无缘Offer!java通讯录管理系统设计实验报告

    Spring Security观后感--手绘思维脑(供参考) 手绘的思维导图,是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的,相当于是一个知识的总结与梳理 ...

  7. 通讯录Android的设计报告,通讯录管理系统 课程设计报告(上交版)

    因为复制会有格式错误,所以word文本版请下载 百度云链接:https://pan.baidu.com/s/1v4h158ybyIHCOIe5_k8vOA 密码:crve 源代码:#include # ...

  8. Java 写的通讯录管理系统 带详细设计报告 功能非常齐全 完整源码

    今天为大家分享一个java语言编写的贪吃蛇系统,目前系统功能已经很全面,后续会进一步完善.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 开发语言 ...

  9. java销售管理系统实验报告_java学生通讯录管理系统实验报告

    java学生通讯录管理系统实验报告 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 宁波大红鹰学院 课课程程设设计计课程设计名称: ...

最新文章

  1. 自动化测试框架cucumber_BDD测试框架之Cucumber使用入门
  2. Object or Function-JS 中的鸡与蛋问题
  3. weevely入手使用笔记
  4. ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)
  5. 20155222卢梓杰 《Java程序设计》第1周学习总结
  6. 控制流(swift)
  7. mac chrome 打包扩展程序
  8. VC++判断文件或文件夹是否存在(转)
  9. NA-NP-IE系列实验4:CLI 的使用与IOS 基本命令(1)
  10. 在Flask程序中实现GitHub登录和GitHub资源交互
  11. phpMyAdmin view_create.php 跨站脚本漏洞
  12. python输出数字三角形_蓝桥杯:数字三角的Python解决方案,三角形,之,解答
  13. 李开复写给女孩子们的
  14. 硬货专栏 |WebRTC SDP 详解和剖析
  15. 正则表达式-匹配A和B之间字符串
  16. 50个明星区块链项目跌破发行价,超10家项目几近归零
  17. Direct Boot Mode
  18. 三网运营商移动联通电信话费余额查询接口-携号转网识别查询/号码归属地查询-携号转网API接口
  19. 机器学习模型选择:调参参数选择
  20. 安卓银行木马新增“keylogger”功能,攻击能力倍增

热门文章

  1. BCD编码(8421编码)
  2. 南京16家需要转诊才能享受统筹的三甲医院
  3. SqlServer 中的触发器
  4. RocketMQ学习笔记(二)
  5. docker、K8S、k3s、rancher
  6. html表格不随字数变化,设置table中的宽度不随文字改变让其固定
  7. 从微信端跳到外部浏览器进行apk文件下载最新解决方案
  8. MATLAB人脸识别疫情防护门禁系统GUI设计与实现
  9. 有赞android电话面试,挖财 /有赞电话面试 题目分享
  10. AES加密算法在Java中的应用