手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机卡的联系人的信息只包含用户名和电话号码两项信息。存储在手机上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息
建立以下几个类:
1. 手机卡联系人类:表示一个联系人
数据成员包括:
姓名
电话号码
成员函数包括
带参并带默认值的构造函数
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
重载>>,<<运算符,完成对象的输入和输出操作
2. 手机联系人(继承于手机卡联系人类):
新增数据成员:
籍贯
QQ号
成员函数包括
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
重载>>,<<运算符,完成数据成员的输入输出操作
3. 定义一个通讯簿抽象类,用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数)
增加函数:增加一个联系人
删除操作:删除一个联系人
Display:显示所有联系人的信息
修改某一联系人的信息:
查询并显示某一联系人的信息:
4. 手机通讯簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息
数据成员包括:
手机联系人的数量
手机联系人对象数组
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数:增加一个联系人
删除操作:删除一个联系人
Display:显示所有联系人的信息
修改某一联系人的信息:
查询并显示某一联系人的信息:
5. 手机卡通信簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息
数据成员包括:
手机联系人的数量
手机联系人对象数组
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数:增加一个联系人
删除操作:删除一个联系人
Display:显示所有联系人的信息
修改某一联系人的信息:
查询并显示某一联系人的信息:
6. 用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理
数据成员包括:
两个通讯簿对象
成员函数包括(成员函数体现用户的行为):
添加联系人:利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通信簿)的增加函数完成联系人的添加。实现动态联编,体现出多态特点。(下同)
删除联系人:调用相应的通讯簿对象的删除操作删除一个联系人
Display:显示相应的通讯簿中联系人的信息
修改某一联系人的信息:调用通讯簿对象的函数完成操作
查询并显示某一联系人的信息:调用通讯簿对象的函数完成操作
将手机卡中的存储的联系人的信息移动到手机中
将手机中存储的联系人的信息移动到手机卡中
将手机卡中的存储的联系人的信息复制到手机中
将手机中存储的联系人的信息复制到手机卡中
7. 界面菜单类:用来给出操作提示
数据成员:可以不定义数据成员
成员函数:
Display函数:显示操作菜单的提示。说明:可以根据需要定义多个函数,显示不同的菜单(操作提示)。
这里
/*#include
#include
#include
#include
#include
#include
#include */
#include
using namespace std;
class Menu//界面菜单类
{
public:
void mainMenu();//主菜单
void newMenu();//新建菜单
void deleteMenu();//删除菜单
void modifyMenu();//修改菜单
void queryMenu();//查询菜单
void browseMenu();//浏览菜单
void archivedMenu();//转存菜单
};
void Menu::mainMenu() //主菜单
{
cout<<"**************************************"<<endl;
cout<<"*----------欢迎来到窝瓜的------------*"<<endl;
cout<<"*----------通讯录管理系统------------*"<<endl;
cout<<"**************************************"<<endl;
cout<<"*主菜单: *"<<endl;
cout<<"* 0.退出 *"<<endl;
cout<<"* 1.新建联系人 *"<<endl;
cout<<"* 2.删除联系人 *"<<endl;
cout<<"* 3.修改联系人 *"<<endl;
cout<<"* 4.查询联系人 *"<<endl;
cout<<"* 5.浏览联系人 *"<<endl;
cout<<"* 6.转存联系人 *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"请输入你的选择"<<'\n'<<endl;
}
void Menu::newMenu() //新建菜单
{
cout<<"**************************************"<<endl;
cout<<"*新建联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录 *"<<endl;
cout<<"* 2.手机卡通讯录 *"<<endl;
cout<<"* 3.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"新建联系人到那个通讯录?"<<"\n"<<endl;
}
void Menu::deleteMenu() //删除菜单
{
cout<<"**************************************"<<endl;
cout<<"*删除联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录 *"<<endl;
cout<<"* 2.手机卡通讯录 *"<<endl;
cout<<"* 3.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"删除哪个通讯录的联系人?"<<'\n'<<endl;
}
void Menu::modifyMenu() //修改菜单
{
cout<<"**************************************"<<endl;
cout<<"*修改联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯簿 *"<<endl;
cout<<"* 2.手机卡通讯簿 *"<<endl;
cout<<"* 3.手机和手机卡通讯簿 *"<<endl;
cout<<"* 4.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"修改哪个通讯簿联系人?"<<'\n'<<endl;
}
void Menu::queryMenu() //查询菜单
{
cout<<"**************************************"<<endl;
cout<<"*查询联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录 *"<<endl;
cout<<"* 2.手机卡通讯录 *"<<endl;
cout<<"* 3.手机通讯录和手机卡通讯录 *"<<endl;
cout<<"* 4.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"查询哪个通讯录的联系人?"<<'\n'<<endl;
}
void Menu::browseMenu() //浏览菜单
{
cout<<"**************************************"<<endl;
cout<<"*浏览联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录 *"<<endl;
cout<<"* 2.手机卡通讯录 *"<<endl;
cout<<"* 3.手机通讯录和手机卡通讯录 *"<<endl;
cout<<"* 4.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"浏览哪个通讯录的联系人?"<<'\n'<<endl;
}
void Menu::archivedMenu() //转存菜单
{
cout<<"**************************************"<<endl;
cout<<"*转存联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.将联系人信息从手机移动到手机卡上 *"<<endl;
cout<<"* 2.将联系人信息从手机卡移动到手机上 *"<<endl;
cout<<"* 3.将联系人信息从手机复制到手机卡上 *"<<endl;
cout<<"* 4.将联系人信息从手机卡复制到手机上 *"<<endl;
cout<<"* 5.返回上一级 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"请输入你的选择"<<'\n'<<endl;
}
class Phonecard_contact //手机卡联系人类
{
protected:
string name; //姓名
string pho_num; //电话
public:
Phonecard_contact(string tname="无姓名",string tpho_num="无号码")//有默认值的构造函数
{
name=tname;pho_num=tpho_num;
}
void Set(string tname,string tpho_num); //赋值
void modify(); //修改联系人信息
string getname();
string getpho_num();
friend istream&operator>>(istream &input,Phonecard_contact &);
friend ostream&operator<<(ostream &output,Phonecard_contact &);
};
void Phonecard_contact::Set(string tname,string tpho_num) //为数据成员赋值
{
name=tname;pho_num=tpho_num;
}
void Phonecard_contact::modify() //修改手机卡簿联系人信息
{
int a;
change1:
{
cout<<"**************************************"<<endl;
cout<<"*修改联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.修改联系人姓名 *"<<endl;
cout<<"* 2.修改联系人号码 *"<<endl;
cout<<"* 3.修改联系人全部信息 *"<<endl;
cout<<"* 4.返回上一级 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"修改联系人哪些信息?"<<'\n'<<endl;
cin>>a;
switch(a)
{
case 1:{
cout<<"请重新输入联系人姓名"<<endl;
cin>>name;
break;
}
case 2:{
cout<<"请重新输入联系人电话"<<endl;
cin>>pho_num;
break;
}
case 3:{
cout<<"请重新输入联系人姓名"<<endl;
cin>>name;
cout<<"请重新输入联系人电话"<<endl;
cin>>pho_num;
break;
}
case 4:{
return;//返回主菜单
}
default:{
cout<<"选择错误,请重新选择"<<endl;
goto change1;//回到change1,重新进行选择
}
}
}
}
string Phonecard_contact::getname() //获取姓名
{
return name;
}
string Phonecard_contact::getpho_num() //获取手机号
{
return pho_num;
}
istream&operator>>(istream &input,Phonecard_contact &obj) //重载运算符>>
{
cout<<"请输入联系人姓名"<<endl;
input>>obj.name;
cout<<"请输入联系人号码"<<endl;
input>>obj.pho_num;
return input;
}
ostream&operator<<(ostream &output,Phonecard_contact &obj) //重载运算符<<
{
output<<"联系人姓名:"<<obj.name<<endl;
output<<"联系人手机号:"<<obj.pho_num<<endl;
return output;
}
class Phone_contact:public Phonecard_contact//手机联系人类,继承手机卡联系人类
{
string nat_pla; //籍贯
string qq; //QQ
public:
Phone_contact(string tname="无姓名",string tpho_num="无号码",string tnat_pla="无籍贯",string tqq="无QQ"):Phonecard_contact(tname,tpho_num)//带默认值的构造函数
{
nat_pla=tnat_pla;qq=tqq;
}
void Set(string tname,string tpho_num,string tnat_pla,string tqq); //为数据成员赋值
void modify(); //修改手机簿联系人信息
string getnat_pla(); //获取籍贯
string getqq(); //获取QQ
friend istream&operator>>(istream &input,Phone_contact &); //重载运算符>>
friend ostream&operator<<(ostream &output,Phone_contact &); //重载运算符<<
};
void Phone_contact::Set(string tname,string tpho_num,string tnat_pla,string tqq)//为数据成员赋值
{
name=tname;pho_num=tpho_num;
nat_pla=tnat_pla;qq=tqq;
}
void Phone_contact::modify() //修改手机簿联系人信息
{
int a; //创建菜单类
change2: //方便引用goto
{
cout<<"**************************************"<<endl;
cout<<"*修改联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.修改联系人姓名 *"<<endl;
cout<<"* 2.修改联系人号码 *"<<endl;
cout<<"* 3.修改联系人籍贯 *"<<endl;
cout<<"* 4.修改联系人QQ *"<<endl;
cout<<"* 5.修改联系人全部信息 *"<<endl;
cout<<"* 6.返回上一级 *"<<endl;
cout<<"* *"<<endl;
cout<<"**************************************"<<endl;
cout<<'\n'<<"修改联系人哪些信息?"<<'\n'<<endl;
cin>>a;
switch(a)
{
case 1:{
//修改姓名
cout<<"请重新输入联系人姓名"<<endl;
cin>>name;
break;
}
case 2:{
//修改号码
cout<<"请重新输入联系人号码"<<endl;
cin>>pho_num;
break;
}
case 3:{
//修改籍贯
cout<<"请重新输入联系人籍贯"<<endl;
cin>>nat_pla;
break;
}
case 4:{
//修改QQ
cout<<"请重新输入联系人QQ"<<endl;
cin>>qq;
break;
}
case 5:{
//全部修改
cout<<"请重新输入联系人姓名"<<endl;
cin>>name;
cout<<"请重新输入联系人号码"<<endl;
cin>>pho_num;
cout<<"请重新输入联系人籍贯"<<endl;
cin>>nat_pla;
cout<<"请重新输入联系人QQ"<<endl;
cin>>qq;
break;
}
case 6:{
//返回主菜单
return;
}
default:{
//错误输入
cout<<"选择错误,请重新选择"<<endl;
goto change2; //回到change2
}
}
}
}
string Phone_contact::getnat_pla() //获取籍贯
{
return nat_pla;
}
string Phone_contact::getqq() //获取QQ
{
return qq;
}
istream&operator>>(istream &input,Phone_contact &obj) //重载运算符>>
{
cout<<"请输入联系人姓名"<<endl;
input>>obj.name;
cout<<"请输入联系人号码"<<endl;
input>>obj.pho_num;
cout<<"请输入联系人籍贯"<<endl;
input>>obj.nat_pla;
cout<<"请输入联系人QQ"<<endl;
input>>obj.qq;
return input;
}
ostream&operator<<(ostream &output,Phone_contact &obj) //重载运算符<<
{
output<<"联系人姓名:"<<obj.name<<endl;
output<<"联系人号码:"<<obj.pho_num<<endl;
output<<"联系人籍贯:"<<obj.nat_pla<<endl;
output<<"联系人QQ:"<<obj.qq<<endl;
return output;
}
class Address_book //通讯簿类,都设置成纯虚函数
{
public:
virtual void newcontact()=0; //新建联系人
virtual void deletecontact(string tpho_num)=0; //删除联系人信息
virtual void modify(string tpho_num)=0; //修改联系人信息
virtual void query(string tname)=0; //查询联系人信息
virtual void browse()=0; //显示所有联系人信息
};
class Phone_address_book:public Address_book //手机通讯簿类,继承Address_book类
{
protected:
int phone_contact_num; //手机通讯簿中联系人个数
vector<Phone_contact>phone_contact; //利用动态数组储存联系人信息
public:
Phone_address_book(); //构造
~Phone_address_book(); //析构
void newcontact(); //新建联系人到手机簿
void deletecontact(string tpho_num); //删除手机簿上的联系人
void modify(string tpho_num); //修改手机簿上联系人信息
void query(string tname); //查询手机簿上联系人
void browse(); //显示手机簿上所有联系人
int getphone_contact_num(); //获取手机簿上联系人个数
void copy(string tname,string tpho_num); //将姓名,号码压入动态数组phone_contact
string getname(int i); //获取姓名
string getpho_num(int i); //获取号码
void clear(); //清除手机通讯簿
};
Phone_address_book::Phone_address_book() //构造函数,读取文本文件的信息,并创造联系人对象数组
{
ifstream ist("手机.txt"); //打开文件
if(!ist)
{
cout<<"未找到手机.txt文件"<<endl;
return;
}
char str[80];
ist.getline(str,80);
ist.getline(str,80); //将光标移到下一行
ist.getline(str,80);
ist.getline(str,80);
phone_contact_num=-1; //数组存储从0开始,所以令初值为-1
string tname,tpho_num,tnat_ple,tqq;
while(ist>>tname>>tpho_num>>tnat_ple>>tqq) //读取文件中联系人的姓名 号码 籍贯和QQ
{
Phone_contact temp;
temp.Set(tname,tpho_num,tnat_ple,tqq);
phone_contact.push_back(temp); //利用动态数组储存联系人信息
phone_contact_num++; //联系人个数
}
ist.close(); //关闭文件
}
Phone_address_book::~Phone_address_book() //析构函数,将对象数组的内容写入文本文件
{
ofstream ost("手机.txt"); //打开文件
ost<<"**************************************************"<<endl;
ost<<"* 手机联系人 *"<<endl;
ost<<"**************************************************"<<endl;
//ost<<"姓名"<<'\t'<<'\t'<<"号码"<<'\t'<<'\t'<<"籍贯"<<'\t'<<'\t'<<"QQ"<<'\t'<<'\t'<
ost.setf(ios::left);
ost.width(16);
ost<<"姓名";
ost.width(16);
ost<<"号码";
ost.width(16);
ost<<"籍贯";
ost.width(16);
ost<<"QQ"<<endl;
for(int i=0;i<=phone_contact_num;i++) //将对象数组的内容写入文本文件
{
ost.setf(ios::left); //格式控制,左对齐
ost.width(16); //设置宽度为16,两个'\t'的长度
ost<<phone_contact[i].getname(); //输出姓名
ost.width(16);
ost<<phone_contact[i].getpho_num(); //输出号码
ost.width(16);
ost<<phone_contact[i].getnat_pla(); //输出籍贯
ost.width(16);
ost<<phone_contact[i].getqq(); //输出QQ
ost<<endl;
//ost<
}
phone_contact_num=-1; //手机联系人人数归-1
phone_contact.clear(); //将动态数组容器清空
ost.close(); //关闭文件
}
void Phone_address_book::newcontact() //新建联系人
{
if(phone_contact_num>=1000) //判断手机内存大小
{
cout<<"手机通讯簿内存已满。"<<endl;
cout<<"请重新选择操作。"<<endl;
return ;
}
else
{
Phone_contact temp; //建立手机联系人类
cin>>temp;
phone_contact.push_back(temp); //将信息压入动态数组
phone_contact_num++; //人数加1
cout<<"新建联系人成功。"<<endl;
}
}
void Phone_address_book::deletecontact(string tpho_num) //删除联系人
{
if(phone_contact_num<0) //判断是否有联系人
{
cout<<"手机通讯部内无联系人,请重新选择操作。"<<endl;
return ;
}
else
{
bool flag=false; //判断是否找到目标联系人
for(int i=0;i<=phone_contact_num;i++) //遍历
{
if(phone_contact[i].getpho_num()==tpho_num) //找到目标联系人
{
flag=true; //找到目标联系人
cout<<"要删除的联系人信息是:"<<endl;
cout<<phone_contact[i];
cout<<"是否删除该联系人"<<endl;
cout<<"1.确定删除"<<'\n'<<"2.取消删除"<<endl;
int sign;
cin>>sign;
if(sign==1) //删除目标联系人
{
phone_contact.erase(phone_contact.begin()+i);
phone_contact_num--;
cout<<"删除成功!"<<endl;
}
else
{
continue;
}
}
}
if(!flag)
{
cout<<"手机通讯簿中无该联系人,请重新选择操作。"<<endl;
return ;
}
}
}
void Phone_address_book::modify(string tpho_num) //修改联系人
{
if(phone_contact_num<0) //判断是否有联系人
{
cout<<"手机通讯簿无联系人,请重新选择。"<<endl;
return ;
}
else
{
bool flag=false; //判断是否找到目标联系人
for(int i=0;i<=phone_contact_num;i++) //遍历
{
if(phone_contact[i].getpho_num()==tpho_num)//找到目标联系人
{
flag=true; //找到目标联系人
cout<<"要修改的联系人信息是:"<<endl;
cout<<phone_contact[i];
cout<<"是否修改该联系人"<<endl;
cout<<"1.确定修改"<<'\n'<<"2.取消修改"<<endl;
int sign;
cin>>sign;
if(sign==1)
{
phone_contact[i].modify(); //进行目标联系人的信息修改
cout<<"修改成功"<<endl;
return;
}
else continue;
}
}
if(!flag)
{
cout<<"手机通讯簿中无该联系人,请重新选择。"<<endl;
return;
}
}
}
void Phone_address_book::query(string tname) //查询联系人
{
if(phone_contact_num<0) //判断手机通讯簿是否有联系人
{
cout<<"手机通讯簿无联系人,请重新选择。"<<endl;
return;
}
else
{
bool flag=false; //判断手机通讯簿是否有该联系人
for(int i=0;i<=phone_contact_num;i++) //遍历
{
if(phone_contact[i].getname()==tname) //标记有该联系人,并输出
{
flag=true;
cout<<"目标联系人信息"<<endl;
cout<<phone_contact[i];
return ;
}
}
if(!flag) //判断是否有该联系人
{
cout<<"手机通讯簿中无该人信息,请重新选择。"<<endl;
return;
}
}
}
void Phone_address_book::browse() //显示联系人
{
if(phone_contact_num<0) //判断手机通讯簿是否有联系人
{
cout<<"手机通讯簿无联系人信息,请重新选择。"<<endl;
return;
}
else //信息输出
{
cout<<"手机通讯簿中有联系人个数:"<<phone_contact_num+1<<endl;//输出个数
cout<<"信息如下:"<<endl;
vector<Phone_contact>::iterator temp; //phone_contact类型的指针
for(temp=phone_contact.begin();temp!=phone_contact.end();temp++)//遍历
{
cout<<(*temp);
cout<<endl;
}
}
}
int Phone_address_book::getphone_contact_num() //获取联系人个数
{
return phone_contact_num;
}
void Phone_address_book::copy(string tname,string tpho_num)//将目标姓名 号码压入动态数组
{
for(int i=0;i<=phone_contact_num;i++) //遍历
{
if(phone_contact[i].getname()==tname&&phone_contact[i].getpho_num()==tpho_num)
{
cout<<"姓名为;"<<tname<<"号码为:"<<tpho_num<<"的用户已存在!"<<endl;
return;}
}
Phone_contact temp(tname,tpho_num,"无籍贯","无QQ");//建立临时对象
phone_contact.push_back(temp); //压入动态数组
phone_contact_num++; //人数+1
cout<<"姓名为:"<<tname<<"号码为:"<<tpho_num<<"的用户已存储完!"<<endl;
}
string Phone_address_book::getname(int i) //获取手机通讯簿中第i个联系人姓名
{
return phone_contact[i].getname();
}
string Phone_address_book::getpho_num(int i) //获取手机通讯簿中第i个联系人号码
{
return phone_contact[i].getpho_num();
}
void Phone_address_book::clear() //手机通讯簿清空
{
phone_contact.clear(); //动态数组清空
phone_contact_num=-1; //人数归为-1
}
class Phonecard_address_book:public Address_book //手机卡通讯簿类,继承Address_book类
{
protected:
int phonecard_contact_num; //手机卡通讯簿中联系人个数
vector<Phonecard_contact>phonecard_contact; //利用动态数组储存联系人信息
public:
Phonecard_address_book(); //构造
~Phonecard_address_book(); //析构
void newcontact(); //新建联系人到手机卡簿
void deletecontact(string tpho_num); //删除手机卡簿上的联系人
void modify(string tpho_num); //修改手机卡簿上联系人信息
void query(string tname); //查询手机卡簿上联系人
void browse(); //显示手机卡簿上所有联系人
int getphonecard_contact_num(); //获取手机卡簿上联系人个数
void copy(string tname,string tpho_num); //将姓名,号码压入动态数组phonecard_contact
string getname(int i); //获取姓名
string getpho_num(int i); //获取号码
void clear(); //清除手机卡通讯簿
};
Phonecard_address_book::Phonecard_address_book() //构造函数,读取文本文件的信息,并创造联系人对象数组
{
ifstream ist("手机卡.txt"); //打开文件
if(!ist)
{
cout<<"未找到手机卡.txt文件"<<endl;
return;
}
char str[80];
ist.getline(str,80);
ist.getline(str,80); //将光标移到下一行
ist.getline(str,80);
ist.getline(str,80);
phonecard_contact_num=-1; //数组存储从0开始,所以令初值为-1
string tname,tpho_num,tnat_ple,tqq;
while(ist>>tname>>tpho_num) //读取文件中联系人的姓名和号码
{
Phonecard_contact temp;
temp.Set(tname,tpho_num);
phonecard_contact.push_back(temp); //利用动态数组储存联系人信息
phonecard_contact_num++; //联系人个数
}
ist.close(); //关闭文件
}
Phonecard_address_book::~Phonecard_address_book() //析构函数,将对象数组的内容写入文本文件
{
ofstream ost("手机卡.txt"); //打开文件
ost<<"*********************************************"<<endl;
ost<<"* 手机卡联系人 *"<<endl;
ost<<"*********************************************"<<endl;
//ost<<"姓名"<<'\t'<<'\t'<<"号码"<<'\t'<<'\t'<
ost.setf(ios::left);
ost.width(16);
ost<<"姓名";
ost.width(16);
ost<<"号码"<<endl;
for(int i=0;i<=phonecard_contact_num;i++) //将对象数组的内容写入文本文件
{
ost.setf(ios::left); //格式控制,左对齐
ost.width(16); //设置宽度为16,两个'\t'的长度
ost<<phonecard_contact[i].getname(); //输出姓名
ost.width(16);
ost<<phonecard_contact[i].getpho_num();
ost<<endl; //输出号码
//ost<
}
phonecard_contact_num=-1; //手机卡联系人人数归-1
phonecard_contact.clear(); //将动态数组容器清空
ost.close(); //关闭文件
}
void Phonecard_address_book::newcontact() //新建联系人
{
if(phonecard_contact_num>=1000) //判断手机卡内存大小
{
cout<<"手机卡通讯簿内存已满。"<<endl;
cout<<"请重新选择操作。"<<endl;
return ;
}
else
{
Phonecard_contact temp; //建立手机卡联系人类
cin>>temp;
phonecard_contact.push_back(temp); //将信息压入动态数组
phonecard_contact_num++; //人数加1
cout<<"新建联系人成功。"<<endl;
}
}
void Phonecard_address_book::deletecontact(string tpho_num) //删除联系人
{
if(phonecard_contact_num<0) //判断是否有联系人
{
cout<<"手机卡通讯簿内无联系人,请重新选择操作。"<<endl;
return ;
}
else
{
bool flag=false; //判断是否找到目标联系人
for(int i=0;i<=phonecard_contact_num;i++) //遍历
{
if(phonecard_contact[i].getpho_num()==tpho_num) //找到目标联系人
{
flag=true; //找到目标联系人
cout<<"要删除的联系人信息是:"<<endl;
cout<<phonecard_contact[i];
cout<<"是否删除该联系人"<<endl;
cout<<"1.确定删除"<<'\n'<<"2.取消删除"<<endl;
int sign;
cin>>sign;
if(sign==1) //删除目标联系人
{
phonecard_contact.erase(phonecard_contact.begin()+i);
phonecard_contact_num--;
cout<<"删除成功!"<<endl;
}
else
{
continue;
}
}
}
if(!flag)
{
cout<<"手机卡通讯簿中无该联系人,请重新选择操作。"<<endl;
return ;
}
}
}
void Phonecard_address_book::modify(string tpho_num) //修改联系人
{
if(phonecard_contact_num<0) //判断是否有联系人
{
cout<<"手机卡通讯簿无联系人,请重新选择。"<<endl;
return ;
}
else
{
bool flag=false; //判断是否找到目标联系人
for(int i=0;i<=phonecard_contact_num;i++) //遍历
{
if(phonecard_contact[i].getpho_num()==tpho_num)//找到目标联系人
{
flag=true; //找到目标联系人
cout<<"要修改的联系人信息是:"<<endl;
cout<<phonecard_contact[i];
cout<<"是否修改该联系人"<<endl;
cout<<"1.确定修改"<<'\n'<<"2.取消修改"<<endl;
int sign;
cin>>sign;
if(sign==1)
{
phonecard_contact[i].modify(); //进行目标联系人的信息修改
cout<<"修改成功"<<endl;
return;
}
else continue;
}
}
if(!flag)
{
cout<<"手机卡通讯簿中无该联系人,请重新选择。"<<endl;
return;
}
}
}
void Phonecard_address_book::query(string tname) //查询联系人
{
if(phonecard_contact_num<0) //判断手机通讯簿是否有联系人
{
cout<<"手机卡通讯簿无联系人,请重新选择。"<<endl;
return;
}
else
{
bool flag=false; //判断手机通讯簿是否有该联系人
for(int i=0;i<=phonecard_contact_num;i++) //遍历
{
if(phonecard_contact[i].getname()==tname) //标记有该联系人,并输出
{
flag=true;
cout<<"目标联系人信息"<<endl;
cout<<phonecard_contact[i];
return ;
}
}
if(!flag) //判断是否有该联系人
{
cout<<"手机卡通讯簿中无该人信息,请重新选择。"<<endl;
return;
}
}
}
void Phonecard_address_book::browse() //显示联系人
{
if(phonecard_contact_num<0) //判断手机卡通讯簿是否有联系人
{
cout<<"手机卡通讯簿无联系人信息,请重新选择。"<<endl;
return;
}
else //信息输出
{
cout<<"手机卡通讯簿中有联系人个数:"<<phonecard_contact_num+1<<endl;//输出个数
cout<<"信息如下:"<<endl;
vector<Phonecard_contact>::iterator temp; //phone_contact类型的指针
for(temp=phonecard_contact.begin();temp!=phonecard_contact.end();temp++)//遍历
{
cout<<(*temp);
cout<<endl;
}
}
}
int Phonecard_address_book::getphonecard_contact_num() //获取联系人个数
{
return phonecard_contact_num;
}
void Phonecard_address_book::copy(string tname,string tpho_num)//将目标姓名 号码压入动态数组
{
for(int i=0;i<=phonecard_contact_num;i++) //遍历
{
//cout<
if(phonecard_contact[i].getname()==tname&&phonecard_contact[i].getpho_num()==tpho_num)
{
cout<<"姓名为:"<<tname<<"号码为:"<<tpho_num<<"的用户已存在!"<<endl;
return;}
}
Phonecard_contact temp; //建立临时对象
temp.Set(tname,tpho_num);
phonecard_contact.push_back(temp); //压入动态数组
phonecard_contact_num++; //人数+1
cout<<"姓名为;"<<tname<<"号码为:"<<tpho_num<<"的用户已存储完!"<<endl;
}
string Phonecard_address_book::getname(int i) //获取手机卡通讯簿中第i个联系人姓名
{
return phonecard_contact[i].getname();
}
string Phonecard_address_book::getpho_num(int i) //获取手机卡通讯簿中第i个联系人号码
{
return phonecard_contact[i].getpho_num();
}
void Phonecard_address_book::clear() //手机卡通讯簿清空
{
phonecard_contact.clear(); //动态数组清空
phonecard_contact_num=-1; //人数归为-1
}
class User
{
Phone_address_book phone_address_book;
Phonecard_address_book phonecard_address_book;
Menu menu;
public:
User(); //构造
~User(); //析构
void New(); //新建联系人
void Delete(); //删除联系人
void modify(); //修改联系人信息
void query(); //查询联系人信息
void browse(); //显示全部联系人信息
void move_card_to_phone(); //将手机卡通讯簿的联系人转移到手机通讯簿上
void move_phone_to_card(); //将手机通讯簿的联系人转移到手机卡通讯簿上
void copy_card_to_phone(); //复制手机卡通讯簿联系人信息到手机通讯簿上
void copy_phone_to_card(); //复制手机通讯簿联系人信息到手机卡通讯簿上
};
User::User() //构造函数,实现用户友好型
{
cout<<"**********************************"<<endl;
cout<<"* 欢迎来到窝瓜的 *"<<endl;
cout<<"* 通讯录管理系统 *"<<endl;
cout<<"*--------------------------------*"<<endl;
cout<<"*当前联系人个数: *"<<endl;
cout<<"* 手机通讯簿上有"<<phone_address_book.getphone_contact_num()+1<<"个联系人 *"<<endl;
cout<<"* 手机卡通讯簿上有"<<phonecard_address_book.getphonecard_contact_num()+1<<"个联系人 *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************"<<endl;
cout<<'\n'<<endl;
system("pause");
}
User::~User() //析构函数,实现用户友好型
{
cout<<"**********************************"<<endl;
cout<<"* 感谢使用窝瓜的 *"<<endl;
cout<<"* 通讯录管理系统 *"<<endl;
cout<<"*--------------------------------*"<<endl;
cout<<"*当前联系人个数: *"<<endl;
cout<<"* 手机通讯簿上有"<<phone_address_book.getphone_contact_num()+1<<"个联系人 *"<<endl;
cout<<"* 手机卡通讯簿上有"<<phonecard_address_book.getphonecard_contact_num()+1<<"个联系人 *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************"<<endl;
cout<<'\n'<<endl;
system("pause"); //冻解屏幕,便于观察程序的执行结果
system("cls"); //清屏
}
void User::New() //新建联系人
{
change3:{
system("cls");
menu.newMenu(); //引用菜单类的新建菜单
Address_book *temp; //创建指向通讯簿类的指针
int sign; //进行选择
cin>>sign;
switch(sign)
{
case 1:{
//新建联系人到手机通讯簿
temp=&phone_address_book;//指针指向手机通讯簿对象
temp->newcontact();//调用手机通讯簿的新建联系人函数
break;
}
case 2:{
//新建联系人到手机卡通讯簿
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->newcontact();//调用手机卡通讯簿的新建联系人函数
break;
}
case 3:{
//返回上一级
return;
}
default:{
//输入错误
cout<<"输入有误,请重新选择。"<<endl;
system("pause");
goto change3;//重新选择
}
}
}
}
void User::Delete() //删除联系人
{
change4:{
system("cls");
menu.deleteMenu(); //调用菜单类的删除菜单
Address_book *temp; //创建指向通讯簿类的指针
int sign; //用户进行选择
cin>>sign;
string tpho_num;
switch(sign)
{
case 1:{
//删除手机通讯簿的联系人
cout<<"请输入要删除的联系人号码"<<endl;
cin>>tpho_num;
temp=&phone_address_book;//指针指向手机通讯簿
temp->deletecontact(tpho_num);//调用删除函数
break;
}
case 2:{
//删除手机卡通讯簿的联系人
cout<<"请输入要删除的联系人号码"<<endl;
cin>>tpho_num;
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->deletecontact(tpho_num);//调用删除函数
break;
}
case 3:{
//返回上一级
return;
}
default:{
//输入错误
cout<<"输入有误,请重新选择。"<<endl;
system("pause");
goto change4;
}
}
}
}
void User::modify() //修改联系人信息
{
change5:{
system("cls");
Address_book *temp; //创建指向通讯簿类的指针
menu.modifyMenu(); //调用菜单类的修改函数
int sign;
cin>>sign;
string tpho_num;
switch(sign){
case 1:{
//修改手机通讯簿联系人信息
cout<<"请输入要修改联系人的号码。"<<endl;
cin>>tpho_num;
temp=&phone_address_book;//指针指向手机通讯簿
temp->modify(tpho_num);//调用修改函数
break;
}
case 2:{
//修改手机卡通讯簿联系人信息
cout<<"请输入要修改联系人的号码。"<<endl;
cin>>tpho_num;
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->modify(tpho_num);//调用修改函数
break;
}
case 3:{
//同时修改手机和手机卡通讯簿中联系人信息
cout<<"请输入要修改联系人的号码。"<<endl;
cin>>tpho_num;
cout<<"--------------手机通讯簿------------"<<endl;
temp=&phone_address_book;//指针指向手机通讯簿
temp->modify(tpho_num);
cout<<"-------------手机卡通讯簿-----------"<<endl;
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->modify(tpho_num);
break;
}
case 4:{
//返回上一级
return;
}
default:{
//输入错误
cout<<"输入有误,请重新输入。"<<endl;
system("pause");
goto change5;
}
}
}
}
void User::query() //查询联系人信息
{
change6:
{
system("cls");
menu.queryMenu(); //调用菜单类的查询函数
Address_book *temp; //创建指向通讯簿的指针
int sign;
string tname;
cin>>sign;
switch(sign)
{
case 1:{
//查询手机通讯簿中联系人信息
cout<<"请输入要查询的联系人姓名"<<endl;
cin>>tname;
temp=&phone_address_book;//指针指向手机通讯簿
temp->query(tname);//调用查询函数
break;
}
case 2:{
//查询手机卡通讯簿中联系人信息
cout<<"请输入要查询的联系人姓名"<<endl;
cin>>tname;
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->query(tname);//调用查询函数
break;
}
case 3:{
//查询手机和手机卡通讯簿中联系人信息
cout<<"请输入要查询的联系人姓名"<<endl;
cin>>tname;
cout<<"--------------手机通讯簿------------"<<endl;
temp=&phone_address_book;//指针指向手机通讯簿
temp->query(tname);//调用查询函数
cout<<"-------------手机卡通讯簿-----------"<<endl;
temp=&phonecard_address_book;//指针指向手机卡通讯簿
temp->query(tname);//调用查询函数
break;
}
case 4:{
//返回上一级
return;
}
default:{
//输入有误
cout<<"输入有误,请重新输入。"<<endl;
goto change6;
}
}
}
}
void User::browse() //显示联系人信息
{
change7:
{
system("cls");
menu.browseMenu(); //调用菜单浏览函数
Address_book *temp; //创建指向通讯簿的指针
int sign;
cin>>sign;
switch(sign)
{
case 1:{
//显示手机通讯簿中的联系人信息
cout<<"--------------手机通讯簿------------"<<endl;
temp=&phone_address_book;//指向手机通讯簿
temp->browse();
break;
}
case 2:{
//显示手机卡通讯簿中联系人信息
cout<<"-------------手机卡通讯簿-----------"<<endl;
temp=&phonecard_address_book;//只想手机卡通讯簿
temp->browse();
break;
}
case 3:{
//显示手机和手机卡通讯簿中联系人信息
cout<<"--------------手机通讯簿------------"<<endl;
temp=&phone_address_book;
temp->browse();
cout<<"-------------手机卡通讯簿-----------"<<endl;
temp=&phonecard_address_book;
temp->browse();
break;
}
case 4:{
//返回上一级
return;
}
default:{
//输入有误
cout<<"输入有误,请重新输入。"<<endl;
system("pause");
goto change7;
}
}
}
}
void User::move_phone_to_card() //将手机通讯簿中的联系人转移到手机卡通讯簿上
{
if(phone_address_book.getphone_contact_num()<0)//判断手机通讯簿中有无联系人
{
cout<<"手机通讯簿内无联系人。"<<endl;
return;
}
else
{
for(int i=0;i<=phone_address_book.getphone_contact_num();i++)//遍历手机通讯簿联系人
{
if(phonecard_address_book.getphonecard_contact_num()>=1000)//判断手机卡通讯簿内存是否已满
{
cout<<"手机卡通讯簿容量已满。"<<endl;
return;
}
phonecard_address_book.copy(phone_address_book.getname(i),phone_address_book.getpho_num(i));
}
phone_address_book.clear();//手机通讯簿清空
cout<<"移动成功。"<<endl;
}
}
void User::move_card_to_phone() //将手机卡通讯簿中的联系人转移到手机通讯簿上
{
if(phonecard_address_book.getphonecard_contact_num()<0)//判断手机卡通讯簿中有无联系人
{
cout<<"手机卡通讯簿内无联系人。"<<endl;
return;
}
else
{
for(int i=0;i<=phonecard_address_book.getphonecard_contact_num();i++)//遍历手机卡通讯簿
{
if(phone_address_book.getphone_contact_num()>=1000)//判断手机通讯簿内存是否已满
{
cout<<"手机通讯簿容量已满。"<<endl;
return;
}
phone_address_book.copy(phonecard_address_book.getname(i),phonecard_address_book.getpho_num(i));
}
phonecard_address_book.clear();//手机卡通讯簿清空
cout<<"移动成功。"<<endl;
}
}
void User::copy_phone_to_card() //将手机通讯簿中的联系人复制到手机卡通讯簿上
{
//cout<
if(phone_address_book.getphone_contact_num()<0)//判断手机通讯簿中有无联系人
{
cout<<"手机通讯簿内无联系人。"<<endl;
return;
}
else
{
for(int i=0;i<=phone_address_book.getphone_contact_num();i++)//遍历手机通讯簿联系人
{
//cout<
if(phonecard_address_book.getphonecard_contact_num()>=1000)//判断手机卡通讯簿内存是否已满
{
cout<<"手机卡通讯簿容量已满。"<<endl;
return;
}
phonecard_address_book.copy(phone_address_book.getname(i),phone_address_book.getpho_num(i));
}
cout<<"复制成功。"<<endl;
}
}
void User::copy_card_to_phone() //将手机卡通讯簿中的联系人复制到手机通讯簿上
{
if(phonecard_address_book.getphonecard_contact_num()<0)//判断手机卡通讯簿中有无联系人
{
cout<<"手机卡通讯簿内无联系人。"<<endl;
return;
}
else
{
for(int i=0;i<=phonecard_address_book.getphonecard_contact_num();i++)//遍历手机卡通讯簿
{
if(phone_address_book.getphone_contact_num()>=1000)//判断手机通讯簿内存是否已满
{
cout<<"手机通讯簿容量已满。"<<endl;
return;
}
phone_address_book.copy(phonecard_address_book.getname(i),phonecard_address_book.getpho_num(i));
}
cout<<"复制成功。"<<endl;
}
}
int main()
{
User user;
Menu menu;
int sign=1;
while(sign!=0)
{
change8:{
system("cls"); //清屏
menu.mainMenu(); //调用菜单类中的主菜单函数
cin>>sign; //用户进行选择
switch(sign)
{
case 1:{
//新建联系人
user.New();
goto change8;
}
case 2:{
//删除联系人
user.Delete();
goto change8;
}
case 3:{
//修改联系人
user.modify();
system("pause");
goto change8;
}
case 4:{
//查询联系人
user.query();
system("pause");
goto change8;
}
case 5:{
//显示联系人
user.browse();
system("pause");
goto change8;
}
case 6:{
//转存联系人
change9:{
system("cls");
int n;
menu.archivedMenu();
cin>>n;
switch(n)
{
case 1:{
//手机通讯簿信息移动到手机卡通讯簿
user.move_phone_to_card();
system("pause");
goto change8;
}
case 2:{
//手机卡通讯簿信息移动到手机通讯簿
user.move_card_to_phone();
system("pause");
goto change8;
}
case 3:{
//手机通讯簿信息复制到手机卡通讯簿
user.copy_phone_to_card();
system("pause");
goto change8;
}
case 4:{
//手机卡通讯簿信息复制到手机通讯簿
user.copy_card_to_phone();
system("pause");
goto change8;
}
case 5:{
//返回上一级
goto change8;
}
default:{
//输入有误
cout<<"输入有误,请重新输入。"<<endl;
system("pause");
goto change9;
}
}
}
}
case 0:{
//退出
//system("pause");//退出时暂停可有可无
system("cls");
break;
}
default:{
//输入有误
cout<<"输入有误,请重新输入"<<endl;
system("pause");
goto change8;
}
}
}
}
return 0;
}
前前后后花了有五天的时间来完成,完成这次程设作业的心情也挺复杂的,怎么说?就是一开始吧,找不到思路那么大一个工程也不知道从哪里下手,这时候挺失望的,学了一个年的东西啦,用的时候不会用啦。其实我一开始没有注意老师的总结就自己去写了写,不是很自信的又看了看题目,大体的构架都有啦,各个类的关系也十分清楚,也借鉴了一下往届学长们的思路所以在写的过程中虽然有小的问题,但整体下来还是比较顺利的。所谓一波三折,都写完后,并没有按我想象的进行,各种bug扑面而来。最后改完错,感觉自己都可以飞起来啦,真的舒服啦。
当然这次作业学到的东西还是很多的。清屏sysytem(“cls”)老师也提到过,但是经过我的多次试验后,才熟练的用到了它,因为清屏会将屏幕内容清空,但是可能会有一些输出的内容我们还没有看就已经清屏啦,这时候我们就需要system(“pause”)来暂停程序,方便观察清屏前的输出结果。还有一个就是txt文件一行64个字符,有一个写的长了就使联系人无法储存,在这错误还是我不经意见发现的,想着getline(str,80)为什么是80那,我就查了查,这才发现。再有就是vector啦,动态数组其实以前就有看过,但是用的也不多,正好这次使用来温习一下。还有就是和同学交流发现VC6.0中重载流提取和流插入运算符要把#include using namespacestd;改为#include