通讯录管理系统
手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含用户名和电话号码两项信息。存储在电话卡上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。
要求:
1. 创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的存储的联系人的信息)。
2. 以菜单方式工作(字符界面即可)
3. 存储在手机上的联系人的信息包括:姓名和电话号码;存储在手机卡上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
4. 管理系统的功能包括:
a) 新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中)
b) 删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
c) 修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
d) 查询:根据名字查询联系人信息(查询结果不唯一)
e) 浏览:显示所有联系人的信息
f) 将联系人的信息从手机转存到手机卡上(同时要避免重复数据的存在。并且在转存是要检查容量是否受限。下同。)
g) 将联系人的信息从手机卡上准存到手机上(同时要避免重复数据的存在)
5. 要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点
6. 提交程序源码和课程设计报告。
7. 课程设计评分说明:实现功能:通过;使用了继承技术:中;实现了运算符的重载:良;支持多态:优
实现过程分析:
建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息
建立以下几个类:
1. 手机联系人类:表示一个联系人 --phone contact
数据成员包括:
姓名
电话号码
成员函数包括
带参并带默认值的构造函数
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
重载>>,<<运算符,完成对象的输入和输出操作
2. 手机卡联系人(继承于手机联系人类): --card contact
新增数据成员:
籍贯
QQ号
成员函数包括
一组set函数为数据成员赋值
一组modify函数,修改数据成员的值
重载>>,<<运算符,完成数据成员的输入输出操作
3. 定义一个通讯簿抽象类,用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数) ---address
增加函数:增加一个联系人 ---new1
删除操作:删除一个联系人 ---dele
Display:显示所有联系人的信息 ---show_all
修改某一联系人的信息: ---xiugai
查询并显示某一联系人的信息:---show_one
4. 手机通讯簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息 ---phone_address
数据成员包括:
手机联系人的数量
手机联系人对象数组
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数:增加一个联系人
删除操作:删除一个联系人
Display:显示所有联系人的信息
修改某一联系人的信息:
查询并显示某一联系人的信息:
5. 手机卡通信簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息 ---card_address
数据成员包括:
手机联系人的数量
手机联系人对象数组
成员函数包括
构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组
析构函数:将对象数组中的内容写入到文本文件中。
增加函数:增加一个联系人
删除操作:删除一个联系人
Display:显示所有联系人的信息
修改某一联系人的信息:
查询并显示某一联系人的信息:
6. 用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理
数据成员包括:
两个通讯簿对象
成员函数包括(成员函数体现用户的行为):
添加联系人:利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通信簿)的增加函数完成联系人的添加。实现动态联编,体现出多态特点。(下同)
删除联系人:调用相应的通讯簿对象的删除操作删除一个联系人
Display:显示相应的通讯簿中联系人的信息
修改某一联系人的信息:调用通讯簿对象的函数完成操作
查询并显示某一联系人的信息:调用通讯簿对象的函数完成操作
将手机卡中的存储的联系人的信息移动到手机中
将手机中存储的联系人的信息移动到手机卡中
将手机卡中的存储的联系人的信息复制到手机中
将手机中存储的联系人的信息复制到手机卡中
7. 界面菜单类:用来给出操作提示
数据成员:可以不定义数据成员
成员函数:
Display函数:显示操作菜单的提示。说明:可以根据需要定义多个函数,显示不同的菜单(操作提示)。
---------------------------------------------------------------------------------------------------------------------
问题:
1. 一步一保存的保存函数有问题的;
2. 修改函数没有弄成循环形式;
3. 每一步都有操作成功。可以在一开始的 那个函数中判断输出“操作成功”或者“找不到联系人”;
4. 需要添加功能,查找函数不能只用名字来查找;
5. 操作框实际上挺好看的
#include<iostream>
#include<cstring>
#include<fstream>
#include<iomanip>
using namespace std;
void mo();
void tianjia();
void shanchu();
void all_xianshi();
void xg();
void chazhao();
///1.
class card_contact;
class phone_contact
{
protected:
char name[100];
char p_number[12];
public:
phone_contact(char a[100]="\0",char b[12]="\0")
{
strcpy(name,a);
strcpy(p_number,b);
}
void set_p()
{
cin>>name>>p_number;
}
void modify_p()
{
cout<<"请输入要修改的姓名及电话号码"<<endl;
cin>>name>>p_number;
}
bool panduan(char k[])
{
if(strcmp(k,name)==0) return true;
else return false;
}
bool panduan(string m)
{
string k=name;
if(k==m) return true;
else return false;
}
string getname()
{
string k=name;
return k;
}
friend istream & operator >> (istream &in, phone_contact &obj);
friend ostream & operator << (ostream &out, phone_contact &obj);
friend istream & operator >> (istream &in, card_contact &obj);
friend ostream & operator<<(ostream &out, card_contact &obj);
};
istream & operator >> (istream &in, phone_contact &obj)
{
in>>obj.name>>obj.p_number;
return in;
}
ostream & operator<<(ostream &out, phone_contact &obj)
{
out<<obj.name<<" "<<obj.p_number<<endl;
return out;
}
///***************************************************************************
///2.
class card_contact:public phone_contact
{
protected:
char jiguan[201],QQ[12];
public:
void set_c()
{
set_p();
cin>>jiguan>>QQ;
}
void modify_c()
{
modify_p();
cout<<"输入修改的籍贯和QQ号"<<endl;
cin>>jiguan>>QQ;
}
friend istream & operator >> (istream &in, card_contact &obj);
friend ostream & operator<<(ostream &out, card_contact &obj);
};
istream & operator >> (istream &in, card_contact &obj)
{
in>>obj.name>>obj.p_number>>obj.jiguan>>obj.QQ;
return in;
}
ostream & operator<<(ostream &out, card_contact &obj)
{
out<<"姓名:"<<obj.name<<endl;
out<<"电话号码:"<<obj.p_number<<endl;
out<<"籍贯:"<<obj.jiguan<<endl;
out<<"QQ:"<<obj.QQ<<endl;
return out;
}
///**********************************************************
///3.
class address
{
public:
virtual void new1()=0;
virtual void dele()=0;
virtual void show_all()=0;
virtual void xiugai()=0;
virtual void show_one()=0;
};
///*******************************************
///4.
class phone_address:public address
{
protected:
int num_p;
phone_contact a[100];
public:
phone_address()
{
ifstream fin("d:\\phone_contact.txt",ios::in);
if(!fin)
{
cout<<"Film could not be open."<<endl;
}
num_p=0;
while(fin>>a[num_p]) num_p++;
}
~phone_address()
{
ofstream fout("d:\\phone_contact.txt",ios::out);
if(!fout)
{
cout<<"Film could not be open."<<endl;
}
for(int i=0;i<num_p;i++) fout<<a[i]<<endl;
}
void new1()
{
cout<<"*请输入添加联系人姓名,手机号"<<endl;
cin>>a[num_p];num_p++;
save();
}
void new1(phone_contact k)
{
a[num_p]=k;
num_p++;
save();
}
void dele()
{
cout<<"Enter the person you want to delete."<<endl;
char name1[200];
int flag=0;
cin>>name1;
for(int i=0;i<num_p;i++)
if(a[i].panduan(name1)==1)
{
for(;i<num_p-1;i++)
a[i]=a[i+1];
flag=1;
break;
}
if(flag==1) num_p--;
else cout<<"The people you want to delete don't exist."<<endl;
save();
}
void show_all()
{
for(int i=0;i<num_p;i++)
cout<<a[i]<<endl;
}
void show_one()
{
cout<<"Enter the person you want to display."<<endl;
char q[201];
cin>>q;
int flag=0;
for(int i=0;i<num_p;i++)
if(a[i].panduan(q)==1)
{
cout<<a[i]<<endl;flag=1;
cout<<"操作成功...";
break;
}
if(flag==0) cout<<"The people you want to show don't exist."<<endl;
save();
}
void xiugai()
{
cout<<"Enter the name of the person you want to change"<<endl;
char q[201];
int flag=0;
cin>>q;
for(int i=0;i<num_p;i++)
if(a[i].panduan(q)==1)
{
a[i].modify_p();flag=1;
cout<<"操作成功";
break;
}
if(flag==0) cout<<"The name of the person you want to change does not exist."<<endl;
save();
}
void save()
{
ofstream fout("d:\\phone_contact.txt",ios::out);
if(!fout)
{
cout<<"Film could not be open."<<endl;
}
for(int i=0;i<num_p;i++) fout<<a[i]<<endl;
}
int getp()
{
return num_p;
}
friend class user;
};
///*******************************************************************************
///5.
class card_address:public address
{
protected:
int num_c;
phone_contact a[100];
public:
card_address()
{
ifstream fin("d:\\card_contact.txt",ios::in);
if(!fin)
{
cout<<"Film could not be open."<<endl;
}
num_c=0;
while(fin>>a[num_c]) num_c++;
}
~card_address()
{
ofstream fout("d:\\card_contact.txt",ios::out);
if(!fout)
{
cout<<"Film could not be open."<<endl;
}
for(int i=0;i<num_c;i++)
fout<<a[i]<<endl;
}
void new1()
{
cout<<"*请输入添加联系人姓名,手机号"<<endl;
cin>>a[num_c];
num_c++;
save1();
}
void new1(phone_contact k)
{
a[num_c]=k;
num_c++;
save1();
}
void dele()
{
cout<<"Enter the person you want to delete."<<endl;
char name1[100];
int flag=0;
cin>>name1;
for(int i=0;i<num_c;i++)
if(a[i].panduan(name1)==1)
{
for(;i<num_c-1;i++)
{
a[i]=a[i+1];
}
flag=1;
break;
}
if(flag==1) num_c--;
else cout<<"The people you want to delete don't exist."<<endl;
save1();
}
void show_all()
{
for(int i=0;i<num_c;i++)
cout<<a[i]<<endl;
}
void show_one()
{
cout<<"Enter the person you want to display."<<endl;
char name1[100];
int flag=0;
cin>>name1;
for(int i=0;i<num_c;i++)
if(a[i].panduan(name1)==1)
{
cout<<a[i]<<endl;flag=1;
cout<<"操作成功"<<endl;
break;
}
if(flag==0)
cout<<"The people you want to show don't exist."<<endl;
}
void xiugai()
{
cout<<"Enter the name of the person you want to change."<<endl;
char name1[100];
int flag=0;
cin>>name1;
for(int i=0;i<num_c;i++)
if(a[i].panduan(name1)==1)
{
a[i].modify_p();
cout<<"操作成功"<<endl;
flag=1;break;
}
if(flag==0)
cout<<"The name of the person you want to change does not exist."<<endl;
save1();
}
void save1()
{
ofstream fout("d:\\card_contact.txt",ios::out);
if(!fout)
{
cout<<"Film could not be open."<<endl;
}
for(int i=0;i<num_c;i++)
fout<<a[i]<<endl;
}
int getc()
{
return num_c;
}
friend class user;
};
///**********************************************************************************
///6.
class user
{
phone_address a1;
card_address b1;
public:
void newc()
{
address *p;
char k,w;
int flag=0;
tianjia();
cin>>k;
if(k=='C') ;
else if(k=='A') {p=&a1;flag=1;}
else if(k=='B') {p=&b1;flag=1;}
else cout<<"There is no such answer."<<endl;
if(flag==1)
{
p->new1();
cout<<"*操作成功..."<<endl;
cout<<"a:返回上一级||b:返回主菜单"<<endl;
cin>>k;
if(k=='a') newc();
///加循环
}
}
void delec()
{
address *p;
char k,w;
int flag=0;
shanchu();
cin>>k;
if(k=='C') ;
else if(k=='A') {p=&a1;flag=1;}
else if(k=='B') {p=&b1;flag=1;}
else cout<<"There is no such answer."<<endl;
if(flag==1)
{
p->dele();
cout<<"操作成功..."<<endl;
cout<<"a:返回上一级||b:返回主菜单"<<endl;
cin>>k;
if(k=='a') delec();
}
}
void show_allc()
{
address *p;
int flag=0;
char k;
all_xianshi();
cin>>k;
if(k=='C') ;
else if(k=='A') {p=&a1;flag=1;}
else if(k=='B') {p=&b1;flag=1;}
else cout<<"There is no such answer."<<endl;
if(flag==1)
{
p->show_all();
cout<<"操作成功..."<<endl;
cout<<"a:返回上一级||b::返回主菜单"<<endl;
cin>>k;
if(k=='a') show_allc();
}
}
void xiugaic()
{
address *p;
int flag=0;
char k;
xg();
cin>>k;
if(k=='C') ;
else if(k=='A') {p=&a1;flag=1;}
else if(k=='B') {p=&b1;flag=1;}
else cout<<"There is no such answer."<<endl;
if(flag==1)
{
p->xiugai();
cout<<"a:返回上一级||b:返回主菜单"<<endl;
cin>>k;
if(k=='a') xiugaic();
}
}
void show_onec()
{
address *p;
char k;
int flag=0;
chazhao();
cin>>k;
if(k=='C') ;
else if(k=='A') {p=&a1;flag=1;}
else if(k=='B') {p=&b1;flag=1;}
else cout<<"There is no such answer."<<endl;
if(flag==1)
{
p->show_one();
cout<<"a:返回向上一级||b:返回主菜单"<<endl;
cin>>k;
if(k=='a') show_onec();
}
}
void moveto_p()
{
cout<<" "<<"-*-*-*-*-*-*-*-将手机卡联系人移动到手机 -*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<endl;
for(int i=0;i<b1.num_c;)
{
int flag=0;
for(int j=0;j<a1.num_p;j++)
{
if(a1.a[j].panduan(b1.a[i].getname())==1) {flag=1;break;}
}
if(flag==0)
{
a1.new1(b1.a[i]);
int k=i;
for(;k<b1.num_c-1;k++)
b1.a[k]=b1.a[k+1];
b1.num_c--;
}
else i++;
}
cout<<"操作成功..."<<endl;
}
void moveto_c()
{
cout<<" "<<"-*-*-*-*-*-*-*-将手机联系人移动到手机卡 -*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<endl;
for(int i=0;i<a1.num_p;)
{
int flag=0;
for(int j=0;j<b1.num_c;j++)
if(a1.a[i].panduan(b1.a[j].getname())) {flag=1;break;}
if(flag==0)
{
b1.new1(a1.a[i]);
int k=i;
for(;k<a1.num_p;k++)
a1.a[k]=a1.a[k+1];
a1.num_p--;
}
else i++;
}
cout<<"操作成功..."<<endl;
}
void cpyto_p()
{
cout<<" "<<"-*-*-*-*-*-*-*-将手机卡联系人复制到手机 -*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<endl;
for(int i=0;i<b1.num_c;i++)
{
int flag=0;
for(int j=0;j<a1.num_p;j++)
if(a1.a[j].panduan(b1.a[i].getname())) {flag=1;break;}
if(flag==0)
a1.new1(b1.a[i]);
}
cout<<"操作成功..."<<endl;
}
void cpyto_c()
{
cout<<" "<<"-*-*-*-*-*-*-*-将手机联系人复制到手机卡 -*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<endl;
for(int i=0;i<a1.num_p;i++)
{
int flag=0;
for(int j=0;j<b1.num_c;i++)
if(a1.a[i].panduan(b1.a[j].getname())) {flag=1;break;}
if(flag==0)
b1.new1(a1.a[i]);
}
cout<<"操作成功..."<<endl;
}
};
///************************************************************************
///7.
class menu
{
user kk;
public:
menu()
{
while(1)
{
int k,flag=0;
mo();
cin>>k;
switch(k)
{
case 1:kk.newc();break;
case 2:kk.show_onec();break;
case 3:kk.delec();break;
case 4:kk.xiugaic();break;
case 5:kk.show_allc();break;
case 6:kk.moveto_p();break;
case 7:kk.moveto_c();break;
case 8:kk.cpyto_p();break;
case 9:kk.cpyto_c();break;
case 10: flag=1;break;
}
if(flag==1) {cout<<"完毕!"<<endl;break;}
}
}
};
///********************************************************
int main()
{
menu a;
return 0;
}
void mo()
{
cout.setf(ios::left);
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<<" "<<"| 8.将手机卡联系人复制到手机 |"<<endl;
cout<<" "<<"| 9.将手机联系人复制到手机卡 |"<<endl;
cout<<" "<<"| 10.退出通讯录系统 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}
void tianjia()
{
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-联系人添加 -*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"| 添加至: |"<<endl;
cout<<" "<<"| A:手机 or B:手机卡 or C:返回主菜单 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}
void chazhao()
{
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-联系人查找 -*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"| 查找于: |"<<endl;
cout<<" "<<"| A:手机 or B:手机卡 or C:返回主菜单 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}
void xg()
{
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-联系人修改 -*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"| 修改于: |"<<endl;
cout<<" "<<"| A:手机 or B:手机卡 or C:返回主菜单 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}
void all_xianshi()
{
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-显示全部联系人 -*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"| 显示联系人从: |"<<endl;
cout<<" "<<"| A:手机 or B:手机卡 or C:返回主菜单 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}
void shanchu()
{
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-联系人删除 -*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"| 删除于: |"<<endl;
cout<<" "<<"| A:手机 or B:手机卡 or C:返回主菜单 |"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
}