项目要求:
手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(假设每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含姓名和电话号码两项信息。存储在电话卡上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
要求:
1、创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的联系人的信息)。
2、以菜单方式工作(字符界面即可)
3、存储在手机上的联系人的信息包括:姓名和电话号码;存储在手机卡上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
4、管理系统的功能包括:
a.新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中,并且要检查目标位置上是否存在相同的电话号码)
b.删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
3.修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
d.查询:根据名字查询联系人信息(查询结果可能不唯一)
e.浏览:显示所有联系人的信息
将联系人的信息从手机转存到手机卡上(转存过程中,要避免重复数据(姓名和电话号码相同)的存在;并且在转存是要检查容量是否受限 。下同。)
f.将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在)
要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点
设计分析:
一、由于代码比较长,单文件写的时候不好查找,所以采用的多文件的写法,分成了1、手机联系人 2、手机卡联系人 3、通讯录抽象类 4、手机通讯录 5、手机卡通讯录 6、用户类 7、菜单类 8、主函数 这8个文件。
二、按照要求,手机联系人有姓名和电话两个数据成员,手机卡联系人有姓名,电话,籍贯,QQ四个数据成员,所以手机卡联系人应当继承于手机联系人。
三、为了支持多态,手机通讯录和手机卡通讯录都应继承于通讯录抽象类。
四、为了方便起见,手机通讯录和手机卡通讯录使用vector动态数组来定义数据成员。
五、程序的操作由菜单类与用户类实现,菜单类提供操作界面,用户类提供操作;用户类中两个对象分别为手机通讯簿类与手机卡通讯簿类,通过在用户类对这两个类的动态联编,从而实现在两个文本文件中的操作。
六.程序开始时,用户类及其对象的构造函数会自动打开文件进行数据读入,结束时会自动关闭文件进行数据写入并保存。
七.运用了大量的转向语句,输入0时才会结束运行。
源文件:
手机联系人:
#ifndef PHONECONTACT_H
#define PHONECONTACT_H
#include<iostream>
#include <string>
using namespace std;
class PhoneContact
{
protected:
string name;
string phone;
public:
PhoneContact(string xname="新联系人",string xphone="无电话");
void set(string xname,string xphone);
void modify();
friend istream &operator >>(istream &in,PhoneContact &obj);
friend ostream &operator <<(ostream &out,PhoneContact &obj);
string getn();
string getp();
};
#endif // PERSONCONTACT_H
手机卡联系人:
#ifndef CARDCONTACT_H
#define CARDCONTACT_H
#include "phonecontact.h"
#include<string>
#include<iostream>
using namespace std;
class CardContact:public PhoneContact
{
private:
string address;
string QQ;
public:
CardContact(string xname="新联系人",string xphone="无电话",string xaddress="无地址",string xQQ="无QQ");
void set(string xname,string xphone,string xaddress="无地址",string xQQ="无QQ");
void modify();
friend istream &operator >>(istream &in,CardContact &obj);
friend ostream &operator <<(ostream &out,CardContact &obj);
string geta();
string getq();
};
#endif // CARDCONTART_H
通讯录抽象类:
#ifndef LWXLIST_H
#define LWXLIST_H
#include<string>
using namespace std;
class lwxlist
{
public:
virtual void add()=0;
virtual void xdelete(string xphone)=0;
virtual void change(string xphone)=0;
virtual void inquiry(string xname)=0;
virtual void display()=0;
};
#endif // LWXLIST_H
手机通讯录:
#ifndef PHONELIST_H
#define PHONELIST_H
#include"lwxlist.h"
#include"phonecontact.h"
#include<vector>
using namespace std;
class PhoneList:public lwxlist
{
int phone_num;
vector<PhoneContact> phonecontact;
public:
PhoneList();
~PhoneList();
void add();
void xdelete(string xphone);
void change(string xphone);
void inquiry(string xname);
void display();
void copy(string xname,string xphone);
int get_phone_num();
string getn(int i);
string getp(int i);
void clear();
};
#endif // PHONELIST_H
手机卡通讯录:
#ifndef CARDLIST_H
#define CARDLIST_H
#include"lwxlist.h"
#include"cardcontact.h"
#include<vector>
using namespace std;
class CardList:public lwxlist
{
int card_num;
vector<CardContact> cardcontact;
public:
CardList();
~CardList();
void add();
void xdelete(string xphone);
void change(string xphone);
void inquiry(string xname);
void display();
void copy(string xname,string xphone);
int get_card_num();
string getn(int i);
string getp(int i);
void clear();
};
#endif // CARDLIST_H
用户类:
#ifndef CARDLIST_H
#define CARDLIST_H
#include"lwxlist.h"
#include"cardcontact.h"
#include<vector>
using namespace std;
class CardList:public lwxlist
{
int card_num;
vector<CardContact> cardcontact;
public:
CardList();
~CardList();
void add();
void xdelete(string xphone);
void change(string xphone);
void inquiry(string xname);
void display();
void copy(string xname,string xphone);
int get_card_num();
string getn(int i);
string getp(int i);
void clear();
};
#endif // CARDLIST_H
菜单类:
#ifndef LWXMENU_H
#define LWXMENU_H
class lwxmenu
{
public:
void mailmenu();
void modifyperson();
void modifycard();
void addmenu();
void inquirymenu();
void displaymenu();
};
#endif // LWXMENU_H
源程序:
手机联系人:
#include "phonecontact.h"
#include<iostream>
#include <string>
#include"lwxmenu.h"
using namespace std;
PhoneContact::PhoneContact(string xname,string xphone)
{
name=xname;
phone=xphone;
}
void PhoneContact::set(string xname,string xphone)
{
name=xname;
phone=xphone;
}
void PhoneContact::modify()
{
lwxchange3:
{
int n;
lwxmenu menu;
menu.modifyperson();
cin>>n;
switch(n)
{
case 1:
{
cout<<"请输入新的姓名"<<endl;
cin>>name;
cout<<"请输入新的电话"<<endl;
cin>>phone;
break;
}
case 2:
{
cout<<"请输入新的姓名"<<endl;
cin>>name;
break;
}
case 3:
{
cout<<"请输入新的电话"<<endl;
cin>>phone;
break;
}
default:
{
cout <<"您的输入有误,请重新输入" << endl;
goto lwxchange3;
}
}
}
}
istream &operator >>(istream &in,PhoneContact &obj)
{
cout<<"请输入姓名"<<endl;
in>>obj.name;
cout<<"请输入电话"<<endl;
in>>obj.phone;
return in;
}
ostream &operator <<(ostream &out,PhoneContact &obj)
{
cout<<"联系人姓名: "<<obj.name<<'\t';
cout<<"联系人电话: "<<obj.phone<<endl;
return out;
}
string PhoneContact::getn()
{
return name;
}
string PhoneContact::getp()
{
return phone;
}
手机卡联系人:
#include "cardcontact.h"
#include"phonecontact.h"
#include<string>
#include<iostream>
#include"lwxmenu.h"
using namespace std;
CardContact::CardContact(string xname,string xphone,string xaddress,string xQQ):PhoneContact(xname,xphone)
{
address=xaddress;
QQ=xQQ;
}
void CardContact::set(string xname,string xphone,string xaddress,string xQQ)
{
PhoneContact::set(xname,xphone);
address=xaddress;
QQ=xQQ;
}
void CardContact::modify()
{
lwxchange2:
{
int n;
lwxmenu menu;
menu.modifycard();
cin>>n;
switch(n)
{
case 1:
{
cout<<"请输入新的姓名"<<endl;
cin>>name;
cout<<"请输入新的电话"<<endl;
cin>>phone;
cout<<"请输入新的地址"<<endl;
cin>>address;
cout<<"请输入新的QQ"<<endl;
cin>>QQ;
break;
}
case 2:
{
cout<<"请输入新的姓名"<<endl;
cin>>name;
break;
}
case 3:
{
cout<<"请输入新的电话"<<endl;
cin>>phone;
break;
}
case 4:
{
cout<<"请输入新的地址"<<endl;
cin>>address;
break;
}
case 5:
{
cout<<"请输入新的QQ"<<endl;
cin>>QQ;
break;
}
default:
{
cout <<"您的输入有误,请重新输入" << endl;
goto lwxchange2;
}
}
}
}
istream &operator >>(istream &in,CardContact &obj)
{
cout<<"请输入姓名"<<endl;
in>>obj.name;
cout<<"请输入电话"<<endl;
in>>obj.phone;
cout<<"请输入地址"<<endl;
in>>obj.address;
cout<<"请输入QQ"<<endl;
in>>obj.QQ;
return in;
}
ostream &operator <<(ostream &out,CardContact &obj)
{
cout<<"联系人姓名: "<<obj.name<<'\t';
cout<<"联系人电话: "<<obj.phone<<'\t';
cout<<"联系人地址: "<<obj.address<<'\t';
cout<<"联系人QQ: "<<obj.QQ<<endl;
return out;
}
string CardContact::geta()
{
return address;
}
string CardContact::getq()
{
return QQ;
}
手机通讯录:
#include "phonelist.h"
#include<iostream>
#include<vector>
#include<string>
#include"phonecontact.h"
#include<fstream>
using namespace std;
PhoneList::PhoneList()
{
ifstream fin("手机.txt");
if(!fin)
{
cout<<"File could not be open"<<endl;
return;
}
char str[100];
fin.getline(str, 100);
fin.getline(str, 100);
fin.getline(str, 100);
fin.getline(str, 100);
phone_num=-1;
string xname,xphone;
while(fin>>xname>>xphone)
{
PhoneContact temp;
temp.set(xname,xphone);
phonecontact.push_back(temp);
phone_num++;
}
fin.close();
}
PhoneList::~PhoneList()
{
ofstream fout("手机.txt");
if(!fout)
{
cout<<"File could not be open"<<endl;
return ;
}
fout << " ----------------------------------------------- " << endl;
fout << "| 手机联系人 |" << endl;
fout << " ----------------------------------------------- " << endl;
fout << "姓名\t\t\t号码\t\t\t" << endl;
for (int i = 0; i <=phone_num ; i++)
{
fout.setf(ios::left);
fout.width(24);
fout << phonecontact[i].getn();
fout.width(24);
fout << phonecontact[i].getp() << endl;
}
phone_num = -1;
phonecontact.clear();
fout.close();
}
void PhoneList::add()
{
if(phone_num>1000)
{
cout<<"手机通讯录已满,无法添加"<<endl;
return;
}
PhoneContact temp;
cin>>temp;
phonecontact.push_back(temp);
phone_num++;
cout<<"添加成功"<<endl;
}
void PhoneList::xdelete(string xphone)
{
if(phone_num<0)
{
cout<<"手机联系人为空,无法删除"<<endl;
return ;
}
bool flag=false;
for(int i=phone_num; i>=0; i--)
{
if(phonecontact[i].getp()==xphone)
{
flag=true;
cout<<"联系人信息"<<endl;
cout<<phonecontact[i];
cout<<"是否删除"<<endl;
cout<<"1.确认删除"<<endl;
cout<<"2.取消删除"<<endl;
int n;
cin>>n;
if(n==1)
{
phone_num--;
phonecontact.erase(phonecontact.begin()+i);
cout<<"删除成功"<<endl;
}
else
continue;
}
}
if(!flag)
{
cout<<"手机通讯录无此号码"<<endl;
return;
}
}
void PhoneList::change(string xphone)
{
if(phone_num<0)
{
cout<<"手机联系人为空,无法修改"<<endl;
return ;
}
bool flag=false;
for(int i=0; i<=phone_num; i++)
{
if(phonecontact[i].getp()==xphone)
{
flag=true;
cout<<"联系人信息"<<endl;
cout<<phonecontact[i];
cout<<"是否修改"<<endl;
cout<<"1.确认修改"<<endl;
cout<<"2.取消修改"<<endl;
int n;
cin>>n;
if(n==1)
{
phonecontact[i].modify();
cout<<"修改成功"<<endl;
}
else
{
cout<<"是否继续查询修改"<<endl;
cout<<"1.继续查询"<<endl;
cout<<"2.取消查询"<<endl;
int t;
cin>>t;
if(t==1)
continue;
else
break;
}
}
}
cout<<"搜索结束,修改完毕"<<endl;
if(!flag)
{
cout<<"手机无此联系人,无法修改"<<endl;
return;
}
}
void PhoneList::inquiry(string xname)
{
if(phone_num<0)
{
cout<<"手机无联系人,无法查询"<<endl;
return ;
}
bool flag=false;
for(int i=0;i<=phone_num;i++)
{
if(phonecontact[i].getn()==xname)
{
flag=true;
cout<<"联系人信息:"<<endl;
cout<<phonecontact[i];
cout<<"是否继续查询"<<endl;
cout<<"1.继续查询"<<endl;
cout<<"2.取消查询"<<endl;
int n;
cin>>n;
if(n==1)
continue;
else
break;
}
}
if(!flag)
{
cout<<"手机无此联系人"<<endl;
return;
}
}
void PhoneList::display()
{
if(phone_num<0)
{
cout<<"手机无联系人"<<endl;
return;
}
cout<<"联系人信息:"<<endl;
for(int i=0;i<=phone_num;i++)
{
cout<<phonecontact[i];
}
}
void PhoneList::copy(string xname,string xphone)
{
for (int i = 0; i <= phone_num; i++) {
if (phonecontact[i].getn() == xname && phonecontact[i].getp() == xphone) {
cout << "姓名为:" << xname << " 电话为:" << xphone << " 的联系人已存在!" << endl;
return;
}
}
PhoneContact temp;
temp.set(xname, xphone);
phonecontact.push_back(temp);
phone_num++;
cout << "已存入姓名为:" << xname << " 电话为:" << xphone << " 的联系人!" << endl;
}
int PhoneList::get_phone_num()
{
return phone_num;
}
string PhoneList::getn(int i)
{
return phonecontact[i].getn();
}
string PhoneList::getp(int i)
{
return phonecontact[i].getp();
}
void PhoneList::clear()
{
phonecontact.clear();
phone_num=-1;
}
手机卡通讯录:
#include "cardlist.h"
#include<iostream>
#include<vector>
#include<string>
#include"cardcontact.h"
#include<fstream>
using namespace std;
CardList::CardList()
{
ifstream fin("手机卡.txt");
if(!fin)
{
cout<<"File could not be open"<<endl;
return;
}
char str[100];
fin.getline(str, 100);
fin.getline(str, 100);
fin.getline(str, 100);
fin.getline(str, 100);
card_num=-1;
string xname,xphone,xaddress,xQQ;
while(fin>>xname>>xphone>>xaddress>>xQQ)
{
CardContact temp;
temp.set(xname,xphone,xaddress,xQQ);
cardcontact.push_back(temp);
card_num++;
}
fin.close();
}
CardList::~CardList()
{
ofstream fout("手机卡.txt");
if(!fout)
{
cout<<"File could not be open"<<endl;
return ;
}
fout << " ----------------------------------------------- " << endl;
fout << "| 手机卡联系人 |" << endl;
fout << " ----------------------------------------------- " << endl;
fout << "姓名\t\t号码\t\t地址\t\tQQ\t\t" << endl;
for (int i = 0; i<=card_num; i++)
{
fout.setf(ios::left);
fout.width(16);
fout << cardcontact[i].getn();
fout.width(16);
fout << cardcontact[i].getp();
fout.width(16);
fout << cardcontact[i].geta();
fout.width(16);
fout << cardcontact[i].getq()<<endl;
}
card_num = -1;
cardcontact.clear();
fout.close();
}
void CardList::add()
{
if(card_num>1000)
{
cout<<"手机卡通讯录已满,无法添加"<<endl;
return;
}
CardContact temp;
cin>>temp;
cardcontact.push_back(temp);
card_num++;
cout<<"添加成功"<<endl;
}
void CardList::xdelete(string xphone)
{
if(card_num<0)
{
cout<<"手机卡联系人为空,无法删除"<<endl;
return ;
}
bool flag=false;
for(int i=card_num; i>=0; i--)
{
if(cardcontact[i].getp()==xphone)
{
flag=true;
cout<<"联系人信息"<<endl;
cout<<cardcontact[i];
cout<<"是否删除"<<endl;
cout<<"1.确认删除"<<endl;
cout<<"2.取消删除"<<endl;
int n;
cin>>n;
if(n==1)
{
card_num--;
cardcontact.erase(cardcontact.begin()+i);
cout<<"删除成功"<<endl;
}
else
continue;
}
}
if(!flag)
{
cout<<"手机卡通讯录无此号码"<<endl;
return;
}
}
void CardList::change(string xphone)
{
if(card_num<0)
{
cout<<"手机卡联系人为空,无法修改"<<endl;
return ;
}
bool flag=false;
for(int i=0; i<=card_num; i++)
{
if(cardcontact[i].getp()==xphone)
{
flag=true;
cout<<"联系人信息"<<endl;
cout<<cardcontact[i];
cout<<"是否修改"<<endl;
cout<<"1.确认修改"<<endl;
cout<<"2.取消修改"<<endl;
int n;
cin>>n;
if(n==1)
{
cardcontact[i].modify();
cout<<"修改成功"<<endl;
}
else
{
cout<<"是否继续查询修改"<<endl;
cout<<"1.继续查询"<<endl;
cout<<"2.取消查询"<<endl;
int t;
cin>>t;
if(t==1)
continue;
else
break;
}
}
}
cout<<"搜索结束,修改完毕"<<endl;
if(!flag)
{
cout<<"手机卡无此联系人,无法修改"<<endl;
return;
}
}
void CardList::inquiry(string xname)
{
if(card_num<0)
{
cout<<"手机卡无联系人,无法查询"<<endl;
return ;
}
bool flag=false;
for(int i=0;i<=card_num;i++)
{
if(cardcontact[i].getn()==xname)
{
flag=true;
cout<<"联系人信息:"<<endl;
cout<<cardcontact[i];
cout<<"是否继续查询"<<endl;
cout<<"1.继续查询"<<endl;
cout<<"2.取消查询"<<endl;
int n;
cin>>n;
if(n==1)
continue;
else
break;
}
}
if(!flag)
{
cout<<"手机卡无此联系人"<<endl;
return;
}
}
void CardList::display()
{
if(card_num<0)
{
cout<<"手机卡无联系人"<<endl;
return;
}
cout<<"联系人信息:"<<endl;
for(int i=0;i<=card_num;i++)
{
cout<<cardcontact[i];
}
}
void CardList::copy(string xname,string xphone)
{
for (int i = 0; i <= card_num; i++) {
if (cardcontact[i].getn() == xname && cardcontact[i].getp() == xphone) {
cout << "姓名为:" << xname << " 电话为:" << xphone << " 的联系人已存在!" << endl;
return;
}
}
CardContact temp;
temp.set(xname, xphone);
cardcontact.push_back(temp);
card_num++;
cout << "已存入姓名为:" << xname << " 电话为:" << xphone << " 的联系人!" << endl;
}
int CardList::get_card_num()
{
return card_num;
}
string CardList::getn(int i)
{
return cardcontact[i].getn();
}
string CardList::getp(int i)
{
return cardcontact[i].getp();
}
void CardList::clear()
{
cardcontact.clear();
card_num=-1;
}
菜单类:
#include "lwxmenu.h"
#include <iostream>
using namespace std;
void lwxmenu::mailmenu()
{
cout << "***********************************************" << endl;
cout << "* -----欢迎进入通讯录管理系统------ *" << endl;
cout << "*---------------------------------------------*" << endl;
cout << "* 1.新建联系人 *" << endl;
cout << "* 2.删除联系人 *" << endl;
cout << "* 3.查询联系人 *" << endl;
cout << "* 4.修改联系人信息 *" << endl;
cout << "* 5.浏览联系人信息 *" << endl;
cout << "* 6.将联系人的信息从手机转存到手机卡上 *" << endl;
cout << "* 7.将联系人的信息从手机卡转存到手机上 *" << endl;
cout << "* 0.退出 *" << endl;
cout << "***********************************************" << endl;
cout << "请选择要进行的操作:";
}
void lwxmenu::modifyperson()
{
cout << "**********************************" << endl;
cout << "* 1.修改联系人姓名和号码 *" << endl;
cout << "* 2.修改联系人姓名 *" << endl;
cout << "* 3.修改联系人号码 *" << endl;
cout << "**********************************" << endl;
cout << "请选择要进行的操作:";
}
void lwxmenu::modifycard()
{
cout << "**********************************" << endl;
cout << "* 1.修改联系人全部信息 *" << endl;
cout << "* 2.修改联系人姓名 *" << endl;
cout << "* 3.修改联系人号码 *" << endl;
cout << "* 4.修改联系人籍贯 *" << endl;
cout << "* 5.修改联系人QQ *" << endl;
cout << "**********************************" << endl;
cout << "请选择要进行的操作:";
}
void lwxmenu::addmenu()
{
cout << "**********************************" << endl;
cout << "* 1.添加至手机通讯录 *" << endl;
cout << "* 2.添加至手机卡通讯录 *" << endl;
cout << "**********************************" << endl;
cout << "请选择要进行的操作:";
}
void lwxmenu::inquirymenu()
{
cout << "**********************************" << endl;
cout << "* 1.查询手机通讯录 *" << endl;
cout << "* 2.查询手机卡通讯录 *" << endl;
cout << "* 3.两个通讯录均查询 *" << endl;
cout << "**********************************" << endl;
cout << "请选择要进行的操作:";
}
void lwxmenu::displaymenu()
{
cout << "**********************************" << endl;
cout << "* 1.浏览手机通讯录 *" << endl;
cout << "* 2.浏览手机卡通讯录 *" << endl;
cout << "* 3.两个通讯录均浏览 *" << endl;
cout << "**********************************" << endl;
cout << "请选择要进行的操作:";
}
用户类:
#include "user.h"
#include<iostream>
#include<string>
using namespace std;
User::User()
{
cout << "----------------------------------------"<<endl;
cout << "* 欢迎使用通讯录管理系统 *"<<endl;
cout << "----------------------------------------"<<endl;
}
User::~User()
{
cout << "----------------------------------------"<<endl;
cout << "* 感谢您使用通讯录管理系统 *"<< endl;
cout << "----------------------------------------"<<endl;
system("pause");
system("cls");
}
void User::add()
{
lwxchange4:
{
lwxlist *temp;
lwxmenu menu;
menu.addmenu();
int n;
cin>>n;
switch(n)
{
case 1:
{
temp=&phonelist;
temp->add();
break;
}
case 2:
{
temp=&cardlist;
temp->add();
break;
}
default:
{
cout<<"输入有误,请重新输入"<<endl;
goto lwxchange4;
}
}
}
}
void User::xdelete()
{
string xphone;
cout<<"请输入要删除的联系人电话"<<endl;
cin>>xphone;
lwxlist *temp;
cout << "--------------手机通讯录----------------" << endl;
temp=&phonelist;
temp->xdelete(xphone);
cout << "--------------手机卡通讯录----------------" << endl;
temp=&cardlist;
temp->xdelete(xphone);
}
void User::change()
{
string xphone;
cout<<"请输入要修改的联系人电话"<<endl;
cin>>xphone;
lwxlist *temp;
cout << "--------------手机通讯录----------------" << endl;
temp=&phonelist;
temp->change(xphone);
cout << "--------------手机卡通讯录----------------" << endl;
temp=&cardlist;
temp->change(xphone);
}
void User::inquiry()
{
string xname;
cout<<"请输入要查询的联系人名字"<<endl;
cin>>xname;
lwxchange5:
{
lwxmenu menu;
menu.inquirymenu();
int n;
cin>>n;
lwxlist *temp;
switch(n)
{
case 1:
{
temp=&phonelist;
temp->inquiry(xname);
break;
}
case 2:
{
temp=&cardlist;
temp->inquiry(xname);
break;
}
case 3:
{
cout << "--------------手机通讯录----------------" << endl;
temp=&phonelist;
temp->inquiry(xname);
cout << "--------------手机卡通讯录----------------" << endl;
temp=&cardlist;
temp->inquiry(xname);
break;
}
default:
{
cout<<"输入有误,请重新输入"<<endl;
goto lwxchange5;
}
}
}
}
void User::display()
{
lwxchange6:
{
lwxmenu menu;
menu.displaymenu();
int n;
cin>>n;
lwxlist *temp;
switch(n)
{
case 1:
{
temp=&phonelist;
temp->display();
break;
}
case 2:
{
temp=&cardlist;
temp->display();
break;
}
case 3:
{
cout << "--------------手机通讯录----------------" << endl;
temp=&phonelist;
temp->display();
cout << "--------------手机卡通讯录----------------" << endl;
temp=&cardlist;
temp->display();
break;
}
default:
{
cout<<"输入有误,请重新输入"<<endl;
goto lwxchange6;
}
}
}
}
void User::cgop()
{
if(cardlist.get_card_num()<0)
{
cout<<"手机卡无联系人"<<endl;
return;
}
for (int i = 0; i <= cardlist.get_card_num(); i++) {
if (phonelist.get_phone_num() >= 1000) {
cout << "手机通讯录已满!无法增加新联系人!" << endl;
return;
}
phonelist.copy(cardlist.getn(i), cardlist.getp(i));
}
cardlist.clear();
cout << "移动成功!" << endl;
}
void User::pgoc()
{
if(phonelist.get_phone_num()<0)
{
cout<<"手机无联系人"<<endl;
return;
}
for (int i = 0; i <= phonelist.get_phone_num(); i++) {
if (cardlist.get_card_num() >= 1000) {
cout << "手机卡通讯录已满!无法增加新联系人!" << endl;
return;
}
cardlist.copy(phonelist.getn(i), phonelist.getp(i));
}
phonelist.clear();
cout << "移动成功!" << endl;
}
void User::pcopyc()
{
if(phonelist.get_phone_num()<0)
{
cout<<"手机无联系人"<<endl;
return;
}
for (int i = 0; i <= phonelist.get_phone_num(); i++) {
if (cardlist.get_card_num() >= 1000) {
cout << "手机卡通讯录已满!无法增加新联系人!" << endl;
return;
}
cardlist.copy(phonelist.getn(i), phonelist.getp(i));
}
cout << "复制成功!" << endl;
}
void User::ccopyp()
{
if(cardlist.get_card_num()<0)
{
cout<<"手机卡无联系人"<<endl;
return;
}
for (int i = 0; i <= cardlist.get_card_num(); i++) {
if (phonelist.get_phone_num() >= 1000) {
cout << "手机通讯录已满!无法增加新联系人!" << endl;
return;
}
phonelist.copy(cardlist.getn(i), cardlist.getp(i));
}
cout << "移动成功!" << endl;
}
主函数:
#include <iostream>
#include"phonecontact.h"
#include"cardcontact.h"
#include"lwxlist.h"
#include"lwxmenu.h"
#include"user.h"
#include"phonelist.h"
#include"cardlist.h"
using namespace std;
int main()
{
User user;
lwxmenu menu;
int m=1;
while (m != 0)
{
lwxchange1:
{
system("pause");
system("cls");
menu.mailmenu();
cin >> m;
switch(m)
{
case 1:
{
user.add();
break;
}
case 2:
{
user.xdelete();
break;
}
case 3:
{
user.inquiry();
break;
}
case 4:
{
user.change();
break;
}
case 5:
{
user.display();
break;
}
case 6:
{
int x;
cout<<"1.复制"<<endl;
cout<<"2.转移"<<endl;
cin>>x;
if(x==1)
{
user.pcopyc();
break;
}
else
{
user.pgoc();
break;
}
}
case 7:
{
int x;
cout<<"1.复制"<<endl;
cout<<"2.转移"<<endl;
cin>>x;
if(x==1)
{
user.ccopyp();
break;
}
else
{
user.cgop();
break;
}
}
case 0:
{
system("pause");
system("cls");
break;
}
default:
{
cout<<"输入有误,请重新输入"<<endl;
goto lwxchange1;
}
}
}
}
system("pause");
system("cls");
return 0;
}
使用说明
1.首先,我们需要有两个类来储存一个手机联系人或者手机卡联系人,就有了类PhoneContact和CardContact。
2.通讯录里不能只有一个联系人,所以就有了手机通讯录和手机卡通讯录来把手机联系人和手机卡联系人储存起来。就有了类PhoneList和CardList。
3.为了支持多态,我们将PhoneList和CardList继承于纯虚类lwxlist。
4.菜单类是为了让这个系统更加清晰,使用更加方便。
5.我们定义用户类(User)来调用PhoneList和CardList。User类也是我们这个系统的关键,我们在程序里的所有的操作都是基于User类来的。
6.写完User类,我们在主函数直接调用即可。
7.为了每次打开程序,都能将我么之前的信息保存下来,在手机通讯录和手机卡通讯录的构造函数和析构函数里建立文件的输入和输出。
8.
8.1.添加联系人:
在主函数里输入1,就会调用User.add(),在这个函数里,定义了一个通讯录抽象类的指针,然后会输出一个菜单
如果输入1,就会将指针指向手机通讯录,然后调用手机通讯录的add()函数,如果手机联系人总数大于1000,则不能添加。反之,定义个手机联系人的对象,通过重载的>>来输入一个手机联系人,然后放在动态数组里,手机通讯录总数加一。
如果输出2,就会将指针指向手机卡通讯录,然后调用手机通讯录的add()函数,如果手机联系人总数大于1000,则不能添加。反之,定义个手机卡联系人的对象,通过重载的>>来输入一个手机联系人,然后放在动态数组里,手机卡通讯录总数加一。
如果输入其他的数,则会返回一开始,重新输入。
8.2.删除联系人:
在主函数里输入2,就会调用User.xdelete(),在这个函数里,定义了一个通讯录抽象类的指针,我们是通过联系人电话来查询到联系人然后删除的,所有我们要先输入一个电话,当然,我们会提醒你让你输入一个电话的。因为删除联系人时手机通讯录和手机卡通讯录里的都要删除,所以,将指针先后指向了手机通讯录和手机卡通讯录,然后分别调用了手机通讯录的xdelete(xphone)和手机卡通讯录的xdelete(xphone),如果未找到这个电话,则输出没找到这个电话,为了清晰可见,在调用函数前,加上了标题,让我们知道这个联系人是手机的还是手机卡的。
8.3.查询联系人
在主函数里输入3,就会调用User. inquiry(),在这个函数里,定义了一个通讯录抽象类的指针,我们是通过联系人电话来查询到联系人的,所有我们要先输入一个电话,当然,我们会提醒你让你输入一个电话的。接着,我们会输出一个菜单
如果输入1,则是查询手机通讯录,将指针指向了手机通讯录,调用了手机通讯录的inquiry(xphoen),如果未找到这个电话,则输出没找到这个电话。
如果输入2,则是查询手机卡通讯录,将指针指向了手机卡通讯录,调用了手机卡通讯录的inquiry(xphoen),如果未找到这个电话,则输出没找到这个电话。
如果输入3,则是两个通讯录都查询,所以,将指针先后指向了手机通讯录和手机卡通讯录,然后分别调用了手机通讯录的inquiry(xphone)和手机卡通讯录的inquiry(xphone),如果未找到这个电话,则输出没找到这个电话,为了清晰可见,在调用函数前,加上了标题,让我们知道这个联系人是手机的还是手机卡的。
如果输入其他的数,则会返回一开始,重新输入。
8.4.修改联系人
在主函数里输入4,就会调用User.change(),在这个函数里,定义了一个通讯录抽象类的指针,我们是通过联系人电话来查询到联系人然后修改的,所有我们要先输入一个电话,当然,我们会提醒你让你输入一个电话的。所以,将指针先后指向了手机通讯录和手机卡通讯录,然后分别调用了手机通讯录的change(xphone)和手机卡通讯录的change(xphone),如果未找到这个电话,则输出没找到这个电话,为了清晰可见,在调用函数前,加上了标题,让我们知道这个联系人是手机的还是手机卡的。
8.5.浏览联系人
在主函数里输入5,就会调用User. display(),在这个函数里,定义了一个通讯录抽象类的指针, 将指针先后指向了手机通讯录和手机卡通讯录,然后分别调用了手机通讯录的display()和手机卡通讯录的display(),如果通讯录里没有联系人,就输出无联系人。
8.6.移动与复制手机通讯录到手机卡通讯录
在主函数里输入6,然后提示你是选择移动还是复制
若输入1,就会调用User. pgoc(),查询手机的联系人的总数,如果小于0,则输出无联系人。反之,遍历手机联系人,每次遍历都要判断是否联系人达到1000,若达到1000,则结束。然后调用手机卡通讯录的copy(phonelist.getn(i), phonelist.getp(i));,将一个手机联系人的信息添加到手机卡通讯录中,这里的两个形参,是为了获取第i个联系人的姓名和电话。因为是转移,所以手机里的联系人要清空,所以最后调用手机的clear()函数,这个函数里面,直接调用vector的clear(),全清即可。
若输入2,就会调用User. pcopyc(),查询手机的联系人的总数,如果小于0,则输出无联系人。反之,遍历手机联系人,每次遍历都要判断是否联系人达到1000,若达到1000,则结束。然后调用手机卡通讯录的copy(phonelist.getn(i), phonelist.getp(i));,将一个手机联系人的信息添加到手机卡通讯录中,这里的两个形参,是为了获取第i个联系人的姓名和电话。
8.7.移动与复制手机卡通讯录到手机通讯录
在主函数里输入7,然后提示你是选择移动还是复制
若输入1,就会调用User. cgop(),查询手机卡的联系人的总数,如果小于0,则输出无联系人。反之,遍历手机卡联系人,每次遍历都要判断是否联系人达到1000,若达到1000,则结束。然后调用手机通讯录的copy(cardlist.getn(i), cardlist.getp(i));,将一个手机卡联系人的信息添加到手机通讯录中,这里的两个形参,是为了获取第i个联系人的姓名和电话。因为是转移,所以手机卡里的联系人要清空,所以最后调用手机卡的clear()函数,这个函数里面,直接调用vector的clear(),全清即可。
若输入2,就会调用User. ccopyp(),查询手机的联系人的总数,如果小于0,则输出无联系人。反之,遍历手机卡联系人,每次遍历都要判断是否联系人达到1000,若达到1000,则结束。然后调用手机通讯录的copy(cardlist.getn(i), cardlist.getp(i));,将一个手机卡联系人的信息添加到手机通讯录中,这里的两个形参,是为了获取第i个联系人的姓名和电话。
8.8.如果输入其他数字,则返回最初,重新输入。