⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 一个基于VC++开发环境的通信录,适用于初学者和课程设计
💻 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 + -