对通讯录应该包含有以下操作:向通讯录中添加信息,在通讯录中按姓名查找个人信息,删除通讯录中的个人信息,按不同数据项排序后列表输出通讯录中所有人的信息。通讯录中记录的数量可以是有限制的。
程序的主界面如下:
通讯录
1.添加
2.查询
3.删除
4.排序
5.全部输出
0.退出
#include<iostream>
#include<string>
#include”address.h”
#include”addressList.h”
#include”addressBook.h”
usingnamespacestd;
intmain()
{
newAddressBook;//开启通信录
return0;
}
ostream&operator<<(ostream&os,constRecordList&c_rl)
{
RecordList::const_iteratorit;
RecordList::const_iteratorit_end=c_rl.end();
for(it=c_rl.begin();it!=it_end;it++)
{
os<<(*it)->name<<‘\n'<<(*it)->tel<<‘\n’;
}
returnos;
}
istream&operator>>(istream&is,RecordList&rl)
{
Record*rec;
stringname;
while(true)
{
//注意这里使用的是全局的getline()函数,而不是istream的成员函
//数.全局的getling()函数将从istream中取出最后一个分隔符,
//而istream的成员函数getline则不会
getline(is,name);
if(name==””)
break;
rec=newRecord;
rec->name=name;
getline(is,rec->tel);
rl.push_back(rec);
}
returnis;
}
#include<stdlib.h>
#include<fstream>
#include”addressBook.h”
usingnamespacestd;
AddressBook::AddressBook()
{
isModified=false;
start();
}
AddressBook::~AddressBook()
{
}
//功能:显示欢迎画面,并开始进行用户交互处理
voidAddressBook::start()
{
cout<<“\n”
<<“\t******************************\n”
<<“\t*这是一个*\n”
<<“\t*简单的通信录程序*\n”
<<“\t*可以对通信录进行简单管理*\n”
<<“\t*欢迎使用通信录*\n”
<<“\t******************************\n”
<<“\n”;
handleMenu();
}
//功能:显示通信录菜单,返回用户选择的选项
//返回:用户选择的选项,是1-9之间的一个字符
charAddressBook::menuSelect()
{
cout<<“\n”
<<“1.显示记录\n”
<<“2.查询记录\n”
<<“3.增加记录\n”
<<“4.删除记录\n”
<<“5.保存记录\n”
<<“6.读取记录\n”
<<“7.新建记录\n”
<<“8.结束运行\n”
<<“\n左边数字对应功能选择,请选1-8:”;
charchoice[2];
while(true)
{
cin.getline(choice,2);
if(choice[0]<‘1’||choice[0]>’8’)
cout<<“\n输入错误,重选1-8:”;
else
break;
}
returnchoice[0];
}
//功能:根据用户选择的项目调用相应的处理函数
voidAddressBook::handleMenu()
{
while(true)
{
switch(menuSelect())
{
case’1′:
displayRecords();
break;
case’2′:
queryRecord();
break;
…….
//功能:打印用于显示记录信息时的表头
voidAddressBook::dispTable()
{
}
//功能:显示通信录中的所有记录
voidAddressBook::displayRecords()
{
}
//功能:首先检查通信录是否已保存,然后清空当前通信录中所有记录
//注意:该函数覆盖了基类中的函数
voidAddressBook::clear()
{
}
//功能:查询指定记录
voidAddressBook::queryRecord()
{
//功能:向当前通信录追加新的记录
//注意:该函数重载了基类中的函数
voidAddressBook::addRecord()
{
}
/*
//说明:如果使用string类,效果更好。下面是实现本功能的程序代码:
while(true)
{
//输入新记录
stringname;
cout<<“姓名:”;
getline(cin,name);
//如果输入的姓名为“0”,则结束添加记录的操作
if(name==”0″)
break;
Record*rec=newRecord;
rec->name=name;
cout<<“电话:”;
getline(cin,rec->tel);
//将新记录加入链表
AddressList::addRecord(rec);
}
//同理,下面的成员函数removeRecord()中的判断,可以使用如下替代方法:
stringstr;
getline(cin,str);
while(true)
{
if(str[0]!=’1’&&str[0]!=’2′)
{
cout<<“输入错误,重选1-2:”;
getline(cin,str);
}
else
break;
}
*/
//功能:从当前通信录移除指定的记录
//注意:该函数重载了基类中的函数
voidAddressBook::removeRecord()
{
if(empty())
{
cout<<“通信录已空,退出删除操作!”<<endl;
return;
}
//选择获取需要删除的记录的方式
cout<<“可以通过姓名或电话删除记录\n”
<<“1.通过姓名\n”
<<“2.通过电话\n”;
charchoice[2];
cin.getline(choice,2);
while(true)
{
if(choice[0]!=’1’&&choice[0]!=’2′)
{
cout<<“输入错误,重选1-2:”;
cin.getline(choice,2);
}
else
break;
}
inttype=static_cast<int>(choice[0])-48;
//输入需要匹配的字符串
if(type==1)
cout<<“请输入姓名:”<<flush;
else
cout<<“请输入电话:”<<flush;
charpattern[20];
cin.getline(pattern,20);
intdeletedCount=0;
/到匹配的记录
Iteratorit=findRecord(pattern,type,first());
Iteratorit_end=pastEnd();
while(it!=it_end)
{
cout<<“找到一条匹配的记录:\n”;
dispTable();
cout<<(*it)->name<<“\t\t”<<(*it)->tel<<“\n”;
cout<<“确定要删除这条记录吗?[Y/N]”;
cin.getline(choice,2);
//删除这条记录
if(choice[0]!=’n’&&choice[0]!=’N’)
{
it=AddressList::removeRecord(it);
deletedCount++;
}
//取下一条匹配的记录
if(it!=it_end)
it=findRecord(pattern,type,++it);
}
cout<<“一共删除了”<<deletedCount<<“条记录\n”
<<“现在还有”<<size()<<“条记录”<<endl;
if(deletedCount!=0)
isModified=false;
}
//功能:将通信录保存至指定文件
//注意:该函数重载了基类中的函数
voidAddressBook::saveRecords()
{
if(empty())
{
cout<<“没有记录可存!”<<endl;
return;
}
//因为下面的程序中使用string类的成员函数,所以需要进行一次转换
stringfname;
charname[16];
cout<<“请输入要存在的文件名(直接回车选择文件sname):”;
cin.getline(name,16);
fname=name;
if(fname.empty())
fname=”sname”;
ofstreamof(fname.c_str(),ios_base::out);
if(!of)
{
cout<<“不能存入文件!”<<endl;
return;
}
AddressList::saveRecords(of);
of.close();
cout<<size()<<“条记录已经存入文件,请继续操作。”<<endl;
isModified=false;
}
//功能:从指定文件读取记录追加到当前通信录末尾
//注意:该函数重载了基类中的函数
voidAddressBook::loadRecords()
{
}
voidAddressBook::quit()
{
}
#ifndefH_ADDRESSBOOK_H_NNN
#defineH_ADDRESSBOOK_H_NNN
#include”addressList.h”
//处理通信录操作的面向用户使用的类,包含所有功能的用户界面及用户交互的实现
classAddressBook:publicAddressList
{
protected:
boolisModified;//通信录是否已被修改还未保存
public:
AddressBook();
virtual~AddressBook();
//开始通信录的用户界面操作
virtualvoidstart();
//菜单处理函数
virtualvoidhandleMenu();
//显示记录
virtualvoiddisplayRecords();
//查询记录
virtualvoidqueryRecord();
//增加记录
virtualvoidaddRecord();
//删除记录
virtualvoidremoveRecord();
//保存记录
virtualvoidsaveRecords();
//读取记录
virtualvoidloadRecords();
//结束程序
virtualvoidquit();
//清空当前通信录
virtualvoidclear();
protected:
//菜单选择函数
charmenuSelect();
//显示表头
voiddispTable();
};
#endif//H_ADDRESSBOOK_HZ-NNN
#include”addressList.h”
AddressList::~AddressList()
{
recList.clear();
}
//功能:向通信录中添加新的记录
//参数:rec,指向新记录的指针
voidAddressList::addRecord(Record*rec)
{
if(rec!=NULL)
{
recList.push_back(rec);
}
}
//功能:从通讯录中删除一个记录
//参数:it,指向欲删除记录的迭代器
//注意:it,应是可提领的迭代器,可以通过findRecord()获得
AddressList::IteratorAddressList::removeRecord(AddressList::Iteratorit)
{
returnrecList.erase(it);
}
//功能:从通信录中寻找一个记录
//参数:pattern,欲寻找的记录的指定域与pattern相等
//type,为1表示欲寻找记录的名称(name)与pattern相等;
//为2表示欲寻找记录的电弧(tel)与(pattern)相等。
//from,从from开始寻找匹配的记录。
//返回:若找到了则返回的迭代器指向第一个匹配记录的迭代器,
//若找不到则返回的迭代器等于pastEnd()的返回值。
//注意:from应是可提领的迭代器。
//第一次调用可以用first(),之后使用上一次findRecord()的返回值增1,
//直到返回pastEnd(),便可以获得所有匹配的记录。
AddressList::IteratorAddressList::findRecord(stringpattern,inttype,AddressList::Iteratorfrom)
{
Iteratorit;
Iteratorit_end=recList.end();
for(it=from;it!=it_end;it++)
{
if((type==1&&(*it)->name==pattern)||(type==2&&(*it)->tel==pattern))
break;
}
returnit;
}
//功能:将通信录保存到输出流中
//参数:os.指定的输出流
voidAddressList::saveRecords(ostream&os)
{
os<<recList;
}
//功能:从输入流中读入数据并追加到当前通信录的末尾
//参数:is,指定的输入流
//返回:读入的记录数
intAddressList::loadRecords(istream&is)
{
intori=size();
is>>recList;
returnsize()-ori;
}
#ifndefH_ADDRESSLIST_H_AAA
#defineH_ADDRESSLIST_H_AAA
#include<iostream>
#include<string>
#include”address.h”
usingnamespacestd;
//处理通信录操作的底层类,包括增加记录、删
//除记录、查询记录以及保存和读取记录的函数,
//该类不涉及任何关于用户界面的操作
classAddressList
{
protected:
RecordListrecList;//使用对象成员作为数据成员
public:
typedefRecordList::iteratorIterator;
//向通信录中添加新的记录
virtualvoidaddRecord(Record*rec);
//从通信录中删除一个记录
virtualIteratorremoveRecord(Iteratorit);
//从通讯录中寻找一个记录
virtualIteratorfindRecord(stringpattern,inttype,Iteratorfrom);
//将通信录保存到输出流中
virtualvoidsaveRecords(ostream&os);
//从输入流中读入数据并追加到当前通信录的末尾
virtualintloadRecords(istream&is);
virtual~AddressList();
//获得通信录中存储的记录数
constintsize()const{return(int)recList.size();}
//通信录是否为空
constboolempty()const{returnrecList.empty();}
//清除通信录
virtualvoidclear(){recList.clear();}
//获得通信录的第一条记录
Iteratorfirst(){returnrecList.begin();}
//获得通信录超过最后一个记录之后的迭代器
IteratorpastEnd(){returnrecList.end();}
};
#endif//H_ADDRESSLIST_H_AAA