通讯录管理系统
手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(假设每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含姓名和电话号码两项信息。存储在电话卡上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
要求:
- 创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的联系人的信息)。
- 以菜单方式工作(字符界面即可)
- 存储在手机上的联系人的信息包括:姓名和电话号码;存储在手机卡上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
- 管理系统的功能包括:
- 新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中,并且要检查目标位置上是否存在相同的电话号码)
- 删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
- 修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
- 查询:根据名字查询联系人信息(查询结果可能不唯一)
- 浏览:显示所有联系人的信息
- 将联系人的信息从手机转存到手机卡上(转存过程中,要避免重复数据(姓名和电话号码相同)的存在;并且在转存是要检查容量是否受限 。下同。)
- 将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在)
- 要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点。
-
1.class contact类
本类代表的手机联系人类,作用是处理联系人信息,共有数据成员方便类和类之间相互调用,对实现后期文件操作有重要作用。
class contact
{
public:
string name;
string number;
定义姓名和电话号码字符串
void setdoublename(string names,string numbers);
前置条件:手机联系人不存在
输入:无
功能:对手机联系人的信息进行初始化
输出:无
后置条件:手机卡联系人的姓名电话已存在。
string getname();
前置条件:手机联系人的姓名已进行录入
输入:无
功能:获取手机联系人的姓名
输出:无
后置条件:返回卡联系人的姓名
string getnumber();
前置条件:手机联系人的电话行录入
输入:无
功能:获取手机联系人的电话
输出:无
后置条件:返回卡联系人的电话
void modify();
前置条件:手机联系人的姓名,电话已录入
输入:无
功能:修改手机联系人的姓名和电话
输出:无
后置条件:手机联系人的姓名和电话已修改
contact() {}
前提条件:未存在空析构函数,未重定义
输入:无
实现功能:系统默认调用
输出:无
后置条件:无
friend istream&operator>>(istream&in,contact&p);
前置条件:手机联系人已经存在
输入:无
功能:重载运算符,进行联系人信息的输入
输出:无
后置条件:在界面联系人的姓名和电话进行输入
friend ostream&operator<<(ostream&out,contact&p);
前置条件:手机联系人已经存在
输入:无
功能:重载运算符,进行联系人信息的输出
输出:无
后置条件:在界面联系人的姓名和电话输出。
};
2.class phonecard类
本类代表手机卡联系人类,用继承的方法继承基类的成员函数,继承对象包括姓名和电话,增加了籍贯和qq号码,成员函数是共有的成员函数,方便进行类和类之间的调用,对之后的信息添加删除有重要帮助。
class phonecard:public contact
{
public:
string address;
string qq;
定义两个数据成员对象
string getaddress();
条件:手机卡联系人的籍贯已经录入。
输入:无
功能:获取手机卡联系人的籍贯
输出:无
后置条件:返回手机卡联系人的籍贯。
string getqq();
前置条件:手机卡联系人的qq已经录入。
输入:无
功能:获取手机卡联系人的qq
输出:无
后置条件:返回手机卡联系人的qq。
phonecard() {}
前提条件:未存在空析构函数,未重定义
输入:无
实现功能:系统默认调用
输出:无
后置条件:无
void setnnaq(string names , string numbers , string addresses , string qqs);
前置条件:手机卡联系人不存在
输入:无
功能:对手机联系人的信息进行初始化
输出:无
后置条件:手机卡联系人的姓名电话地址QQ已存在。
void modify();
前置条件:手机联系人的姓名,电话,地址,QQ已经录入。
输入:无
功能:修改手机联系人的姓名,电话,地址,QQ。
输出:无
后置条件:手机联系人的姓名,电话,地址,QQ已进行修改。
friend istream&operator>>(istream&in,phonecard&p);
前置条件:手机联系人已经存在
输入:无
功能:重载运算符,进行联系人信息的输入
输出:无
后置条件:在界面联系人的姓名和电话进行输入
friend ostream&operator<<(ostream&out,phonecard&p);
前置条件:手机联系人已经存在
输入:无
功能:重载运算符,进行联系人信息的输出
输出:无
后置条件:在界面联系人的姓名和电话输出。
};
3.class lists类
这个类是虚基类,用到多态的知识点。堕胎的作用是提高代码的维护性和拓展性。书本中对于多态的定义是:统一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时就可以通过基类的指针调用派生类的方法。
class house 通讯簿抽象类,封装函数。
{
public:
virtual void add() = 0;增加一个联系人
virtual void delete1() = 0;删除一个联系人
virtual void display() = 0;显示所有联系人的信息
virtual void xiugai() = 0;修改联系人的信息
virtual void search() = 0;查询并显示某一联系人的信息
};
定义第三个虚基类方便后续对函数进行封装,纯虚函数。
4.class phonelist类
这个构造函数的数据成员中有构造函数析构函数和io操作函数,程序开始运行的时候将文件数据导入数组当中,在进行读操作写操作,用析构函数写操作写入文件不会丢失数据
class phonelist:public lists
{
public:
int size;
contact contactor[1000];
定义手机联系人数量和手机联系人数组
phonelist();
前置条件:手机联系人对象数组已存在
输入:无
功能:读取文本文件中的数据,并根据文件内容创建联系人对象数组