600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 如何用C语言实现通讯录系统? – 网络

如何用C语言实现通讯录系统? – 网络

时间:2023-11-21 23:25:10

相关推荐

如何用C语言实现通讯录系统? – 网络

对通讯录应该包含有以下操作:向通讯录中添加信息,在通讯录中按姓名查找个人信息,删除通讯录中的个人信息,按不同数据项排序后列表输出通讯录中所有人的信息。通讯录中记录的数量可以是有限制的。

程序的主界面如下:

通讯录

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。