如何用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 //输入需要匹配的字符串 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