📄 1.cpp
字号:
//1.address.h
#ifndef H_ADDRESS_H_ABCDE
#define H_ADDRESS_H_ABCDE
#include <list>
using namespace std;
struct Record
{
string name;
string tel;
};
//用于存储通信录的链表
//使用的底层数据结构的是双向链表
class RecordList:public list<Record*>
{
friend ostream& operator<<(ostream& os,const RecordList& c_rl);
friend istream& operator>>(istream& is,RecordList& rl);
public:
//销毁链表中记录的所有Record所占用的内存空间,并且清空链表存储的记录
//该函数覆盖了基类中的同名函数
void clear()
{
//遍历整个链表,提取并销毁所有Record
iterator iter;
iterator it_end=end();
for(iter=begin();iter!=it_end;iter++)
{
delete *iter;
}
//调用超类的函数来清空链表
list<Record*>::clear();
}
//销毁指定的记录,然后从链表中将其删除
//该函数覆盖了基类中的同名函数
iterator erase(iterator where)
{
delete *where;
return list<Record*>::erase(where);
}
~RecordList()
{
this->clear();
}
};
#endif //H_ADDRESS_H_ABCDE
//2.address.cpp
#include<iostream>
#include<string>
#include"address.h"
#include"AddressList.h"
#include"AddressBook.h"
void 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(is,name);
if(name==" ")
break;
rec=new Record;
rec->name=name;
getline(is,rec->tel);
rl.push_back(rec);
}
return is;
}
//1.AddressList.h
#ifndef H_ADDRESSLIST_H_AAA
#define H_ADDRESSLIST_H_AAA
#include<iostream>
#include<string>
#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 passtEnd()
{
return recList.end();
}
};
#endif //H_ADDRESSLIST_H_AAA
//2.AddressList.cpp
#include "addresslist.h"
AddressList::~AddressList()
{
recList.clear();
}
void AddressList::addRecord(Record* rec)
{
if (rec!=NULL)
{
recList.push_back(rec);
}
}
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)
{
return recList.erase(it);
}
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;
}
void AddressList::saveRecords(ostream &os)
{
os<<recList;
}
int AddressList::loadRecords(istream &is)
{
int ori=size();
is>>recList;
return size()-ori;
}
//1.AddressBook.h
#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 saveRecord();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前通信录
virtual void clear();
protected:
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
};
#endif //H_ADDRESSBOOK_H_NNN
//2.AddressBook.cpp
#include <stdlib.h>
#include <fstream>
#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();
}
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()
{
whlie(true)
{
switch(menuSelect())
{
case'1':
displayRecords();
break;
case'2':
queryRecord();
break;
case'3':
addRecord();
break;
case'4':
removeRecord();
break;
case'5':
saveRecords();
break;
case'6':
loadRecords();
break;
case'7':
clear();
addRecord();
break;
case'8':
quit();
}
}
}
void AddressBook::dispTable()
{
cout<<"姓名\t\t电话"<<endl;
}
void AddressBook::displayRecords()
{
if(recList.size()==0)
{
cout<<"没有记录!";
return;
}
dispTable();
Iterator it;
Iterator it_end=recList.end();
for(it=recList.begin();it!=it_end;it++)
{
cout<<(*it)->name<<"\t\t"<<(*it)->tel<<"\n";
}
cout<<"一共有"<<size()<<"条记录\n"<<endl;
}
void AddressBook::clear()
{
if(isModified) //已改动,未保存
{
cout<<"通信录已改动,是否保存?(Y/N)\n";
char choice[2];
cin.getline(choice,2);
if(choice[0]!='n'&&choice[0]!='N')
saveRecords();
}
AddressList::clear();
isModified=false;
}
void AddressBook::queryRecord()
{
if(empty())
{
cout<<"记录是空表,退出查询操作!"<<endl;
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<int>(choice[0])-48;
//输入匹配的字符串
if(type==1)
cout<<"请输入姓名:";
else
cout<<"请输入电话:";
char pattern[20];
cin.getline(pattern,20);
int findCount=0;
//找到匹配的记录
Iterator it=findRecord(pattern,type,first());
Iterator it_end=pastEnd();
dispTable();
while(it!=it_end)
{
findCount++;
cout<<(*t)->name<<"\t\t"<<(*it)->tel<<"\n";
//取下一条匹配的记录
it=findRecord(pattern,type,++it);
}
cout<<"一共找到了"<<findCount<<"条记录\n"<<endl;
}
void AddressBook::addRecord()
{
cout<<"输入数据,输入姓名为0时结束.\n";
while(true)
{
char temp[20];
cout<<"姓名:";
cin.getline(temp,20);
if(temp[0]=='0'||temp=='\n')
break;
Record* rec=new Record;
rec->name=temp;
cout<<"电话:";
cin.getline(temp,20);
rec->tel=temp;
//将新记录加入链表
AddressList::addRecord(rec);
}
isModified=true; //记录已改动未保存
}
void AddressBook::removeRecord()
{
if(empty))
{
cout<<"通信录已空,退出删除操作!"<<endl;
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<int>(choice[0])-48;
//输入需要匹配的字符串
if(type==1)
cout<<"请输入姓名:"<<flush;
else
cout<<:请输入电话:"<<flush;
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);
deleteCount++;
}
//取下一条匹配的记录
if(it !=it_end)
it=findRecord(pattern,type,++it);
}
cout<<"一共删除了"<<deletedCount<<"条记录\n"
<<"现在还有"<<size()"条记录"<<endl;
if(deletedCount !=0)
isModified=true;
}
void AddressBook::saveRecords()
{
if(empty())
{
cout<<"没有记录可存!"<<endl;
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<<:不能存入文件!"<<endl;
return;
}
AddressList::saveRecords(of);
of.close();
cout<<size()<<"条记录已经存入文件,请继续操作。"<<endl;
isModified=false;
}
void AddressBook::loadRecords()
{
string fname;
char name[16];
cout<<"请输入要读取的文件名(直接回车选择文件sname):";
cin.getline(name.16);
fname=name;
if(fname.empty())
fname="sname";
ifstream ifs(fname.c_str(),ios_bass::in);
if(!ifs)
{
cout<<"打不开文件!请重新选择"<<endl;
return;
}
bool oriEmpty=empty();
int num=AddressList::loadRecords(ifs);
ifs.close();
cout<<"取入"<<num<<"条记录。\n"
<<"现在通信中共有"<<size()<<"条记录"<<endl;
//只有加入新记录前通信录不为空并且确实加入了新的记录才改变ismodified
if(!oriEmpty&&num!=0)
isModified=true;
}
void AddressBook::quit()
{
if(isModified)//已改动,未保存
{
cout<<"通信录已改动,是否保存?(Y/N)\n";
char choice[2];
cin.getline(choice,2);
if(choice[0]!='n'&&choice[0]!='N')
saveRecords();
}
cout<<"退出操作,再见!"<<endl;
delete this;
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -