如何用C语言实现通讯录系统

更新时间:02-02 教程 由 冷兮め 分享

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

通讯录至少应该有以下数据项:姓名,地址,手机,邮编,E-mail。

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

程序的主界面如下:

通讯录

1. 添加

2. 查询

3. 删除

4. 排序

5. 全部输出

0. 退出

#include

#include

#include "address.h"

#include "addressList.h"

#include "addressBook.h"

using namespace std;

int main()

{

new AddressBook; //开启通信录

return 0;

}

ostream& operator<<(ostream& os, const RecordList& c_rl)

{

RecordList::const_iterator it;

RecordList::const_iterator it_end =c_rl.end();

for (it=c_rl.begin();it!=it_end; it++)

{

os << (*it)->name << '\n' << (*it)->tel << '\n';

}

return os;

}

istream& operator>> (istream& is, RecordList& rl)

{

Record* rec;

string name;

while (true)

{

//注意这里使用的是全局的getline()函数,而不是istream的成员函

//数.全局的getling()函数将从istream中取出最后一个分隔符,

//而istream的成员函数getline则不会

getline(is,name);

if (name =="")

break;

rec = new Record;

rec->name=name;

getline(is,rec->tel );

rl.push_back(rec);

}

return is;

}

#include

#include

#include "addressBook.h"

using namespace std;

AddressBook::AddressBook()

{

isModified = false;

start();

}

AddressBook::~AddressBook()

{

}

//功能:显示欢迎画面,并开始进行用户交互处理

void AddressBook::start()

{

cout<<"\n"

<<"\t******************************\n"

<<"\t* 这是一个 *\n"

<<"\t* 简单的通信录程序 *\n"

<<"\t* 可以对通信录进行简单管理 *\n"

<<"\t* 欢迎使用通信录 *\n"

<<"\t******************************\n"

<<"\n";

handleMenu();

}

//功能:显示通信录菜单,返回用户选择的选项

//返回:用户选择的选项,是1-9之间的一个字符

char AddressBook::menuSelect()

{

cout<<"\n"

<<"1.显示记录\n"

<<"2.查询记录\n"

<<"3.增加记录\n"

<<"4.删除记录\n"

<<"5.保存记录\n"

<<"6.读取记录\n"

<<"7.新建记录\n"

<<"8.结束运行\n"

<<"\n左边数字对应功能选择,请选1-8:";

char choice[2];

while(true)

{

cin.getline(choice,2);

if(choice[0]<'1' || choice[0]>'8')

cout<<"\n输入错误,重选1-8:";

else

break;

}

return choice[0];

}

//功能:根据用户选择的项目调用相应的处理函数

void AddressBook::handleMenu()

{

while(true)

{

switch(menuSelect())

{

case '1':

displayRecords();

break;

case '2':

queryRecord();

break;

.......

//功能:打印用于显示记录信息时的表头

void AddressBook::dispTable()

{

}

//功能:显示通信录中的所有记录

void AddressBook::displayRecords()

{

}

//功能:首先检查通信录是否已保存,然后清空当前通信录中所有记录

//注意:该函数覆盖了基类中的函数

void AddressBook::clear()

{

}

//功能:查询指定记录

void AddressBook::queryRecord()

{

//功能:向当前通信录追加新的记录

//注意:该函数重载了基类中的函数

void AddressBook::addRecord()

{

}

/*

//说明:如果使用string 类,效果更好。下面是实现本功能的程序代码:

while(true)

{

//输入新记录

string name;

cout<<"姓名:";

getline(cin,name);

//如果输入的姓名为“0”,则结束添加记录的操作

if(name=="0")

break;

Record* rec=new Record;

rec->name=name;

cout<<"电话:";

getline(cin,rec->tel);

//将新记录加入链表

AddressList::addRecord(rec);

}

//同理,下面的成员函数removeRecord()中的判断,可以使用如下替代方法:

string str;

getline(cin,str);

while(true)

{

if(str[0]!='1' && str[0]!='2')

{

cout<<"输入错误,重选1-2:";

getline(cin,str);

}

else

break;

}

*/

//功能:从当前通信录移除指定的记录

//注意:该函数重载了基类中的函数

void AddressBook::removeRecord()

{

if(empty())

{

cout<<"通信录已空,退出删除操作!"<

return;

}

//选择获取需要删除的记录的方式

cout<<"可以通过姓名或电话删除记录\n"

<<"1.通过姓名\n"

<<"2.通过电话\n";

char choice[2];

cin.getline(choice,2);

while(true)

{

if(choice[0]!='1' && choice[0]!='2')

{

cout<<"输入错误,重选1-2:";

cin.getline(choice,2);

}

else

break;

}

int type=static_cast(choice[0])-48;

//输入需要匹配的字符串

if(type==1)

cout<<"请输入姓名:"<

else

cout<<"请输入电话:"<

char pattern[20];

cin.getline(pattern,20);

int deletedCount=0;

/到匹配的记录

Iterator it=findRecord(pattern,type,first());

Iterator it_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<<"一共删除了"<

<<"现在还有"<

if(deletedCount!=0)

isModified=false;

}

//功能:将通信录保存至指定文件

//注意:该函数重载了基类中的函数

void AddressBook::saveRecords()

{

if(empty())

{

cout<<"没有记录可存!"<

return;

}

//因为下面的程序中使用string类的成员函数,所以需要进行一次转换

string fname;

char name[16];

cout<<"请输入要存在的文件名(直接回车选择文件sname):";

cin.getline(name,16);

fname=name;

if(fname.empty())

fname="sname";

ofstream of(fname.c_str(),ios_base::out);

if(!of)

{

cout<<"不能存入文件!"<

return;

}

AddressList::saveRecords(of);

of.close();

cout<

isModified=false;

}

//功能:从指定文件读取记录追加到当前通信录末尾

//注意:该函数重载了基类中的函数

void AddressBook::loadRecords()

{

}

void AddressBook::quit()

{

}

#ifndef H_ADDRESSBOOK_H_NNN

#define H_ADDRESSBOOK_H_NNN

#include "addressList.h"

//处理通信录操作的面向用户使用的类,包含所有功能的用户界面及用户交互的实现

class AddressBook :public AddressList

{

protected:

bool isModified; //通信录是否已被修改还未保存

public:

AddressBook();

virtual ~AddressBook();

//开始通信录的用户界面操作

virtual void start();

//菜单处理函数

virtual void handleMenu();

//显示记录

virtual void displayRecords();

//查询记录

virtual void queryRecord();

//增加记录

virtual void addRecord();

//删除记录

virtual void removeRecord();

//保存记录

virtual void saveRecords();

//读取记录

virtual void loadRecords();

//结束程序

virtual void quit();

//清空当前通信录

virtual void clear();

protected:

//菜单选择函数

char menuSelect();

//显示表头

void dispTable();

};

#endif //H_ADDRESSBOOK_HZ-NNN

#include "addressList.h"

AddressList::~AddressList()

{

recList.clear();

}

//功能:向通信录中添加新的记录

//参数:rec,指向新记录的指针

void AddressList::addRecord (Record* rec)

{

if (rec !=NULL)

{

recList.push_back(rec);

}

}

//功能:从通讯录中删除一个记录

//参数:it,指向欲删除记录的迭代器

//注意:it,应是可提领的迭代器,可以通过findRecord()获得

AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)

{

return recList.erase(it);

}

//功能:从通信录中寻找一个记录

//参数:pattern,欲寻找的记录的指定域与pattern相等

// type,为1表示欲寻找记录的名称(name)与pattern相等;

// 为2表示欲寻找记录的电弧(tel)与(pattern)相等。

// from,从from开始寻找匹配的记录。

//返回:若找到了则返回的迭代器指向第一个匹配记录的迭代器,

// 若找不到则返回的迭代器等于pastEnd()的返回值。

//注意:from应是可提领的迭代器。

// 第一次调用可以用first(),之后使用上一次findRecord()的返回值增1,

// 直到返回pastEnd(),便可以获得所有匹配的记录。

AddressList::Iterator AddressList::findRecord(string pattern,int type,AddressList::Iterator from)

{

Iterator it;

Iterator it_end=recList.end();

for (it=from; it!=it_end; it++)

{

if ((type==1 && (*it)->name==pattern)||(type==2 && (*it)->tel==pattern))

break;

}

return it;

}

//功能:将通信录保存到输出流中

//参数:os.指定的输出流

void AddressList::saveRecords(ostream &os)

{

os << recList;

}

//功能:从输入流中读入数据并追加到当前通信录的末尾

//参数:is,指定的输入流

//返回:读入的记录数

int AddressList::loadRecords(istream &is)

{

int ori =size();

is >> recList;

return size()-ori;

}

#ifndef H_ADDRESSLIST_H_AAA

#define H_ADDRESSLIST_H_AAA

#include

#include

#include "address.h"

using namespace std;

//处理通信录操作的底层类,包括增加记录、删

//除记录、查询记录以及保存和读取记录的函数,

//该类不涉及任何关于用户界面的操作

class AddressList

{

protected:

RecordList recList;// 使用对象成员作为数据成员

public:

typedef RecordList::iterator Iterator;

//向通信录中添加新的记录

virtual void addRecord(Record* rec);

//从通信录中删除一个记录

virtual Iterator removeRecord(Iterator it);

//从通讯录中寻找一个记录

virtual Iterator findRecord(string pattern,int type,Iterator from);

//将通信录保存到输出流中

virtual void saveRecords(ostream& os);

//从输入流中读入数据并追加到当前通信录的末尾

virtual int loadRecords(istream& is);

virtual ~AddressList();

//获得通信录中存储的记录数

const int size() const {return (int)recList.size();}

//通信录是否为空

const bool empty() const {return recList.empty();}

//清除通信录

virtual void clear() {recList.clear();}

//获得通信录的第一条记录

Iterator first(){return recList.begin();}

//获得通信录超过最后一个记录之后的迭代器

Iterator pastEnd() {return recList.end();}

};

#endif //H_ADDRESSLIST_H_AAA

声明:关于《如何用C语言实现通讯录系统》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2291181.html