通訊錄至少應該有以下數據項:姓名,地址,手機,郵編,E-mail。
對通訊錄應該包含有以下操作:向通訊錄中添加信息,在通訊錄中按姓名查找個人信息,刪除通訊錄中的個人信息,按不同數據項排序后列表輸出通訊錄中所有人的信息。通訊錄中記錄的數量可以是有限制的。
程序的主界面如下:
通訊錄
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.結束運行\(zhòng)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類,效果更好。下面是實現(xiàn)本功能的程序代碼:
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"
<<"現(xià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()<<"條記錄已經存入文件,請繼續(xù)操作。"<<endl;
isModified=false;
}
//功能:從指定文件讀取記錄追加到當前通信錄末尾
//注意:該函數重載了基類中的函數
voidAddressBook::loadRecords()
{
}
voidAddressBook::quit()
{
}
#ifndefH_ADDRESSBOOK_H_NNN
#defineH_ADDRESSBOOK_H_NNN
#include"addressList.h"
//處理通信錄操作的面向用戶使用的類,包含所有功能的用戶界面及用戶交互的實現(xiàn)
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