用面向对象的方法制作一个通讯录系统,包含人员姓名,电话号码,QQ,Email,籍贯等信息,另有添加,删除,修改,查询操作。
我的通讯录系统是在每个功能结束后都再重新输出一遍完整的通讯录,普通代码如下
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
using namespace std;
class person{
string name,num,QQ,Email,address;
public:
person(){}
person(string a,string b,string c):name(a),num(b),address(c){}
gets(string str);
friend ostream &operator <<(ostream &out,person &A);
friend istream &operator >>(istream &in,person &A);
bool End();
bool finding(person A);
bool Delete(string a,string b,string c);
bool search(string str);
void correct(string a,string b,string c);
};
ostream &operator <<(ostream &out,person &A)
{
out<<setw(10)<<A.name<<" ";
out<<setw(10)<<A.num<<" ";
out<<setw(10)<<A.QQ<<endl;
return out;
}
istream &operator >>(istream &in,person &A)
{
in>>A.num;
in>>A.QQ;
return in;
}
bool person::End()
{
if(name=="ending") return true;
else return false;
}
bool person::finding(person A)
{
if(name==A.name&&num==A.num&&QQ==A.QQ)
return false;
else return true;
}
bool person::Delete(string a,string b,string c)
{
if(a==name&&b==num&&c==QQ) return true;
else return false;
}
bool person::search(string str)
{
if(str==name||str==QQ||str==num) return true;
else return false;
}
person::gets(string str)
{
name=str;
}
void person::correct(string a,string b,string c)
{
name=a;
num=b;
QQ=c;
}
int main()
{
person a[10005]{};
int s=0,i,index,j;
string str;
cout<<"请输入通讯录名单(包括人员名字,电话及QQ号码),以输入ending为结束标志(下同):"<<endl;
while(cin>>str)
{
if(str=="ending") break;
a[s].gets(str);
cin>>a[s];
for(i=0;i<s;i++)
if(!a[s].finding(a[i])) break;
if(i==s) s++;
}
index=s;
cout<<"请输入想要增加至列表的人员信息:"<<endl;
while(cin>>str)
{
if(str=="ending") break;
a[s].gets(str);
cin>>a[s];
for(i=index;i<s;i++)
if(!a[s].finding(a[i])) break;
if(i==s) s++;
}
cout<<"输出完整通讯录名单:"<<endl;
for(i=0;i<s;i++)
cout<<a[i];
cout<<"请输入想要删除的人员信息:"<<endl;
string name,num,QQ;
while(cin>>name)
{
if(name=="ending") break;
cin>>num>>QQ;
for(i=0;i<s;i++)
if(a[i].Delete(name,num,QQ)) break;
if(i<s)
{
for(j=i;j<s-1;j++)
{
a[j]=a[j+1];
}
s--;
cout<<"删除成功"<<endl;
}
else cout<<"无此人员信息"<<endl;
}
cout<<"输出完整通讯录名单:"<<endl;
for(i=0;i<s;i++)
cout<<a[i];
cout<<"请输入你想要修改的人员原姓名,电话号码及QQ号码:"<<endl;
while(cin>>name)
{
if(name=="ending") break;
person temp;
temp.gets(name);
cin>>temp;
for(i=0;i<s;i++)
if(!temp.finding(a[i])) break;
if(i==s) cout<<"无此人员信息"<<endl;
else
{
cout<<"请输入修改后的人员姓名,电话号码及QQ号码::"<<endl;
cin>>name>>num>>QQ;
a[i].correct(name,num,QQ);
}
cout<<"请输入你想要修改的人员原姓名,电话号码及QQ号码:"<<endl;
}
cout<<"输出完整通讯录名单:"<<endl;
for(i=0;i<s;i++)
cout<<a[i];
cout<<"输入你想查询的人员姓名,电话号码或QQ号(仅需输入一个即可):"<<endl;
bool flag;
while(cin>>str)
{
flag=false;
if(str=="ending") break;
for(i=0;i<s;i++)
if(a[i].search(str))
{
flag=true;
cout<<a[i];
}
if(!flag) cout<<"无此人员信息"<<endl;
}
cout<<"输出完整通讯录名单:"<<endl;
for(i=0;i<s;i++)
cout<<a[i];
return 0;
}
运行结果
改进后我使用了另一个book类对person类进行了封装,功能一样,代码如下
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
using namespace std;
class book;
class person{
string name,num,QQ,Email,address;
public:
person(){}
person(string a,string b,string c):name(a),num(b),QQ(c){}
void gets(string str);
friend ostream &operator <<(ostream &out,person &A);
friend istream &operator >>(istream &in,person &A);
friend class book;
};
class book{
person A[500];
int s=0,i,j,index;
public:
void gets(person);
bool finding(person);
void Delete(string a,string b,string c);
bool search(string str);
void correct(string a,string b,string c);
friend ostream &operator <<(ostream &out,person &A);
friend istream &operator >>(istream &in,person &A);
void print();
};
void person::gets(string str)
{
name=str;
}
void book::gets(person K)
{
A[s].name=K.name;
A[s].num=K.num;
A[s].QQ=K.QQ;
s++;
}
ostream &operator <<(ostream &out,person &A)
{
out<<setw(20)<<A.name<<" ";
out<<setw(20)<<A.num<<" ";
out<<setw(20)<<A.QQ<<endl;
return out;
}
istream &operator >>(istream &in,person &A)
{
in>>A.num;
in>>A.QQ;
return in;
}
bool book::finding(person C)
{
for(i=0;i<s;i++)
if(A[i].name==C.name&&A[i].num==C.num&&A[i].QQ==C.QQ)
break;
if(i==s) return true;
else
{
index=i;
return false;
}
}
void book::Delete(string a,string b,string c)
{
int tmp;
for(i=0;i<s;i++)
if(a==A[i].name&&b==A[i].num&&c==A[i].QQ)
{
tmp=i;
break;
}
if(i==s) cout<<"无此人员信息"<<endl;
else
{
for(j=tmp;j<s-1;j++)
{
A[j]=A[j+1];
}
s--;
cout<<"删除成功"<<endl;
}
}
bool book::search(string str)
{
bool flag=false;
for(i=0;i<s;i++)
if(str==A[i].name||str==A[i].QQ||str==A[i].num)
{
cout<<A[i];
flag=true;
}
return flag;
}
void book::correct(string a,string b,string c)
{
A[index].name=a;
A[index].num=b;
A[index].QQ=c;
}
void book::print()
{
cout<<"完整通讯录系统如下"<<endl;
cout<<setw(20)<<"姓名"<<setw(20)<<"电话号码"<<setw(20)<<"QQ号码"<<endl;
for(i=0;i<s;i++)
cout<<A[i];
}
int main()
{
string str;
book P;
person S;
cout<<"请输入通讯录名单(包括人员名字,电话及QQ号码),以输入ending为结束标志(下同):"<<endl;
while(cin>>str)
{
if(str=="ending") break;
S.gets(str);
cin>>S;
if(P.finding(S))
P.gets(S);
}
P.print();
cout<<"请输入想要增加至列表的人员信息:"<<endl;
while(cin>>str)
{
if(str=="ending") break;
S.gets(str);
cin>>S;
if(P.finding(S))
P.gets(S);
}
P.print();
cout<<"请输入想要删除的人员信息:"<<endl;
string name,num,QQ;
while(cin>>str)
{
if(str=="ending") break;
cin>>num>>QQ;
P.Delete(str,num,QQ);
}
P.print();
cout<<"请输入你想要修改的人员原姓名,电话号码及QQ号码:"<<endl;
while(cin>>str)
{
if(str=="ending") break;
person temp;
temp.gets(str);
cin>>temp;
if(P.finding(temp))
cout<<"无此人员信息"<<endl;
else
{
cout<<"请输入修改后的人员姓名,电话号码及QQ号码::"<<endl;
cin>>name>>num>>QQ;
P.correct(name,num,QQ);
cout<<"修改成功!"<<endl;
}
cout<<"请输入你想要修改的人员原姓名,电话号码及QQ号码:"<<endl;
}
P.print();
cout<<"输入你想查询的人员姓名,电话号码或QQ号(仅需输入一个即可):"<<endl;
while(cin>>str)
{
if(str=="ending") break;
if(!P.search(str)) cout<<"无此人员信息"<<endl;
}
P.print();
return 0;
}