课程设计分为了四大部分,任务描述、设计分析、源代码、总结。
一、任务描述
本次课程设计内容是要做一个通讯录管理系统,手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机卡的联系人的信息只包含用户名和电话号码两项信息。存储在手机上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。
具体要求:
- 创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的存储的联系人的信息)。
- 以菜单方式工作(字符界面即可)
- 存储在手机卡上的联系人的信息包括:姓名和电话号码;存储在手机上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
- 管理系统的功能包括:
- 新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中)
- 删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
- 修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
- 查询:根据名字查询联系人信息(查询结果不唯一)
- 浏览:显示所有联系人的信息
- 将联系人的信息从手机转存到手机卡上(同时要避免重复数据的存在。并且在转存是要检查容量是否受限。下同。)
- 将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在)
- 要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点
二、设计分析
根据要求,首先要建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息。课程设计分成了七个类,也就是七个模块
- 第一个类:手机卡联系人类(class teleid)(表示一个联系人)
数据成员包括:
姓名:string name;
电话号码:string tele;
成员函数包括
- 带参并带默认值的构造函数:
teleid(string name1="\0",string tele1="\0"){}
- 一组set函数为数据成员赋值:
int set(string name1,string tele1){}
(3)一组modify函数,修改数据成员的值:
int modify(char choice,string name1="\0",string tele1="\0"){}
手机卡联系人只有姓名,电话号码两个数据成员,choice用来选择修改姓名或者电话号码,1为修改姓名,2为修改电话号码,3为修改姓名与电话号码,4为退出修改;
(4)重载>>,<<运算符
friend istream & operator>>(istream &input,teleid &p){}
重载<<,功能用来输入联系人姓名与电话号码。
friend ostream & operator<<(ostream &output,teleid &p){}
重载>>,功能用于输出联系人的姓名和电话号码
- ,为了后面需要,定义了以下两个函数
string getname(){}//获得姓名
string gettele(){}//获得电话号码
- 第二个类:telephone,手机联系人类(继承于手机卡联系人类):
新增数据成员:
籍贯,string place;
QQ号,string qq;
成员函数包括:
- 一组set函数为数据成员赋值:
int set(string name1,string tele1,string place1,string qq1){}
- 一组modify函数,修改数据成员的值:
int modify(char choice,string name1=”\0”,string tele1=”\0”,string place1=”\0”,string qq1=”\0”){}
与手机卡类中的modify函数功能类似,手机联系人中有姓名,电话号码,籍贯,QQ四个数据成员,choice用来选择修改内容,1为修改姓名,2为修改电话号码,3为修改籍贯,4为修改QQ号码,5为全部修改,6为退出修改;
- 重载>>,<<运算符:
friend istream & operator>>(istream &input,teleid &s){}
重载<<,功能用来输入联系人姓名,电话号码,籍贯,QQ。
friend ostream & operator<<(ostream &output,teleid &s){}
重载>>,功能用于输出联系人的姓名和电话号码,籍贯和QQ号码
(4),为了后面需要,定义了以下两个函数
string getplace(){}//获得姓名
string getqq(){}//获得电话号码
- 第三个类:class functions通讯簿抽象类,用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数)
(1)增加函数:增加一个联系人
virtual void add(string name1,string tele1,string place1="\0",string qq1="\0")=0;
(2)删除操作:删除一个联系人
virtual void minu(string tele)=0;
(3)显示所有联系人的信息
virtual void show()=0;
(4).修改某一联系人的信息:
virtual void modify(string tele2,char choice,string name1="\0",string tele1="\0",string place1="\0",string qq1="\0")=0;
(5).查询并显示某一联系人的信息:(通过姓名查询)
virtual void inquire(string name2)=0;
4.第四个类:tele_function,手机通讯簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息
数据成员包括:
手机联系人的数量:int sum1;
手机联系人对象数组:telephone people[1000];
同时这里要定义user(用户类)的友元函数:friend class user;
成员函数包括
- .构造函数:
tele_function(){}
构造函数用来读取文本文件中的数据,并根据文件内容创建联系人对象数组
- .析构函数:
~tele_function(){}
析构函数用于将对象数组中的内容写入到文本文件中
- .增加函数:增加一个联系人
void add(string name1,string tele1,string place1="\0",string qq1="\0"){};
该函数带有默认值,故用于把所需要新建的联系人存入手机联系人的对象数组中,并且使手机联系人的数量sum1加1;
- .删除操作:删除一个联系人
void minu(string tele2)
首先运用for循环,找出所要删除联系人的电话号码,删除联系人操作即要把sum1减1,然后他后面其他所有联系人统统向前移动,这样即可完成删除操作;
- .显示函数,显示所有联系人的信息:
void show()
用于浏览联系人的信息,依旧要用for循环,把所有联系人的信息全部输出即可;
- 修改某一联系人的信息:
void modify(string tele2,char choice,string name1,string tele1,string place1="\0",string qq1="\0")
与删除操作类似,通过查找电话号码确定所要修改的联系人,而choice的作用与第一个类、第二个人类中modify函数中choice作用类似,用于选择所要修改的内容
- 查询并显示某一联系人的信息:
void inquire(string name2){}
通过姓名查询联系人信息,并完成输出;
5.第五个类,Id_function手机卡通信簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息
数据成员包括:
手机联系人的数量:int sum2;
手机联系人对象数组: teleid person[1000];
成员函数包括
- .构造函数:
Id_function()
该类用于读取文本文件中的数据,并根据文件内容创建联系人对象数组
(2)析构函数:
~Id_function()
该类用于将对象数组中的内容写入到文本文件中。
(3)增加函数:增加一个联系人
void add(string name1,string tele1,string place1="\0",string qq1="\0")
该函数带有默认值,故用于把所需要新建的联系人存入手机卡联系人的对象数组中,并且使手机联系人的数量sum2加1
(4)删除操作:
void minu(string tele2){}
删除一个联系人(与删除手机中联系人操作类似)
(5)显示所有联系人的信息
void show(){}
用于浏览联系人的信息,依旧要用for循环,把所有联系人的信息全部输出即可;
(6)修改某一联系人的信息:
void modify(string tele2,char choice,string name1="\0",string tele1="\0",string place1="\0",string qq1="\0")
与删除操作类似,通过查找电话号码确定所要修改的联系人,而choice的作用与第一个类、第二个人类中modify函数中choice作用类似,用于选择所要修改的内容
- 查询并显示某一联系人的信息:
void inquire(string name2){}
通过姓名查询联系人信息,并完成输出;
6.第六个类,class user ,用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理
数据成员包括:
两个通讯簿对象:
tele_function P;//定义手机电话薄对象
Id_function S;定义手机卡电话薄对象
成员函数包括(成员函数体现用户的行为):
- 添加联系人:
void add(){}
该函数利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通信簿)的增加函数完成联系人的添加。实现动态联编,体现出多态特点。(下同)
当然,为了更好看的界面和人性化的设计,需要增加一些choice,如第一需要选择你所要添加的联系人到那个通讯录,1是手机通讯录,2是手机卡通讯录;手机卡和手机内存有限,都只能存储1000个联系人,所以如果已有联系人数量超过1000,也无法存储;同时,为了避免操作用户操作失误,需要确定一下是否需要存入该联系人,Y为是,N为否
完成选择之后,运用基类指针进行相应操作
- 删除联系人:
void minu(){},调用相应的通讯簿对象的删除操作删除一个联系人
同样为了更好看的界面和人性化的设计,需要增加一些choice,如第一需要选择你需要在那个通讯录删除的联系人,1是手机通讯录,2是手机卡通讯录;
同样,为了避免操作用户操作失误,需要确定一下是否需要存入该联系人,Y为是,N为否
完成选择之后,运用基类指针进行相应操作
- 显示相应的通讯簿中联系人的信息
void show(){},浏览联系人信息,包括手机联系人和手机卡联系人
- 修改某一联系人的信息:
void modify(){}调用通讯簿对象的函数完成操作
既然需要修改,大胆的认为就是之前的信息有误,需要在手机和手机卡同时修改,所以这里没有choice手机或者手机卡,就直接一个choice用来选择所需要修改的信息。
1是修改姓名,2是修改电话号码,3是修改籍贯,4是修改QQ号码,5是都修改,6是退出操作;
- 查询并显示某一联系人的信息:
void inquire(){},调用通讯簿对象的函数完成操作。
第一个choice用来选择在那个通讯录下面进行查询,1是手机,2是手机卡。
- 将手机卡中的存储的联系人的信息移动到手机中
void movei_t(){},从Id(手机卡)移动到telephone(手机)中,
移动操作时需要用第三遍量存储所需要的移动的手机卡原有信息,然后把第三遍量复制到手机中,因为移动之后手机卡联系人没有了,所以需要删除手机卡原有信息,
- 将手机中存储的联系人的信息移动到手机卡中
void movet_i(){}, 与(6)中操作相似
- 将手机卡中的存储的联系人的信息复制到手机中
void savei_t(){},从Id(手机卡)复制到telephone(手机)中
复制与移动的不同之处在于复制不需要删除原有信息;
- 将手机中存储的联系人的信息复制到手机卡中
void savet_i(){},与(8)操作相似
7.第七个类,menu界面菜单类:用来给出操作提示
数据成员:user u;
成员函数:
show函数:显示操作菜单的提示。说明:可以根据需要定义多个函数,显示不同的菜单(操作提示)。
这里需要一些选择,第一个choice要选择需要进行的操作,增、删、查、改、复制,转移等
三、源代码:
/*1.手机卡联系人类(class teleid) 2.手机联系人类(class telephone)3.通讯簿抽象类(functions)4.手机通讯簿类(tele_function) 5.手机卡通讯簿类(Id_function)
6 用户类 user 7.界面菜单类 menu*/
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
//#include<bits/stdc++.h>
using namespace std;
//********类1,手机卡联系人类,*******包括姓名和电活号码
class teleid//手机卡类
{ protected:
string name,tele;//存储在手机上的联系人的信息包括姓名,电话号码
public:
teleid(string name1="\0",string tele1="\0")//带参并带默认值的构造函数
{
name=name1;
tele=tele1;
}
int set(string name1,string tele1)//用于成员赋值
{ name=name1;
tele=tele1;
}
int modify(char choice,string name1="\0",string tele1="\0")
{
while(cin>>choice)
{
if(choice==1) //1--只修改姓名
{
name=name1;
}
else if(choice==2)//2--只修改电话号码
{
tele=tele1;
}
else if(choice==3)//3--修改姓名与电话号码
{
name=name1;
tele=tele1;
}
else if(choice==4)//退出修改操作
{
cout<<"已退出修改"<<endl;
}
else
{
cout<<"输入错误,你可以选择重新输入"<<endl;
}
}
}
string getname()//获得姓名
{
return name;
}
string gettele()//获得电话号码
{
return tele;
}
friend istream & operator>>(istream &input,teleid &);//重载<<
friend ostream & operator<<(ostream &output,teleid &);//重载>>
};
istream&operator>>(istream &input,teleid &p)
{
cout<<"请输入姓名:";
input>>p.name;
cout<<"请输入电话号码:";
input>>p.tele;
return input;
}
ostream&operator<<(ostream &output,teleid &p)
{
output<<"联系人姓名:"<<p.name;
output<<" 联系人电话号码:"<<p.tele<<endl;
return output;
}
//类2*************手机联系人类**********************
class telephone:virtual public teleid//(继承于手机卡联系人类)
{ protected:
string place,qq;//手机联系人类包含籍贯与qq
public:
int set(string name1,string tele1,string place1,string qq1)
{
name=name1;
tele=tele1;
place=place1;
qq=qq1;
}
int modify(char choice,string name1="\0",string tele1="\0",string place1="\0",string qq1="\0")
{
while(cin>>choice)
{
if(choice==1) //1--只修改姓名
{
name=name1;
}
else if(choice==2)//2--只修改电话号码
{
tele=tele1;
}
else if(choice==3)//3--修改籍贯
{
place=place1;
}
else if(choice==4)//修改QQ号码
{
qq=qq1;
}
else if(choice==5) //全部修改
{
name=name1;
tele=tele1;
place=place1;
qq=qq1;
}
else if(choice==6)//退出修改
{
cout<<"已退出修改"<<endl;
}
else
{
cout<<"输入错误,你可以选择重新输入"<<endl;
}
}
}
string getplace()//获得籍贯
{
return place;
}
string getqq()//获得QQ号码
{
return qq;
}
friend istream & operator>>(istream &input,telephone&s);//重载>>
friend ostream & operator<<(ostream &output,telephone&s);//重载<<
};
istream & operator>>(istream &input,telephone &s)//重载<<
{
string name1,tele1;
cout<<"请输入姓名:";
input>>name1;
cout<<"请输入电话号码:";
input>>tele1;
s.teleid::set(name1,tele1);
cout<<"请输入籍贯:";
input>>s.place;
cout<<"请输入qq:";
input>>s.qq;
return input;
}
ostream & operator<<(ostream&output,telephone&s)//重载>>
{
output<<s.name<<" "<<s.tele<<" "<<s.place<<" "<<s.qq;
return output;
}
//类3.********定义一个通讯簿抽象类,************用于封装以下函数
class functions//管理系统的功能类包括增,删,查,改,浏览,转存.为避免二义性,需要定义虚基类解决
{ public:
virtual void add(string name1,string tele1,string place1="\0",string qq1="\0")=0;//增加联系人
virtual void minu(string tele)=0;//减去(删除)联系人
virtual void show()=0;//显示联系人
virtual void modify(string tele2,char choice,string name1="\0",string tele1="\0",string place1="\0",string qq1="\0")=0;//修改联系人信息
virtual void inquire(string name2)=0;//查询联系人信息
};
//类4***********手机通讯簿继承通讯簿类******************
class tele_function: public functions//手机通讯簿继承通讯簿
{
protected:
int sum1;//手机联系人数量
telephone people[1000];//手机联系人的对象数组
friend class user;//定义友元
public:
tele_function()//构造函数
{
int n=0;
string name1,tele1,place1,qq1;
ifstream instuf("E:\\telephone.txt",ios::in);//读的方式打开文件
while(instuf>>name1>>tele1>>place1>>qq1)
{
people[n].set(name1,tele1,place1,qq1);
n++;
}
sum1=n;
instuf.close();
}
~tele_function()//析构函数
{
ofstream outstuf("E:\\telephone.txt",ios::out);//写的方式打开文件
for(int i=0;i<sum1;i++)
{
outstuf<<people[i].getname()<<'\t'<<people[i].gettele()<<'\t'<<people[i].getplace()<<'\t'<<people[i].getqq()<<'\n';
}
outstuf.close();
}
void add(string name1,string tele1,string place1="\0",string qq1="\0")//手机中增加联系人
{
people[sum1].set(name1,tele1,place1,qq1);
sum1++;
}
void minu(string tele2)//删除联系人
{
string name1,tele1,place1,qq1;
int n=0;
for(int i=0;i<sum1;i++)
{
if(people[i].gettele()!=tele2)
n++;
else
{
sum1--;
for(int j=n;j<sum1;j++)
{
name1=people[j+1].getname();
tele1=people[j+1].gettele();
place1=people[j+1].getplace();
qq1=people[j+1].getqq();
people[j].set(name1,tele1,place1,qq1);
}
}
}
}
void show()//浏览联系人
{
string name1,tele1,place1,qq1;
for(int i=0;i<sum1;i++)
{
name1=people[i].getname();
tele1=people[i].gettele();
place1=people[i].getplace();
qq1=people[i].getqq();
cout<<name1<<'\t'<<tele1<<'\t'<<place1<<'\t'<<qq1<<endl;
}
}
void modify(string tele2,char choice,string name1,string tele1,string place1="\0",string qq1="\0")
{
for(int i=0,n=0;i<sum1;i++)
{
if(people[i].gettele()!=tele2) n++;
else
{
people[i].modify(choice,name1,tele1,place1,qq1);
}
}
}
void inquire(string name2)
{
string name1,tele1,place1,qq1;
for(int i=0,n=0;i<sum1;i++)
{
if(people[i].getname()!=name2) n++;
else
{
name1=people[i].getname();
tele1=people[i].gettele();
place1=people[i].getplace();
qq1=people[i].getqq();
cout<<name1<<'\t'<<tele1<<'\t'<<place1<<'\t'<<qq1<<endl;
}
}
}
};
//类5*************.手机卡通讯簿类*****************
class Id_function: public functions//手机卡通讯簿继承自通讯簿
{
protected:
int sum2;//手机联系人的数量
teleid person[1000];//手机联系人的对象数组
friend class user;//
public:
Id_function()//构造函数
{
int n=0;
string name1,tele1;
ifstream instuf("E:\\teleid.txt",ios::in);//读的方式打开文件
while(instuf>>name1>>tele1)
{
person[n].set(name1,tele1);
n++;
}
sum2=n;
instuf.close();
}
~Id_function()//析构函数
{
ofstream outstuf("E:\\teleid.txt",ios::out);//写的方式打开文件
for(int i=0;i<sum2;i++)
{
outstuf<<person[i].getname()<<'\t'<<person[i].gettele()<<'\t'<<endl;
}
outstuf.close();
}
void add(string name1,string tele1,string place1="\0",string qq1="\0")//手机卡中增加联系人
{
person[sum2].set(name1,tele1);
sum2++;
}
void minu(string tele2)//手机卡中删除联系人
{
string name1,tele1;
int n=0;
for(int i=0;i<sum2;i++)
{
if(person[i].gettele()!=tele2)
n++;
else
{
sum2--;
for(int j=n;j<sum2;j++)
{
name1=person[j+1].getname();
tele1=person[j+1].gettele();;
person[j].set(name1,tele1);
}
}
}
}
void show()
{
string name1,tele1;
for(int i=0;i<sum2;i++)
{
name1=person[i].getname();
tele1=person[i].gettele();
cout<<name1<<'\t'<<tele1<<'\t'<<endl;
}
}
void modify(string tele2,char choice,string name1="\0",string tele1="\0",string place1="\0",string qq1="\0")//手机卡中修改联系人
{
for(int i=0,n=0;i<sum2;i++)
{
if(person[i].gettele()!=tele2)
n++;
else
{
person[i].modify(choice,name1,tele1);
}
}
}
void inquire(string name2)//手机卡中查询联系人
{
string name1,tele1;
for(int i=0,n=0;i<sum2;i++)
{
if(person[i].getname()!=name2) n++;
else
{
name1=person[i].getname();
tele1=person[i].gettele();
cout<<name1<<'\t'<<tele1<<'\t'<<endl;
}
}
}
};
//类6*************用户类*************************************
class user//用户类
{
protected:
tele_function P;//定义手机电话薄对象
Id_function S;定义手机卡电话薄对象
public:
void add()
{
functions*fun;//通讯录抽象类指针
string name1,tele1,place1,qq1;
cout<<"**************************************************"<<endl;
cout<<"* 请选择添加联系人到哪一个通讯录: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录. *"<<endl;
cout<<"* *"<<endl;
cout<<"* 2.手机卡通讯录. *"<<endl;
char choice;
cin>>choice;
if(choice=='1')
{
if(P.sum1>1000)
{
cout<<"手机通讯内存已满,无法添加\n";}
else
{
fun=&P;
cout<<"***请输入依次输入所存联系人的姓名,电话号码,籍贯,QQ号码***\n";
cin>>name1>>tele1>>place1>>qq1;
cout<<"***是否确定存入该联系人到手机中*** Y/N"<<endl;
char z;
cin>>z;
if(z=='Y')
{
fun->add(name1,tele1,place1,qq1);
cout<<"***已保存该联系人至手机中***"<<endl;
}
if(z=='N')
cout<<"正在返回请销后...."<<endl;
}
}
else
{
if(S.sum2>1000)
{
cout<<"***你手机卡内存已满,无法继续存储***\n";}
else
{
fun=&S;
cout<<"**********************************************"<<endl;
cout<<"***请输入依次输入所存联系人的姓名,电话号码***\n";
cin>>name1>>tele1;
cout<<"***是否确定存入该联系人到手机中*** Y/N"<<endl;
char z;
cin>>z;
if(z=='Y')
{
fun->add(name1,tele1);
cout<<"***已保存该联系人至手机卡中***"<<endl;
}
if(z=='N')
cout<<"正在返回请稍后....."<<endl;
}
}
}
void minu()
{
if(P.sum1<=0&&S.sum2<=0)
{
cout<<"手机通讯容量已空,无法删除,即将返回"<<endl;
}
else
{
cout<<"**************************************************"<<endl;
cout<<"* 请选择在哪一个通讯录删除联系人: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录. *"<<endl;
cout<<"* *"<<endl;
cout<<"* 2.手机卡通讯录. *"<<endl;
char choice;
cin>>choice;
if(choice=='1')
{
string tele2;
cout<<"请输入你需要要删除的联系人的电话号码\n";
cin>>tele2;
cout<<"是否彻底删除该联系人信息,Y/N"<<endl;
char z;
cin>>z;
if(z=='Y')
{
P.minu(tele2);
cout<<"***已删除该联系人***"<<endl;
}
if(z=='N')
cout<<"正在返回请销后...."<<endl;
}
if(choice=='2')
{
string tele2;
cout<<"请输入你需要要删除的联系人的电话号码\n";
cin>>tele2;
cout<<"是否彻底删除该联系人信息,Y/N"<<endl;
char z;
cin>>z;
if(z=='Y')
{
S.minu(tele2);
cout<<"***已删除该联系人***"<<endl;
}
if(z=='N')
cout<<"正在返回请销后...."<<endl;
}
}
}
void show()
{
if(P.sum1<=0&&S.sum2<=0)
{
cout<<"手机通讯容量已空,即将返回"<<endl;
}
cout<<"***手机联系人如下:***\n";
P.show();
cout<<endl;
cout<<"***手机卡联系人如下:*** \n";
S.show();
cout<<endl;
}
void modify()
{
if(P.sum1<=0&&S.sum2<=0)
{
cout<<"手机通讯容量已空,无法修改,即将返回"<<endl;
}
else
{
string tele2,name1,tele1,place1,qq1;
cout<<"请输入你所要修改的联系人的电话号码\n";
cin>>tele2;
cout<<"*********************************"<<endl;
cout<<"*请输入要修改的数据: *"<<endl;
cout<<"***1,姓名 ***2,电话号码 *"<<endl;
cout<<"***3,籍贯 ***4, QQ号码 *"<<endl;
cout<<"***5,都修改 ***6,退出操作 *"<<endl;
char choice;
cin>>choice;
switch(choice)
{ case'1':
{
cout<<"请输入新姓名\n";
cin>>name1;
P.modify(tele2,choice,name1,place1,qq1);
S.modify(tele2,choice,name1);
cout<<"修改完成"<<endl;
};break;
case'2':
{
cout<<"请输入新电话号码\n";
cin>>tele1;
P.modify(tele2,choice,"\0",tele1);
S.modify(tele2,choice,"\0",tele1);
cout<<"修改完成"<<endl;
};break;
case'3':
{
cout<<"请输入新籍贯\n";
cin>>place1;
P.modify(tele2,choice,"\0","\0",place1);
cout<<"修改完成"<<endl;
};break;
case'4':
{ cout<<"请输入新qq\n";
cin>>qq1;
P.modify(tele2,choice,"\0","\0","\0",qq1);
cout<<"修改完成"<<endl;
};break;
case'5':
{
cout<<"请依次输入新姓名,电话号码,籍贯,qq\n";
cin>>name1;
cin>>tele1;
cin>>place1;
cin>>qq1;
P.modify(tele2,choice,name1,tele1,place1,qq1);
S.modify(tele2,choice,name1,tele1,place1,qq1);
cout<<"修改完成"<<endl;
};
}
}
}
void inquire()
{
if(P.sum1<=0&&S.sum2<=0)
{
cout<<"手机通讯容量已空,无法查询,即将返回"<<endl;
}
else
{
cout<<"**************************************************"<<endl;
cout<<"* 请选择需要查询的通讯录: *"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.手机通讯录. *"<<endl;
cout<<"* *"<<endl;
cout<<"* 2.手机卡通讯录. *"<<endl;
char choice;
cin>>choice;
if(choice=='1')
{
string name2;
cout<<"请输入你所需要查询的联系人的姓名\n";
cin>>name2;
P.inquire(name2);
}
if(choice=='2')
{
string name2;
cout<<"请输入你所需要查询的联系人的姓名\n";
cin>>name2;
S.inquire(name2);
}
}
}
void movei_t() //将手机卡中存储的联系人的信息移动到手机中
{
if(P.sum1>1000)
{ cout<<"手机内存已满,操作无法进行\n";}
else
{
string name2,name1,tele1,place1,qq1;
cout<<"请输入要转移的联系人的姓名\n";
cin>>name2;
int m=0;
for(int i=0,n=0;i<S.sum2;i++)
{
if(S.person[i].getname()!=name2) n++;
else
{
name1=S.person[i].getname();
tele1=S.person[i].gettele();
}
}
for(int j=0;j<P.sum1;j++)
{
if(P.people[j].getname()!=name2)
m++;
}
if(m==P.sum1)
{
cout<<"请输入该联系人的籍贯,qq\n";
cin>>place1>>qq1;
P.add(name1,tele1,place1,qq1);//复制
}
S.minu(name2);//删除
cout<<"***移动完成***"<<endl;
}
}
void movet_i() //将手机中存储的联系人的信息移动到手机卡中
{
if(S.sum2>1000)
{
cout<<"手机卡内存已满,操作无法进行\n";}
else
{
string name2,name1,tele1;
cout<<"请输入要转移的联系人的姓名\n";
cin>>name2;
int m=0;
for(int i=0,n=0;i<P.sum1;i++)
{
if(P.people[i].getname()!=name2)
n++;
else//获取联系人信息
{
name1=P.people[i].getname();
tele1=P.people[i].gettele();}
}
for(int j=0;j<S.sum2;j++)
{
if(S.person[j].getname()!=name2)
m++;}
if(m==S.sum2)
S.add(name1,tele1);//复制
P.minu(name2);//删除
cout<<"***移动完成***"<<endl;
}
}
void savei_t() //将手机卡中存储的联系人的信息复制到手机中
{
if(P.sum1>1000)
{
cout<<"联系人数量已满,此次操作无法进行\n";}
else
{
string name2,name1,tele1,place1,qq1;
cout<<"请输入要复制的联系人的姓名\n";
cin>>name2;
int m=0;
for(int i=0,n=0;i<S.sum2;i++)
{
if(S.person[i].getname()!=name2) n++;
else
{
name1=S.person[i].getname();
tele1=S.person[i].gettele();
}
}
for(int j=0;j<P.sum1;j++)
{
if(P.people[j].getname()!=name2) m++;}
if(m==P.sum1)
{
cout<<"请输入该联系人的籍贯,qq\n";
cin>>place1>>qq1;
P.add(name1,tele1,place1,qq1);
}
cout<<"***复制完成***"<<endl;
}
}
void savet_i() //手机内容复制到手机卡
{
if(S.sum2>1000)
{
cout<<"联系人数量已满,此次操作无法进行\n";
}
else
{
string name2,name1,tele1;
cout<<"请输入要复制的联系人的姓名\n";
cin>>name2;int m=0;
for(int i=0,n=0;i<P.sum1;i++)
{
if(P.people[i].getname()!=name2) n++;
else
{
name1=P.people[i].getname();
tele1=P.people[i].gettele();
}
}
for(int j=0;j<S.sum2;j++)
{
if(S.person[j].getname()!=name2) m++;
}
if(m==S.sum2) S.add(name1,tele1);
cout<<"***复制完成***"<<endl;
}
}
};
//类7***************主菜单类*********************************************
class menu
{
protected:
user u;
public:
int show()
{
// while(1)
//{
cout<<endl;
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<<"* 9、复制联系人信息到手机 0.退出系统,并保存 *"<<endl;
cout<<"*****************************************************************"<<endl;
cout<<"请输入您的选择:"<<endl;
char choice;
cout<<"请输入你需要的序号操作?\n";
while( cin>>choice)
{
switch(choice)
{
case'1': u.add();break;//新建联系人
case'2': u.minu();break;//删除联系人
case'3': u.inquire();break;//查询联系人信息
case'4': u.modify();break;//修改联系人信息
case'5': u.show();break;//浏览联系人信息
case'6': u.movet_i();break;//从手机移动到手机卡
case'7': u.movei_t();break;//从手机卡移动到手机
case'8': u.savet_i();break;//从手机复制到手机卡
case'9': u.savei_t();break;//从手机卡复制到手机
case'0': return 0;
}
}
}
};
int main()
{ ofstream outf("E:\\telephone.txt",ios::out|ios::app);
ofstream outff("E:\\teleid.txt",ios::out|ios::app);
menu m1;
m1.show();
outf.close();
outff.close();
return 0;
}
四、总结
- .首先我觉得还是有必要解释一下我蹩脚的英文命名,在外人看来可能并没有逻辑可言。类1,手机卡类(teleid--telephone idcard);类2,手机联系人类(telephone);类3,通讯簿抽象类,因为我觉得它是一个功能的说明,就定义为(functions)了;类4,手机通讯薄抽象类(tele_function);类5,手机卡通讯簿抽象类类(Id_function);类6,用户类(user);类7,主菜单类(menu);
新建(add);删除(minu),开始是想用minus,但在编译器打上发现字体变颜色了,怕是关键字(毕竟关键字不会背)就去掉了s;浏览(show);修改(modify);查询(inquire);
将手机卡中存储的联系人的信息复制到手机中(savei_t-----save idcard ->telephone),移动的话我就用了move;其他具体的在设计分析部分有解释。
- .课程设计源代码我是从6月10日开始的第一次,开始时看到增删查改时,第一想到的是STL中的vector数组。写好所有类的框架后就去翻ACM笔记,可能因为学的不深,这部分写了一整天,最后写完的时候,编译只有三个错误,非常兴奋,可是改错误确实头疼,真是牵一发而动全身呢,改了一上午之后变成了90多个错误。后来在优快云上看了很多前辈的代码,想按照他们的改,最后变成了不伦不类,我自己都看不懂了,找了很多同学帮忙但最后还是决定推到重来。第二轮相比轻松许多,但也有一些问题;
- 困难一:有了第一次的经验吧,第二次没有先写框架,直接从前往后写的,写前三个类编译都没有问题,但到后面就出现问题了而且错误指向前面类中的成员函数(开始时成员函数体在类外面写的),对照了课本认为格式没有错,于是把函数体写到了类里面,结果编译通过了,至于什么原因,才疏学浅尚不知情(不知道是不是编译器原因)。
- 困难二:在用纯虚函数的时候碰到了麻烦,在定义的时候出现了问题,开始一直没发现什么原因,后来重新把这节课件看了一遍,又理解了纯虚函数才改对,虽说这个问题不大,但是的确是改错时耗时最多的一项大工程。
- 困难三:删除操作的时候,我其实没有想到把删除数据之后的数组成员全部前移这种做法,我的思路开始停留在vector动态数组这里,一直想着用指针之类的,现在的思路得益于同学的讲解。于是后面的增删查改包括移动复制也有用这种思路。
- 困难四:在最后user类的时候,创建手机和手机卡类对象,要用指针比较头疼;当傻傻的去问同学”该怎么规定让它指向具体的通讯簿呢”,其实开始知道要用指针,却没想到这么简单;真的当听到讲解的时候,瞬间醍醐灌顶,感觉自己实在太蠢了。
- 在编译改错过程中,也遇到了很多小问题,忘记分号,命名混乱,定义格式有问题等等。前前后后代码用了差不多四天。