欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

如何用C語言實現(xiàn)通訊錄系統(tǒng)?

黃文隆2年前14瀏覽0評論

通訊錄至少應該有以下數據項:姓名,地址,手機,郵編,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