C++课程设计:Address Book Management System

PhoneCardContact类
PhoneCardContact.h
#ifndef __PHONECARDCONTACT__H__
#define __PHONECARDCONTACT__H__

#include <iostream>
#include <string>
using namespace std;

/*
手机卡联系人类
数据成员:
	string name			姓名
	string phoneNumber	电话号码
成员函数:
	构造函数
	setAll	设置姓名和电话号码
	setName 设置姓名
	setPhoneNumber	设置电话号码
	modifyName	修改姓名
	modifyPhoneNumber	修改电话号码
	put	输出name和phoneNumber中的信息
	重载==号
	重载输入输出流
	getPhoneNumber	获得电话号码
	getName	获得姓名
*/

class PhoneCardContact {
public:
	PhoneCardContact(string name="", string phoneNumber="00000000000");
	void setAll(string name,string phoneNumber);
	void setName(string name);
	void setPhoneNumber(string phoneNumber);
	void modifyName(string name);
	void modifyPhoneNumber(string phoneNumber);
	void put();
	bool operator== (PhoneCardContact phonecardcontact);
	friend ostream& operator<< (ostream& output, PhoneCardContact& phonecardcontact);
	friend istream& operator>> (istream& input, PhoneCardContact& phonecardcontact);
	string getPhoneNumber();
	string getName();
protected:
	string name;
	string phoneNumber;
};

#endif
Phone Card Contact.cpp
#include "PhoneCardContact.h"

//构造函数
PhoneCardContact::PhoneCardContact(string name, string phoneNumber)
	:name(name),phoneNumber(phoneNumber)
{}

//设置姓名和电话号码
void PhoneCardContact::setAll(string name, string phoneNumber)
{
	this->name = name;
	this->phoneNumber = phoneNumber;
}

//设置姓名
void PhoneCardContact::setName(string name)
{
	this->name = name;
}

//设置电话号码
void PhoneCardContact::setPhoneNumber(string phoneNumber)
{
	this->phoneNumber = phoneNumber;
}

//修改姓名
void PhoneCardContact::modifyName(string name)
{
	this->name = name;
}

//修改电话号码
void PhoneCardContact::modifyPhoneNumber(string phoneNumber)
{
	this->phoneNumber = phoneNumber;
}

//输出name和phoneNumber中的信息
void PhoneCardContact::put()
{
	cout << "姓名:" << name << endl;
	cout << "手机号码:" << phoneNumber << endl;
	cout << endl;
}

//重载==号
bool PhoneCardContact::operator==(PhoneCardContact phonecardcontact)
{
	if (name == phonecardcontact.name && phoneNumber == phonecardcontact.phoneNumber)
		return true;
	else return false;
}

//重载输出流
ostream& operator<< (ostream& output, PhoneCardContact& phonecardcontact)
{
	output << phonecardcontact.name << '\t' << phonecardcontact.phoneNumber << endl;
	return output;
}

//重载输入流
istream& operator>> (istream& input, PhoneCardContact& phonecardcontact)
{
	input >> phonecardcontact.name;
	input >> phonecardcontact.phoneNumber;
	return input;
}

//获得电话号码
string PhoneCardContact::getPhoneNumber()
{
	return phoneNumber;
}

//获得姓名
string PhoneCardContact::getName()
{
	return name;
}
MobileContact类
MobileContact.h
#ifndef __MOBILECONTACT__H__
#define __MOBILECONTACT__H__

#include "PhoneCardContact.h"

/*
手机联系人类
数据成员:
	手机卡联系人类中的数据成员
	string birthPlace	籍贯
	string QQ			QQ号
成员函数:
	手机卡联系人类中的成员函数
	构造函数
	setBirthPlace	设置籍贯
	setQQ	设置QQ号
	modifyBirthPlace	修改籍贯
	modifyQQ	修改QQ号
	put	输出name、phoneNumber、birthPlace和QQ中的信息
	重载==号
	重载输入输出流
*/

class MobileContact :public PhoneCardContact {
public:
	MobileContact(string name="", string phoneNumber="00000000000", string birthPlace="地球", string QQ="10001");
	void setBirthPlace(string birthPlace);
	void setQQ(string QQ);
	void modifyBirthPlace(string birthPlace);
	void modifyQQ(string QQ);
	void put();
	bool operator== (MobileContact mobilecontact);
	friend ostream& operator<< (ostream& output, MobileContact& mobilecontact);
	friend istream& operator>> (istream& input, MobileContact& mobilecontact);
protected:
	string birthPlace;
	string QQ;
};

#endif
Mobile Contact.cpp
#include "MobileContact.h"

//构造函数
MobileContact::MobileContact(string name, string phoneNumber, string birthPlace, string QQ)
	:PhoneCardContact(name,phoneNumber),birthPlace(birthPlace),QQ(QQ)
{}

//设置籍贯
void MobileContact::setBirthPlace(string birthPlace)
{
	this->birthPlace = birthPlace;
}

//设置QQ号
void MobileContact::setQQ(string QQ)
{
	this->QQ = QQ;
}

//修改籍贯
void MobileContact::modifyBirthPlace(string birthPlace)
{
	this->birthPlace = birthPlace;
}

//修改QQ号
void MobileContact::modifyQQ(string QQ)
{
	this->QQ = QQ;
}

//输出name、phoneNumber、birthPlace和QQ中的信息
void MobileContact::put()
{
	cout << "姓名:" << name << endl;
	cout << "电话号码:" << phoneNumber << endl;
	cout << "籍贯:" << birthPlace << endl;
	cout << "QQ号:" << QQ << endl;
	cout << endl;
}

//重载==号
bool MobileContact::operator== (MobileContact mobliccontact)
{
	if (name == mobliccontact.name && phoneNumber == mobliccontact.phoneNumber &&
		birthPlace == mobliccontact.birthPlace && QQ == mobliccontact.QQ)
		return true;
	else return false;
}

//重载输出流
ostream& operator<< (ostream& output, MobileContact& mobilecontact)
{
	output << mobilecontact.name << '\t' << mobilecontact.phoneNumber << "\t";
	output << mobilecontact.birthPlace << '\t' << mobilecontact.QQ << endl;
	return output;
}

//重载输入流
istream& operator>> (istream& input, MobileContact& mobilecontact)
{
	input >> mobilecontact.name >> mobilecontact.phoneNumber;
	input >> mobilecontact.birthPlace >> mobilecontact.QQ;
	return input;
}
AddressBook类
AddressBook.h
#ifndef __ADDRESSBOOK__H__
#define __ADDRESSBOOK__H__

#include <fstream>
#include "PhoneCardContact.h"
#include "MobileContact.h"

/*
通讯簿抽象类
成员变量:
	size	用于储存通讯录中的联系人个数
成员函数:
	构造函数
	纯虚函数:
		add		向通讯录中添加一个联系人
		remove	删除通讯录中的某个人
		displayAll	显示通讯录中的全部联系人
		change	修改某个联系人的信息
		find	根据电话号码查找某个联系人,返回所在的数组下标
		put		输出某个联系人的信息
	getSize		返回size的值,即联系人的数目
	checkFile	有两个重载版本,检查in/outfile文件是否已经成功打开
	checkBound	检查该idx下标是否越界
	checkMemory	检查联系人是否已满(最大是1000)
*/

class AddressBook {
public:
	AddressBook();
	virtual void add() = 0;
	virtual void remove(int idx)=0;
	virtual void displayAll()=0;
	virtual void change(int idx)=0;
	virtual int find(string phonenumber)=0;
	virtual void put(int idx) = 0;
	int getSize();
protected:
	int size;
	void checkFile(ifstream& infile);
	void checkFile(ofstream& outfile);
	bool checkBound(int idx);
	bool checkMemory();
};

#endif
Address Book.cpp
#include "AddressBook.h"

//构造函数
AddressBook::AddressBook()
	:size(0)
{}

//返回size的值,即联系人的数目
int AddressBook::getSize()
{
	return size;
}

//检查infile文件是否已经成功打开
void AddressBook::checkFile(ifstream& infile)
{
	if (!infile.is_open())
	{
		cout << "Can't open this file!" << endl;
		exit(0);
	}
}

//检查outfile文件是否已经成功打开
void AddressBook::checkFile(ofstream& outfile)
{
	if (!outfile.is_open())
	{
		cout << "Can't open this file!" << endl;
		exit(0);
	}
}

//检查该idx下标是否越界
bool AddressBook::checkBound(int idx)
{
	if (idx >= size||idx < 0) {
		cout << "输入的下标越界,该操作无效。" << endl;
		return false;
	}
	else return true;
}

//检查联系人是否已满(最大是1000)
bool AddressBook::checkMemory()
{
	if (size >= 1000) {
		cout << "内存已满,无法添加!" << endl;
		return false;
	}
	else return true;
}
PhoneCardAddressBook类
PhoneCardAddressBook.h
#ifndef __PHONECARDADDRESSBOOK__H__
#define __PHONECARDADDRESSBOOK__H__

#include "AddressBook.h"
#include <unordered_map>

/*
手机卡通讯簿类(继承于通讯簿抽象类)
拥有通讯簿抽象类中的成员变量和函数
成员变量:
	PhoneCardContact pcc[1000]	手机卡联系人类数组,最大为1000
	unordered_map<string, int> pccMap	哈希表map,用于通过电话号码找到对应的数组下标<string(电话号码),int(数组下标)>
成员函数:
	构造函数	将文件中的数据加载到数组中
	析构函数	将数组中的数据保存到文件中
	add(无参版)	通过函数中输入的方式向数组中添加一个联系人
	add(有参数版)	通过传参的方式向数组中添加一个联系人
	remove		删除通讯录中的某个人
	displayAll	显示通讯录中的全部联系人
	change(一参数版)	通过函数中输入的方式修改某个联系人的信息
	change(两参数版)	通过传参的方式向修改某个联系人的信息
	find	根据电话号码查找某个联系人,返回所在的数组下标
	put		输出某个联系人的信息
	get		返回某一联系人
	重载[]
*/

class PhoneCardAddressBook :public AddressBook {
public:
	PhoneCardAddressBook();
	~PhoneCardAddressBook();
	virtual void add();
	void add(PhoneCardContact phonecardContact);
	virtual void remove(int idx);
	virtual void displayAll();
	virtual void change(int idx);
	void change(int idx,PhoneCardContact phonecardcontact);
	virtual int find(string phonenumber);
	virtual void put(int idx);
	PhoneCardContact get(int idx);
	PhoneCardContact operator[] (int idx) const;
protected:
	PhoneCardContact pcc[1000];
	unordered_map<string, int> pccMap;
};

#endif
Phone Card Address Book.cpp
#include "PhoneCardAddressBook.h"

//构造函数	将文件中的数据加载到数组中
PhoneCardAddressBook::PhoneCardAddressBook()
{
	string s;
	ifstream infile;
	PhoneCardContact phonecardcontact;

	infile.open("Phone Card.txt",ios::in);	//打开文件
	checkFile(infile);	//检查文件是否成功打开

	getline(infile, s);	//过滤前两行的无用信息
	getline(infile, s);
	while (infile >> phonecardcontact)
	{
		if (!checkMemory()) break;
		pccMap[phonecardcontact.getPhoneNumber()] = size;	//建立映射
		pcc[size++] = phonecardcontact;		//储存到数组中
	}
	infile.close();
}

//析构函数	将数组中的数据保存到文件中
PhoneCardAddressBook::~PhoneCardAddressBook()
{
	ofstream outfile;
	outfile.open("Phone Card.txt", ios::out);
	checkFile(outfile);

	outfile << "所有电话卡储存的联系人信息:" << endl;
	outfile << "姓名" << '\t' << "电话号码" << endl;
	for (int i = 0; i < size; i++)
	{
		outfile << pcc[i] << endl;		//将信息输出到文件中
	}
	outfile.close();
}

//(有参数版)	通过传参的方式向数组中添加一个联系人
void PhoneCardAddressBook::add(PhoneCardContact phonecardcontact)
{
	if (!checkMemory()) return;
	pccMap[phonecardcontact.getPhoneNumber()] = size;
	pcc[size++] = phonecardcontact;
}

//(无参版)	通过函数中输入的方式向数组中添加一个联系人
void PhoneCardAddressBook::add()
{
	if (!checkMemory()) return;
	PhoneCardContact phonecardcontact;
	cout << "请输入姓名和电话号码" << endl;
	cin >> phonecardcontact;
	pccMap[phonecardcontact.getPhoneNumber()] = size;
	pcc[size++] = phonecardcontact;
}

//删除通讯录中的某个人
void PhoneCardAddressBook::remove(int idx)
{
	if (!checkBound(idx)) return;

	pccMap[pcc[idx].getPhoneNumber()] = -1;
	size--;
	for (int i = idx; i < size; i++)
		pcc[i] = pcc[i + 1];
}

//显示通讯录中的全部联系人
void PhoneCardAddressBook::displayAll()
{
	cout << "手机卡储存的联系人共" << size << "人,信息为:" << endl;
	cout << "姓名" << '\t' << "电话号码" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << pcc[i] << endl;
	}
}

//通过函数中输入的方式修改某个联系人的信息
void PhoneCardAddressBook::change(int idx)
{
	if (!checkBound(idx)) return;

	pccMap[pcc[idx].getPhoneNumber()] = -1;
	PhoneCardContact phonecardcontact;
	cout << "请输入姓名和电话号码" << endl;
	cin >> phonecardcontact;
	pcc[idx] = phonecardcontact;
	pccMap[pcc[idx].getPhoneNumber()] = idx;
}

//通过传参的方式向修改某个联系人的信息
void PhoneCardAddressBook::change(int idx, PhoneCardContact phonecardcontact)
{
	if (!checkBound(idx)) return;

	pccMap[pcc[idx].getPhoneNumber()] = -1;
	pcc[idx] = phonecardcontact;
	pccMap[pcc[idx].getPhoneNumber()] = idx;
}

//返回某一联系人
PhoneCardContact PhoneCardAddressBook::get(int idx)
{
	if (!checkBound(idx)) return PhoneCardContact();

	return pcc[idx];
}

//输出某个联系人的信息
void PhoneCardAddressBook::put(int idx)
{
	if (!checkBound(idx)) return;
	pcc[idx].put();
}

//根据电话号码查找某个联系人,返回所在的数组下标
int PhoneCardAddressBook::find(string phonenumber)
{
	if (pccMap.count(phonenumber) == 0) { return -1; }
	return pccMap[phonenumber];
}

//重载[]
PhoneCardContact PhoneCardAddressBook::operator[](int idx) const
{
	if (idx >= size || idx < 0) {
		cout << "下标越界,操作无效!" << endl;
		return PhoneCardContact();
	}
	return pcc[idx];
}
MobileaddressBook类
MobileaddressBook.h
#ifndef __MOBILEADDRESSBOOK__H__
#define __MOBILEADDRESSBOOK__H__

#include "AddressBook.h"
#include <unordered_map>

/*
手机通讯簿类(继承于通讯簿抽象类)
拥有通讯簿抽象类中的成员变量和函数
成员变量:
	MobileContact mc[1000]	手机联系人类数组,最大为1000
	unordered_map<string, int> mcMap	哈希表map,用于通过电话号码找到对应的数组下标<string(电话号码),int(数组下标)>
成员函数:
	构造函数	将文件中的数据加载到数组中
	析构函数	将数组中的数据保存到文件中
	add(无参版)	通过函数中输入的方式向数组中添加一个联系人
	add(有参数版)	通过传参的方式向数组中添加一个联系人
	remove		删除通讯录中的某个人
	displayAll	显示通讯录中的全部联系人
	change(一参数版)	通过函数中输入的方式修改某个联系人的信息
	change(两参数版)	通过传参的方式向修改某个联系人的信息
	find	根据电话号码查找某个联系人,返回所在的数组下标
	put		输出某个联系人的信息
	get		返回某一联系人
	重载[]
*/

class MobileAddressBook :public AddressBook {
public:
	MobileAddressBook();
	~MobileAddressBook();
	virtual void add();
	void add(MobileContact mobilecontact);
	virtual void remove(int idx);
	virtual void displayAll();
	virtual void change(int idx);
	void change(int idx, MobileContact mobilecontact);
	virtual int find(string phonenumber);
	virtual void put(int idx);
	MobileContact get(int idx);
	MobileContact operator[](int idx) const;
protected:
	MobileContact mc[1000];
	unordered_map<string, int> mcMap;
};

#endif
Mobile address Book.cpp
#include "MobileAddressBook.h"

//构造函数	将文件中的数据加载到数组中
MobileAddressBook::MobileAddressBook()
{
	string s;
	ifstream infile;
	MobileContact mobilecontact;

	infile.open("Mobile.txt", ios::in);
	checkFile(infile);	//判断文件是否打开成功

	getline(infile, s);
	getline(infile, s);
	while (infile >> mobilecontact)		//从文件中读取数据
	{
		if (!checkMemory()) break;
		mcMap[mobilecontact.getPhoneNumber()] = size;	//建立映射
		mc[size++] = mobilecontact;
	}
	infile.close();
}

//析构函数	将数组中的数据保存到文件中
MobileAddressBook::~MobileAddressBook()
{
	ofstream outfile;
	outfile.open("Mobile.txt", ios::out);
	checkFile(outfile);

	outfile << "所有手机储存的联系人信息:" << endl;
	outfile << "姓名\t电话号码\t\t籍贯\tQQ号" << endl;
	for (int i = 0; i < size; i++)
	{
		outfile << mc[i] << endl;	//将所有的联系人信息输出到文件中
	}
	outfile.close();
}

//通过传参的方式向数组中添加一个联系人
void MobileAddressBook::add(MobileContact mobilecontact)
{
	if (!checkMemory()) return;
	mcMap[mobilecontact.getPhoneNumber()] = size;
	mc[size++] = mobilecontact;
}

//通过函数中输入的方式向数组中添加一个联系人
void MobileAddressBook::add()
{
	if (!checkMemory()) return;
	MobileContact mobilecontact;
	cout << "请输入姓名、电话号码、籍贯和QQ号" << endl;
	cin >> mobilecontact;
	
	mcMap[mobilecontact.getPhoneNumber()] = size;
	mc[size++] = mobilecontact;
}

//删除通讯录中的某个人
void MobileAddressBook::remove(int idx)
{
	if (!checkBound(idx)) return;

	mcMap[mc[idx].getPhoneNumber()] = -1;
	size--;
	for (int i = idx; i < size; i++)
		mc[i] = mc[i + 1];
}

//显示通讯录中的全部联系人
void MobileAddressBook::displayAll()
{
	cout << "手机储存的联系人共" << size << "人,信息为:" << endl;
	cout << "姓名\t电话号码\t籍贯\tQQ号" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << mc[i] << endl;
	}
}

//通过函数中输入的方式修改某个联系人的信息
void MobileAddressBook::change(int idx)
{
	if (!checkBound(idx)) return;

	mcMap[mc[idx].getPhoneNumber()] = -1;
	MobileContact mobilecontact;
	cout << "请输入姓名、电话号码、籍贯和QQ号" << endl;
	cin >> mobilecontact;
	mc[idx] = mobilecontact;
	mcMap[mc[idx].getPhoneNumber()] = idx;
}

//通过传参的方式向修改某个联系人的信息
void MobileAddressBook::change(int idx, MobileContact mobilecontact)
{
	if (!checkBound(idx)) return;
	mcMap[mc[idx].getPhoneNumber()] = -1;
	mc[idx] = mobilecontact;
	mcMap[mc[idx].getPhoneNumber()] = idx;
}

//返回某一联系人
MobileContact MobileAddressBook::get(int idx)
{
	if (!checkBound(idx)) return MobileContact();
	
	return mc[idx];
}

//输出某个联系人的信息
void MobileAddressBook::put(int idx)
{
	if (!checkBound(idx)) return;

	mc[idx].put();
}

//根据电话号码查找某个联系人,返回所在的数组下标
int MobileAddressBook::find(string phonenumber)
{
	if (mcMap.count(phonenumber) == 0) { return -1; }
	return mcMap[phonenumber];
}

//重载[]
MobileContact MobileAddressBook::operator[] (int idx) const
{
	if (idx >= size || idx < 0) {
		cout << "下标越界,操作无效!" << endl;
		return MobileContact();
	}
	return mc[idx];
}
Uesr类
Uesr.h
#ifndef __USER__H__
#define __USER__H__

#include "PhoneCardAddressBook.h"
#include "MobileAddressBook.h"

/*
用户类
成员变量:
	AddressBook* addressbook	抽象类指针(用于实现多态)
	PhoneCardAddressBook phonecardaddressbook	手机卡联系人通讯簿类
	MobileAddressBook mobileaddressbook		手机联系人通讯簿类
	三种设备选法
	const static int PHONRCARD	手机卡
	const static int MOBILE		手机
	const static int BOTH		手机和手机卡
成员函数:
	构造函数	为了初始化addressbook
	add		添加一个联系人(入口),通过下面的四个函数实现
		addPhoneCard(无参版)	在手机卡上添加一个联系人,通过函数中输入实现
		addMobile(无参版)		在手机上添加一个联系人,通过函数中输入实现
		addPhoneCard(有参版)	在手机卡上添加一个联系人,通过传参实现
		addMobile(有参版)		在手机上添加一个联系人,通过传参实现

	remove	删除一个联系人(入口),通过下面的两个函数实现
		removePhoneCard		删除手机卡中的某个联系人
		removeMobile		删除手机中的某个联系人

	displayAll	输出所有的联系人信息(入口),通过下面的两个函数实现
		displayPhoneCard	输出手机卡中的全部联系人
		displayMobile		输出手机中的全部联系人

	modify	修改某个联系人(入口),通过下面的两个函数实现
		modifyPhoneCard		修改手机卡中的联系人
		modifyMobile		修改手机中的联系人

	find	根据姓名找出该联系人的信息
	moveCardToMobile	将手机卡中的联系人移动到手机中
	moveMobileToCard	将手机中的联系人移动到手机卡中
	copyCardToMobile	将手机卡中的联系人拷贝到手机中
	copyMobileToCard	将手机中的联系人拷贝到手机卡中
*/

class User {
public:
	User();
	void add(const int device);
	void remove(const int device,string phonenumber);
	void displayAll(const int device);
	void modify(const int device,string phonenumber);
	void find(string phonenumber);
	bool moveCardToMobile();
	bool moveMobileToCard();
	bool copyCardToMobile();
	bool copyMobileToCard();
	const static int PHONRCARD;
	const static int MOBILE;
	const static int BOTH;
private:
	void addPhoneCard();
	void addMobile();
	void addPhoneCard(PhoneCardContact phonecardcontact);
	void addMobile(MobileContact mobilecontact);
	bool removePhoneCard(string phonenumber);
	bool removeMobile(string phonenumber);
	void displayPhoneCard();
	void displayMobile();
	PhoneCardContact modifyPhoneCard(string phonenumber);
	MobileContact modifyMobile(string phonenumber);

	AddressBook* addressbook;
	PhoneCardAddressBook phonecardaddressbook;
	MobileAddressBook mobileaddressbook;
};

#endif
Uesr.cpp
#include "User.h"

User::User()
{
	addressbook = &mobileaddressbook;
}

//(无参版)	在手机上添加一个联系人,通过函数中输入实现
void User::addMobile()
{
	addressbook = &mobileaddressbook;
	addressbook->add();
}

//(无参版)	在手机卡上添加一个联系人,通过函数中输入实现
void User::addPhoneCard()
{
	addressbook = &phonecardaddressbook;
	addressbook->add();
}

//(有参版)	在手机上添加一个联系人,通过传参实现
void User::addMobile(MobileContact mobilecontact)
{
	mobileaddressbook.add(mobilecontact);
}

//(有参版)	在手机卡上添加一个联系人,通过传参实现
void User::addPhoneCard(PhoneCardContact phonecardcontact)
{
	phonecardaddressbook.add(phonecardcontact);
}

//删除手机中的某个联系人
bool User::removeMobile(string phonenumber)
{
	addressbook = &mobileaddressbook;
	int idx = addressbook->find(phonenumber);		//通过find查找该联系人是否存在
	if (idx == -1) { cout << "手机中未找到该联系人" << endl; return false; }

	cout << "删除的联系人信息为:" << endl;
	addressbook->put(idx);			//打印联系人的原信息
	addressbook->remove(idx);		//删除该联系人
	return true;
}

//删除手机卡中的某个联系人
bool User::removePhoneCard(string phonenumber)
{
	addressbook = &phonecardaddressbook;
	int idx = addressbook->find(phonenumber);		//同理
	if (idx == -1) { cout << "手机卡中未找到该联系人" << endl; return false; }

	cout << "删除的联系人信息为:" << endl;
	addressbook->put(idx);
	addressbook->remove(idx);
	return true;
}

//输出手机中的全部联系人
void User::displayMobile()
{
	addressbook = &mobileaddressbook;
	addressbook->displayAll();
}

//输出手机卡中的全部联系人
void User::displayPhoneCard()
{
	addressbook = &phonecardaddressbook;
	addressbook->displayAll();
}

//修改手机中的联系人
MobileContact User::modifyMobile(string phonenumber)
{
	addressbook = &mobileaddressbook;
	int idx = addressbook->find(phonenumber);	//查找是否存在该联系人
	if (idx == -1) { cout << "手机中未找到该联系人" << endl; return MobileContact(); }

	system("cls");		//清屏
	cout << endl << "联系人原信息为:" << endl;
	addressbook->put(idx);
	MobileContact mobilecontact = mobileaddressbook[idx];	//输出修改选择框架
	cout << "**********************************" << endl;
	cout << "* 修改姓名,请输入1              *" << endl;
	cout << "* 修改电话号码,请输入2          *" << endl;
	cout << "* 修改籍贯,请输入3              *" << endl;
	cout << "* 修改QQ号,请输入4              *" << endl;
	cout << "* 保存并退出,请输入0            *" << endl;
	cout << "**********************************" << endl;
	while (1)
	{
		cout << "请输入指令:";		//通过不同的指令实现不同的修改
		int oper;
		cin >> oper;
		string temp;
		switch (oper)
		{
		case 1:
			cout << "请输入姓名:";
			cin >> temp;
			mobilecontact.modifyName(temp);
			break;
		case 2:
			cout << "请输入电话号码:";
			cin >> temp;
			mobilecontact.modifyPhoneNumber(temp);
			break;
		case 3:
			cout << "请输入籍贯:";
			cin >> temp;
			mobilecontact.modifyBirthPlace(temp);
			break;
		case 4:
			cout << "请输入QQ号:";
			cin >> temp;
			mobilecontact.modifyQQ(temp);
			break;
		case 0:
			mobileaddressbook.change(idx, mobilecontact);
			cout << endl << "修改成功!" << endl;
			return mobilecontact;
		default:
			cout << "无效的输入!" << endl;
		}
	}
}

//修改手机卡中的联系人
PhoneCardContact User::modifyPhoneCard(string phonenumber)
{
	addressbook = &phonecardaddressbook;
	int idx = addressbook->find(phonenumber);		//同理
	if (idx == -1) { cout << "手机卡中未找到该联系人" << endl; return PhoneCardContact(); }

	system("cls");
	cout << endl << "联系人原信息为:" << endl;
	addressbook->put(idx);
	PhoneCardContact phonecardcontact = phonecardaddressbook[idx];
	cout << "**********************************" << endl;
	cout << "* 修改姓名,请输入1              *" << endl;
	cout << "* 修改电话号码,请输入2          *" << endl;
	cout << "* 保存并退出,请输入0            *" << endl;
	cout << "**********************************" << endl;
	while (1)
	{
		cout << "请输入指令:";
		int oper;
		cin >> oper;
		string temp;
		switch (oper)
		{
		case 1:
			cout << "请输入姓名:";
			cin >> temp;
			phonecardcontact.modifyName(temp);
			break;
		case 2:
			cout << "请输入电话号码:";
			cin >> temp;
			phonecardcontact.modifyPhoneNumber(temp);
			break;
		case 0:
			phonecardaddressbook.change(idx, phonecardcontact);
			cout << endl << "修改成功!" << endl;
			return phonecardcontact;
		default:
			cout << "无效的输入!" << endl;
		}
	}
}

//---------------------------------------------
//三种设备选择
const int User::PHONRCARD = 1;
const int User::MOBILE = 2;
const int User::BOTH = 3;

//添加一个联系人(入口)
void User::add(const int device)
{	//选择不同设备,执行不同的选择
	if (device == PHONRCARD) addPhoneCard();
	else if (device == MOBILE) addMobile();
	else if (device == BOTH) {
		MobileContact mobilecontact;
		cout << "请输入姓名、电话号码、籍贯和QQ号" << endl;
		cin >> mobilecontact;
		addMobile(mobilecontact);
		PhoneCardContact phonecardcontact = mobilecontact;	//将手机类型转化为手机卡类型再进行添加
		addPhoneCard(phonecardcontact);
	}
	else { cout << "无效的设备选择!" << endl; return; }
	cout << "添加成功!" << endl;
}

//删除一个联系人(入口)
void User::remove(const int device,string phonenumber)
{
	bool flag;
	if (device == PHONRCARD) flag=removePhoneCard(phonenumber);
	else if (device == MOBILE) flag=removeMobile(phonenumber);
	else if (device == BOTH) {
		flag=removePhoneCard(phonenumber);
		flag=removeMobile(phonenumber);
	}
	else { cout << "无效的设备选择!" << endl; return; }
	if(flag) cout << endl << "删除成功!" << endl;
}

//输出所有的联系人信息(入口)
void User::displayAll(const int device)
{
	if (device == PHONRCARD) displayPhoneCard();
	else if (device == MOBILE) displayMobile();
	else if (device == BOTH) {
		displayPhoneCard();
		cout << endl;
		displayMobile();
	}
	else { cout << "无效的设备选择!" << endl; return; }
}

//修改某个联系人(入口)
void User::modify(const int device,string phonenumber)
{
	if (device == PHONRCARD) modifyPhoneCard(phonenumber);
	else if (device == MOBILE) modifyMobile(phonenumber);
	else if (device == BOTH) {
		MobileContact mobilecontact = modifyMobile(phonenumber);
		if(mobilecontact==MobileContact()) modifyPhoneCard(phonenumber);
		else {	//优先修改手机类型,然后转化为手机卡类型再进行添加
			PhoneCardContact phonecardcontact = mobilecontact;
			addressbook = &phonecardaddressbook;
			int idx = addressbook->find(phonenumber);
			if (idx == -1) { cout << "手机卡中未找到该联系人" << endl; return ; }

			phonecardaddressbook.change(idx, phonecardcontact);
		}
	}
	else { cout << "无效的设备选择!" << endl; return; }
}

//根据姓名找出该联系人的信息
void User::find(string name)
{
	bool find_it = false;
	for (int i = 0; i < mobileaddressbook.getSize(); i++)
	{
		if (name == mobileaddressbook[i].getName()) find_it = true, mobileaddressbook[i].put();
	}

	for (int i = 0; i < phonecardaddressbook.getSize(); i++)
	{
		if (name == phonecardaddressbook[i].getName()) find_it = true, phonecardaddressbook[i].put();
	}

	if (!find_it) cout << "未找到该联系人!" << endl;
}

//将手机中的联系人移动到手机卡中
bool User::moveMobileToCard()
{
	copyMobileToCard();		//调用拷贝方式进行移动
	for (int i = mobileaddressbook.getSize() - 1; i >= 0; i--)	//然后删除原信息
	{
		mobileaddressbook.remove(i);
	}
	if (mobileaddressbook.getSize() == 0) return true;
	else return false;
}

//将手机卡中的联系人移动到手机中
bool User::moveCardToMobile()
{
	copyCardToMobile();			//同理
	for (int i = phonecardaddressbook.getSize() - 1; i >= 0; i--)
	{
		phonecardaddressbook.remove(i);
	}
	if (phonecardaddressbook.getSize() == 0) return true;
	else return false;
}

//将手机中的联系人拷贝到手机卡中
bool User::copyMobileToCard()
{
	for (int i = 0; i < mobileaddressbook.getSize(); i++)
	{
		string name = mobileaddressbook[i].getName();
		string phonenumber = mobileaddressbook[i].getPhoneNumber();
		int idx = phonecardaddressbook.find(phonenumber);
		if(idx==-1) phonecardaddressbook.add(PhoneCardContact(name,phonenumber));
	}
	return true;
}

//将手机卡中的联系人拷贝到手机中
bool User::copyCardToMobile()
{
	for (int i = 0; i < phonecardaddressbook.getSize(); i++)
	{
		string name = phonecardaddressbook[i].getName();
		string phonenumber = phonecardaddressbook[i].getPhoneNumber();
		int idx = mobileaddressbook.find(phonenumber);
		if (idx == -1) mobileaddressbook.add(MobileContact(name, phonenumber));
	}
	return true;
}
DisplayInterface
DisplayInterface.h
#ifndef __DISPLAYINTERFACE__H__
#define __DISPLAYINTERFACE__H__

#include "User.h"

/*
显示菜单类
成员变量:
	User user		通过它来进行操作
成员函数:
	构造函数	通过构造函数来直接显示页面
	display		显示主页面
	addOne		显示添加页面
	removeOne	显示删除页面
	modifyOne	显示修改页面
	findOne		显示查找页面
	putAll		显示选择页面
	CardToMobile	显示转移页面
	MobileToCard	显示转移页面
*/

class DisplayInterface {
public:
	DisplayInterface(bool is_display=true);
	void display();
private:
	User user;
	void addOne();
	void removeOne();
	void modifyOne();
	void findOne();
	void putAll();
	void CardToMobile();
	void MobileToCard();
};

#endif
Display Interface.cpp
#include <conio.h>
#include <Windows.h>
#include "DisplayInterface.h"

//可以通过构造函数来直接显示页面,默认显示
DisplayInterface::DisplayInterface(bool is_display)
{
	if(is_display) display();
}

//显示主页面
void DisplayInterface::display()
{
	system("color 3F");		//上色
	while (true)
	{
		int oper;
		cout << "*************************************************" << endl;
		cout << "* 菜单:                                         *" << endl;
		cout << "*                                               *" << endl;
		cout << "* 建新联系人,请输入1                           *" << endl;
		cout << "* 删除联系人,请输入2                           *" << endl;
		cout << "* 修改联系人信息,请输入3                       *" << endl;
		cout << "* 查询联系人信息,请输入4                       *" << endl;
		cout << "* 显示全部联系人,请输入5                       *" << endl;
		cout << "* 将手机中储存的联系人导入手机卡中,请输入6     *" << endl;
		cout << "* 将手机卡中储存的联系人导入手机中,请输入7     *" << endl;
		cout << "* 退出,请输入0                                 *" << endl;
		cout << "*                                               *" << endl;
		cout << "*************************************************" << endl;
		cout << "请输入指令:";
		cin >> oper;		//通过输入来实现不同功能
		switch (oper)
		{
		case 1:
			addOne();
			break;
		case 2:
			removeOne();
			break;
		case 3:
			modifyOne();
			break;
		case 4:
			findOne();
			break;
		case 5:
			putAll();
			break;
		case 6:
			MobileToCard();
			break;
		case 7:
			CardToMobile();
			break;
		case 0:
			return;
		default:
			cout << "无效的输入!" << endl;
		}
		cout << "按任意键继续....." << endl;
		_getch();		//实现“按任意键继续”操作
		system("cls");	//清屏
	}
}

//显示添加页面
void DisplayInterface::addOne()
{
	system("cls");
	int x;
	cout << "**********************************" << endl;
	cout << "* 请选择添加设备:               *" << endl;
	cout << "*                                *" << endl;
	cout << "* 添加到手机卡中,请输入1        *" << endl;
	cout << "* 添加到手机中,请输入2          *" << endl;
	cout << "* 都添加,请输入3                *" << endl;
	cout << "* 返回,请输入0                  *" << endl;
	cout << "*                                *" << endl;
	cout << "**********************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	switch (x)
	{
	case 1: user.add(User::PHONRCARD); break;
	case 2: user.add(User::MOBILE); break;
	case 3: user.add(User::BOTH); break;
	case 0: return;
	default: cout << "无效的输入!" << endl;
	}
}

//显示删除页面
void DisplayInterface::removeOne()
{
	system("cls");
	int x;
	cout << "********************************************" << endl;
	cout << "* 请选择删除设备:                         *" << endl;
	cout << "*                                          *" << endl;
	cout << "* 只删除手机卡中的联系人信息,请输入1      *" << endl;
	cout << "* 只删除手机中的联系人信息,请输入2        *" << endl;
	cout << "* 都删除,请输入3                          *" << endl;
	cout << "* 返回,请输入0                            *" << endl;
	cout << "*                                          *" << endl;
	cout << "********************************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	if (x == 0) return;
	string phonenumber;
	cout << "请输入电话号码:";
	cin >> phonenumber;
	switch (x)
	{
	case 1: user.remove(User::PHONRCARD,phonenumber); break;
	case 2: user.remove(User::MOBILE,phonenumber); break;
	case 3: user.remove(User::BOTH,phonenumber); break;
	default: cout << "无效的输入!" << endl;
	}
}

//显示修改页面
void DisplayInterface::modifyOne()
{
	system("cls");
	int x;
	cout << "************************************************" << endl;
	cout << "* 请选择修改设备:                             *" << endl;
	cout << "*                                              *" << endl;
	cout << "* 只修改手机卡中的联系人信息,请输入1          *" << endl;
	cout << "* 只修改手机中的联系人信息,请输入2            *" << endl;
	cout << "* 都都修改,请输入3                            *" << endl;
	cout << "* 返回,请输入0                                *" << endl;
	cout << "*                                              *" << endl;
	cout << "************************************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	if (x == 0) return;
	string phonenumber;
	cout << "请输入电话号码:";
	cin >> phonenumber;
	switch (x)
	{
	case 1: user.modify(User::PHONRCARD, phonenumber); break;
	case 2: user.modify(User::MOBILE, phonenumber); break;
	case 3: user.modify(User::BOTH, phonenumber); break;
	default: cout << "无效的输入!" << endl;
	}
}

//显示查找页面
void DisplayInterface::findOne()
{
	system("cls");
	string name;
	cout << "请输入该联系人的姓名:";
	cin >> name;
	user.find(name);
}

//显示选择页面
void DisplayInterface::putAll()
{
	system("cls");
	int x;
	cout << "*************************************************" << endl;
	cout << "* 请选择输出设备:                              *" << endl;
	cout << "*                                               *" << endl;
	cout << "* 显示电话卡中的全部联系人信息,请输入1         *" << endl;
	cout << "* 显示电话中的全部联系人信息,请输入2           *" << endl;
	cout << "* 显示全部联系人信息,请输入3                   *" << endl;
	cout << "* 返回,请输入0                                 *" << endl;
	cout << "*                                               *" << endl;
	cout << "*************************************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	switch (x)
	{
	case 1: user.displayAll(User::PHONRCARD); break;
	case 2: user.displayAll(User::MOBILE); break;
	case 3: user.displayAll(User::BOTH); break;
	case 0: return;
	default: cout << "无效的输入!" << endl;
	}
}

//显示转移页面
void DisplayInterface::MobileToCard()
{
	system("cls");
	int x;
	cout << "*****************************" << endl;
	cout << "* 请选择导入方式            *" << endl;
	cout << "*                           *" << endl;
	cout << "* 拷贝,请输入1             *" << endl;
	cout << "* 移动,请输入2             *" << endl;
	cout << "* 返回,请输入0             *" << endl;
	cout << "*                           *" << endl;
	cout << "*****************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	bool is_success = false;
	switch (x)
	{
	case 1: is_success = user.copyMobileToCard(); break;
	case 2: is_success = user.moveMobileToCard(); break;
	case 0: return;
	default: cout << "无效的输入!" << endl;
	}
	if (is_success) cout << "导入成功!" << endl;
}

//显示转移页面
void DisplayInterface::CardToMobile()
{
	system("cls");
	int x;
	cout << "*****************************" << endl;
	cout << "* 请选择导入方式            *" << endl;
	cout << "*                           *" << endl;
	cout << "* 拷贝,请输入1             *" << endl;
	cout << "* 移动,请输入2             *" << endl;
	cout << "* 返回,请输入0             *" << endl;
	cout << "*                           *" << endl;
	cout << "*****************************" << endl;
	cout << "请输入指令:";
	cin >> x;
	bool is_success = false;
	switch (x)
	{
	case 1: is_success = user.copyCardToMobile(); break;
	case 2: is_success = user.moveCardToMobile(); break;
	case 0: return;
	default: cout << "无效的输入!" << endl;
	}
	if (is_success) cout << "导入成功!" << endl;
}
Main.cpp主函数
#include "DisplayInterface.h"
int main()
{
	DisplayInterface displayinterface;
	return 0;
}

运行截图:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lwz_159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值