通讯录管理系统c++

通讯录管理系统

手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机卡的联系人的信息只包含用户名和电话号码两项信息。存储在手机上的联系人的信息除了上面提到的两项信息外,还包含籍贯,QQ号等信息。

根据通用的手机通讯录的使用方式,采用OOP(Object Oriented Programming,面向对象编程)方法编写一个手机通讯录管理。

要求:

  1. 创建文本文件,记录联系人的信息(需要创建两个文本文件,分别存储手机和手机卡上的存储的联系人的信息)。
  2. 以菜单方式工作(字符界面即可)
  3. 存储在手机卡上的联系人的信息包括:姓名和电话号码;存储在手机上的联系人的信息包括姓名,籍贯,电话号码,QQ号等信息
  4. 管理系统的功能包括:
    1. 新建联系人:添加新的联系人(添加时确定是添加到手机上还是手机卡中)
    2. 删除:删除一个联系人(输入电话号码,删除该联系人。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行删除操作)
    3. 修改:修改某个联系人的信息(输入电话号码,查询到联系人之后进行信息的修改。说明,如果两个存储位置上都存在该联系人的话,需要在两个存储位置上都要进行修改操作)
    4. 查询:根据名字查询联系人信息(查询结果不唯一)
    5. 浏览:显示所有联系人的信息
    6. 将联系人的信息从手机转存到手机卡上(同时要避免重复数据的存在。并且在转存是要检查容量是否受限。下同。)
    7. 将联系人的信息从手机卡上转存到手机上(同时要避免重复数据的存在)
  5. 要支持继承、多态、重载(运算符重载、函数重载)等面向对象的基本特点
  6. 提交程序源码和课程设计报告。

实现过程分析:

建立两个文本文件,记录存储在手机上联系人的基本信息和存储在手机卡上的联系人的信息

建立以下几个类:

  1. 手机卡联系人类:表示一个联系人

        数据成员包括:

姓名

电话号码

成员函数包括

带参并带默认值的构造函数

一组set函数为数据成员赋值

一组modify函数,修改数据成员的值

重载>>,<<运算符,完成对象的输入和输出操作

  1. 手机联系人(继承于手机卡联系人类):

新增数据成员:

籍贯

QQ号
成员函数包括

一组set函数为数据成员赋值

一组modify函数,修改数据成员的值

重载>>,<<运算符,完成数据成员的输入输出操作

  1. 定义一个通讯簿抽象类,用来封装以下函数(为支持多态,可以将以下函数封装为纯虚函数)

                     增加函数:增加一个联系人

                     删除操作:删除一个联系人

                     Display:显示所有联系人的信息

                     修改某一联系人的信息:

                     查询并显示某一联系人的信息:

  1. 手机通讯簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机中存储的所有联系人的信息

              数据成员包括:

                     手机联系人的数量

                     手机联系人对象数组

              成员函数包括

                     构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组

                     析构函数:将对象数组中的内容写入到文本文件中。

                     增加函数:增加一个联系人

                     删除操作:删除一个联系人

                     Display:显示所有联系人的信息

                     修改某一联系人的信息:

                     查询并显示某一联系人的信息:

  1. 手机卡通信簿类(这是一个数据库类,继承于通讯簿抽象类):用于记录手机卡中存储的所有联系人的信息

              数据成员包括:

                     手机联系人的数量

                     手机联系人对象数组

              成员函数包括

                     构造函数:读取文本文件中的数据,并根据文件内容创建联系人对象数组

                     析构函数:将对象数组中的内容写入到文本文件中。

                     增加函数:增加一个联系人

                     删除操作:删除一个联系人

                     Display:显示所有联系人的信息

                     修改某一联系人的信息:

                     查询并显示某一联系人的信息:

  1. 用户类(这是一个操作类,完成通讯簿的操作):用户拥有两个通讯簿(一个是手机中存储的联系人,一个是手机卡中存储的联系人),并且可以对通讯录进行管理

              数据成员包括:

                     两个通讯簿对象

              成员函数包括(成员函数体现用户的行为):

                     添加联系人:利用基类指针,调用相应的通讯簿对象(手机通讯簿或手机卡通信簿)的增加函数完成联系人的添加。实现动态联编,体现出多态特点。(下同)

                     删除联系人:调用相应的通讯簿对象的删除操作删除一个联系人

                     Display:显示相应的通讯簿中联系人的信息

                     修改某一联系人的信息:调用通讯簿对象的函数完成操作

                     查询并显示某一联系人的信息:调用通讯簿对象的函数完成操作

                     将手机卡中的存储的联系人的信息移动到手机中

                     将手机中存储的联系人的信息移动到手机卡中

                     将手机卡中的存储的联系人的信息复制到手机中

                     将手机中存储的联系人的信息复制到手机卡中

  1. 界面菜单类:用来给出操作提示

              数据成员:可以不定义数据成员

              成员函数:

                     Display函数:显示操作菜单的提示。说明:可以根据需要定义多个函数,显示不同的菜单(操作提示)。

通讯录管理系统c++_第1张图片

Contact类:

联系人类,作为手机卡联系人和手机联系人的基类。

完成基本的联系人的创立,姓名,电话数据的修改。

PhoneCardContact:

手机卡联系人类,继承联系人类。

完成对手机卡联系人的储存。重载<<,>>运算符,完成直接输入添加联系人和直接输出希联系人的功能。

PhoneContact

手机联系人类,继承联系人类。

新增籍贯,QQ两个数据成员,和对籍贯,QQ两数据修改的函数。

完成对手机联系人的储存。重载<<,>>运算符,完成直接输入添加联系人和直接输出希联系人的功能。

AddressBook类:

通信录类,抽象类,完成多态。

有增删改查和显示的五个纯虚函数。

MobilePhoneAddressBook

手机通信录类。继承通信录类。

数据成员手机联系人列表和数量。

实现通信录类的五个函数。

MobilePhoneCardAddressBook

手机卡通信录类。继承通信录类。

数据成员手机卡联系人列表和数量。

实现通信录类的五个函数。

User

数据成员包含MobilePhoneAddressBook类和MobilePhoneCardAddressBook

实现动态联编的增删改查和现实,同时实现从手机卡和手机数据的复制和剪切功能。

Menu

继承User

实现Display函数。完成主菜单等用户交互的功能。

#ifndef CONTACT_H
#define CONTACT_H
#include
using namespace std;
class Contact {
	//姓名和电话号码
private:
	string name;
	string tel;
public:
	//构造函数
	Contact(string _name="", string _tel="");//string默认值单引号和双引号区别
	//设置联系人姓名,电话
	void set_contact(string _name, string _tel);//在源文件里改为inline报错LNK2001 LNK2019 
	//得到联系人电话
	string get_contact_tel() const;
	//得到联系人姓名
	string get_contact_name() const;
	//修改联系人姓名
	void modify_contact_name(string _name);
	//修改联系人电话
	void modify_contact_tel(string _tel);
};
#endif // !CONTACT_H
#include
#include "Contact.h"
Contact::Contact(string _name, string _tel) { set_contact(_name, _tel); }
void Contact::set_contact(string _name, string _tel) { name = _name; tel = _tel; }
string Contact::get_contact_name() const{ return name; }
string Contact::get_contact_tel() const{ return tel; }
void Contact::modify_contact_name(string _name) { name = _name; }
void Contact::modify_contact_tel(string _tel) { tel = _tel; }
#ifndef PHONECARD_CONTACTS_H
#define PHONECARD_CONTACTS_H
#include
#include"Contact.h"
class PhoneCardContacts : public Contact {
public:
	//构造函数
	PhoneCardContacts(string _name = "", string _tel = "");
	//重载输入,完成数据成员的输入
	friend istream& operator>>(istream& input, PhoneCardContacts& C);
	//重载输出,完成数据成员的输出
	friend ostream& operator<<(ostream& output, const PhoneCardContacts& C);
};
#endif	//!PHONECARD_CONTACTS_H
#include
#include
using namespace std;
#include"PhoneCardContacts.h"
PhoneCardContacts::PhoneCardContacts(string _name, string _tel) {
	set_contact(_name, _tel);
}
istream& operator>>(istream& input, PhoneCardContacts& C) {	
	string name="", tel="";									//?????修改函数
	cout << "请输入联系人姓名:" << endl;
	input >> name;
	cout << "请输入联系人电话:" << endl;
	input >> tel;
	C=PhoneCardContacts(name,tel);
	return input;
}
ostream& operator<<(ostream& output, const PhoneCardContacts& C) {
	output << "姓名:" << C.get_contact_name() << endl;
	output << "电话:" << C.get_contact_tel() << endl;
	return output;
}
#ifndef PHONE_CONTACTS_H
#define PHONE_CONTACTS_H
#include
#include"Contact.h"
class PhoneContacts : public Contact {
private:
	//籍贯	QQ号
	string add;
	string QQ;
public:
	//构造函数
	PhoneContacts(string _name = "", string _tel = "",string _add="无",string _QQ="无");
	//设置联系人姓名,电话,籍贯,QQ号
	void set_phoneContact(string _name, string _tel,string _add,string _QQ);
	//得到联系人籍贯
	string get_contact_add() const;
	//得到联系人QQ
	string get_contact_QQ() const;
	//修改联系人籍贯
	void modify_contact_add(string _add);
	//修改联系人QQ
	void modify_contact_QQ(string _QQ);
	//重载输入,完成数据成员的输入
	friend istream& operator>>(istream& input, PhoneContacts& C);
	//重载输出,完成数据成员的输出
	friend ostream& operator<<(ostream& output, const PhoneContacts& C);
};
#endif // !PHONE_CONTACTS_H
#include
#include
using namespace std;
#include"PhoneContacts.h"
PhoneContacts::PhoneContacts(string _name, string _tel, string _add, string _QQ) {
	set_phoneContact(_name, _tel,_add,_QQ);
}
void PhoneContacts::set_phoneContact(string _name, string _tel, string _add, string _QQ) {
	set_contact(_name,_tel);
	add = _add;
	QQ = _QQ;
}
string PhoneContacts::get_contact_add() const { return add; }
string PhoneContacts::get_contact_QQ() const { return QQ; }
void PhoneContacts::modify_contact_add(string _add) { add = _add; }
void PhoneContacts::modify_contact_QQ(string _QQ) { QQ = _QQ; }
istream& operator>>(istream& input, PhoneContacts& C) {
	string name="", tel="", add="", QQ="";
	cout << "请输入联系人姓名:" << endl;
	input >> name;
	cout << "请输入联系人电话:" << endl;
	input >> tel;
	cout << "请输入联系人籍贯:" << endl;
	input >> add;
	cout << "请输入联系人QQ号:" << endl;
	input >> QQ;
	C=PhoneContacts(name, tel, add, QQ);
	return input;
}
ostream& operator<<(ostream& output, const PhoneContacts& C) {
	output << "姓名:" << C.get_contact_name() << endl;
	output << "电话:" << C.get_contact_tel() << endl;
	output << "籍贯:" << C.get_contact_add() << endl;
	output << "QQ号:" << C.get_contact_QQ() << endl;
	return output;
}
#ifndef ADDRESS_BOOK_H
#define ADDRESS_BOOK_H
#include
using namespace std;
class AddressBook {
public:
	AddressBook(){}
	virtual ~AddressBook() {}
	//增加函数:增加一个联系人
	virtual void Insert() = 0;
	//删除操作:删除一个联系人
	virtual void Delete (string,int) = 0;
	//Display : 显示所有联系人的信息
	virtual void Disply() = 0;
	//修改某一联系人的信息:
	virtual void Update(string,int,string,int) = 0;
	//查询并显示某一联系人的信息:
	virtual void Select(string) = 0;
};
#endif	//!ADDRESS_BOOK_H

#ifndef MOBLIEPHONE_CARD_ADDRESS_BOOK
#define MOBLIEPHONE_CARD_ADDRESS_BOOK
#include
#include
#include"AddressBook.h"
#include"PhoneCardContacts.h"
class MobilePhoneCardAddressBook :public AddressBook {
public:
	list pcclist;
	int sum;
	MobilePhoneCardAddressBook();
	~MobilePhoneCardAddressBook();
	//增加函数:增加一个联系人
	void Insert();
	//删除操作:删除一个联系人
	void Delete(string,int);
	//Display : 显示所有联系人的信息
	void Disply();
	//修改某一联系人的信息:
	void Update(string,int,string,int);
	//查询并显示某一联系人的信息:
	void Select(string);
};
#endif
#include
#include
#include
#include
#include"MobilePhoneCardAddressBook.h"
#include"PhoneCardContacts.h"
using namespace std;
MobilePhoneCardAddressBook::MobilePhoneCardAddressBook() {
	sum = 0;
	//怎么判断文件是否存在???
	//怎么判断文件是否为空???
	ifstream readFile("MobilePhoneCardAddressBook.txt");
	//怎么判断文件是否打开
	if (readFile.is_open()) {
		string name;
		string tel;
		string temp;
		int i;
		//peek这样判断对吗???
		while (readFile.peek() != EOF) {
			for (i = 1; readFile.peek() != EOF; i++) {
				readFile >> temp;
				if (i % 2 == 1)
					name = temp;
				if (i % 2 == 0){
					tel = temp;		
					PhoneCardContacts pcc(name, tel);
					pcclist.push_back(pcc);
				}
				sum++;
			}
			//怎么数据不全的异常处理???
			if ((i - 2) % 2 != 0)
				cout << "数据不全" << endl;
			readFile.close();
		}
	}
	else
		//异常处理???
		cout << "文件打开失败" << endl;
}
MobilePhoneCardAddressBook::~MobilePhoneCardAddressBook() {
	ofstream writeFile("MobilePhoneCardAddressBook.txt", ios::out);
	if (writeFile.is_open()) {
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++) {
			writeFile << (*iter).get_contact_name() << ' ' << (*iter).get_contact_tel() << endl;;
		}
		writeFile.close();
		pcclist.clear();
		sum = 0;
	}
	else
		//异常处理???
		cout << "文件打开失败" << endl; 
}
//增加函数:增加一个联系人
void MobilePhoneCardAddressBook::Insert() {
	bool pd = true;
	if (sum > 1000) {
		cout << "手机卡内存已满,无法添加。" << endl;
	}
	else {
		PhoneCardContacts pcc;
		cin >> pcc;
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++) {
			if ((*iter).get_contact_name() == pcc.get_contact_name()) {
				cout << "手机通信录中,已有该同名联系人。" << endl;
				cout << "若要修改请在 主菜单 中修改或删除" << endl;
				pd = false;
			}
		}
		if (pd) {
			pcclist.push_back(pcc);
			sum++;
			cout << "添加成功!" << endl;
		}
	}
}
//删除操作:删除一个联系人
void MobilePhoneCardAddressBook::Delete(string temp, int i) {
	bool you = false;
	switch (i) {
	case 1:
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end();) {
			if (temp == (*iter).get_contact_tel()) {
				you = true;
				iter = pcclist.erase(iter);
				cout << "删除成功" << endl;
				sum--;
			}
			else
				iter++;
		}
		if (!you)
			cout << "手机卡通信录查无此联系人。" << endl;
		break;
	case 2:
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end();) {
			if (temp == (*iter).get_contact_name()) {
				you = true;
				iter = pcclist.erase(iter);
				cout << "删除成功" << endl;
				sum--;
			}
			else
				iter++;
		}
		if (!you)
			cout << "手机卡通信录查无此联系人。" << endl;
		break;
	}
}
//Display : 显示所有联系人的信息
void MobilePhoneCardAddressBook::Disply() {
	if (pcclist.empty())
		cout << "电话卡中暂无联系人信息。" << endl;
	for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++)
		cout << *iter;
}
//修改某一联系人的信息:
void MobilePhoneCardAddressBook::Update(string temp,int i,string xiugai,int j) {
	bool you = false;
	switch (j) {
	case 1:
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++) {
			if (temp == (*iter).get_contact_name()) {
				you = true;
				switch (i) {
				case 1:
					(*iter).modify_contact_name(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 2:
					(*iter).modify_contact_tel(xiugai);
					cout << "修改成功。" << endl;
					break;
				}
			}
		}
		if (!you)
			cout << "手机卡通信录查无此联系人。" << endl;
		break;
	case 2:
		for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++) {
			if (temp == (*iter).get_contact_tel()) {
				you = true;
				switch (i) {
				case 1:
					(*iter).modify_contact_name(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 2:
					(*iter).modify_contact_tel(xiugai);
					cout << "修改成功。" << endl;
					break;
				}
			}
		}
		if (!you)
			cout << "手机卡通信录查无此联系人。" << endl;
		break;
	}
}
//查询并显示某一联系人的信息:
void MobilePhoneCardAddressBook::Select(string temp) {
	bool you = false;
	for (list::iterator iter = pcclist.begin(); iter != pcclist.end(); iter++) {
		if (temp == (*iter).get_contact_name()) {
			you = true;
			cout << *iter;
		}
	}
	if (!you)
		cout << "电话卡中暂无联系人信息。" << endl;
}
#ifndef MOBLIEPHONE_ADDRESS_BOOK
#define MOBLIEPHONE_ADDRESS_BOOK
#include
#include
#include"AddressBook.h"
#include"PhoneContacts.h"
class MobilePhoneAddressBook :public AddressBook {
public:
	list pclist;
	int sum;
	MobilePhoneAddressBook();
	~MobilePhoneAddressBook();
	//增加函数:增加一个联系人
	void Insert();
	//删除操作:删除一个联系人
	void Delete(string,int);
	//Display : 显示所有联系人的信息
	void Disply();
	//修改某一联系人的信息:
	void Update(string,int,string,int);
	//查询并显示某一联系人的信息:
	void Select(string);
};
#endif
#include
#include
#include
#include
#include"MobilePhoneAddressBook.h"
#include"PhoneContacts.h"
using namespace std;
MobilePhoneAddressBook::MobilePhoneAddressBook() {
	sum = 0;
	//怎么判断文件是否存在???
	//怎么判断文件是否为空???
	ifstream readFile("MobilePhoneAddressBook.txt");
	//怎么判断文件是否打开
	if (readFile.is_open()) {
		string name;
		string tel;
		string add;
		string QQ;
		string temp;
		int i;
		//peek这样判断对吗???
		while (readFile.peek() != EOF) {
			for (i = 1; readFile.peek() != EOF; i++) {
				readFile >> temp;
				if (i % 4 == 1)
					name = temp;
				if (i % 4 == 2)
					tel = temp;
				if (i % 4 == 3)
					add = temp;
				if (i % 4 == 0) {
					QQ = temp;
					PhoneContacts pc(name, tel, add, QQ);
					pclist.push_back(pc);
				}
				sum++;
			}
			//怎么数据不全的异常处理???
			//为啥i会是6???
			if ((i-2) % 4 != 0)
				cout << "数据不全" << endl;
			//cout << i << endl;
			readFile.close();
		}
	}
	else
		//异常处理???
		cout << "文件打开失败" << endl;
}
MobilePhoneAddressBook::~MobilePhoneAddressBook() {
	ofstream writeFile("MobilePhoneAddressBook.txt", ios::out);
	if (writeFile.is_open()) {
		for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++) {
			writeFile << (*iter).get_contact_name() << ' ' << (*iter).get_contact_tel() << ' ' << (*iter).get_contact_add() << ' ' << (*iter).get_contact_QQ() << endl;
		}
		writeFile.close();
		pclist.clear();
		sum = 0;
	}
	else
		//异常处理???
		cout << "文件打开失败" << endl;
}
//增加函数:增加一个联系人
void MobilePhoneAddressBook::Insert(){
	bool pd = true;
	if (sum > 1000) {
		cout << "手机内存已满,无法添加。" << endl;
	}
	else {
		PhoneContacts pc;
		cin >> pc;
		for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++) {
			if ((*iter).get_contact_name() == pc.get_contact_name()) {
				cout << "手机通信录中,已有该同名联系人。" << endl;
				cout << "若要修改请在 主菜单 中修改或删除" << endl;
				pd = false;
			}
		}
		if (pd) {
			pclist.push_back(pc);
			sum++;
			cout << "添加成功!" << endl;
		}
	}
}
//删除操作:删除一个联系人
void MobilePhoneAddressBook::Delete(string temp, int i) {
	bool you = false;
	switch (i) {
	case 1:
		for (list::iterator iter = pclist.begin(); iter != pclist.end();) {
			if (temp == (*iter).get_contact_tel()) {
				you = true;
				iter = pclist.erase(iter);
				cout << "删除成功" << endl;
				sum--;
			}
			else
				iter++;
		}
		if (!you)
			cout << "手机通信录查无此联系人。" << endl;
		break;
	case 2:
		for (list::iterator iter = pclist.begin(); iter != pclist.end();) {
			if (temp == (*iter).get_contact_name()) {
				you = true;
				iter = pclist.erase(iter);
				cout << "删除成功" << endl;
				sum--;
			}
			else
				iter++;
		}
		if (!you)
			cout << "手机通信录查无此联系人。" << endl;
		break;
	}
}
//Display : 显示所有联系人的信息
void MobilePhoneAddressBook::Disply(){
	if (pclist.empty())
		cout << "手机中暂无联系人信息。" << endl;
	for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++)
		cout << *iter;
}
//修改某一联系人的信息:
void MobilePhoneAddressBook::Update(string temp, int i, string xiugai, int j) {
	bool you = false;
	switch (j) {
	case 1:
		for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++) {
			if (temp == (*iter).get_contact_name()) {
				you = true;
				switch (i) {
				case 1:
					(*iter).modify_contact_name(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 2:
					(*iter).modify_contact_tel(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 3:
					(*iter).modify_contact_add(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 4:
					(*iter).modify_contact_QQ(xiugai);
					cout << "修改成功。" << endl;
					break;
				}
			}
		}
		if (!you)
			cout << "手机通信录查无此联系人。" << endl;
		break;
	case 2:
		for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++) {
			if (temp == (*iter).get_contact_tel()) {
				you = true;
				switch (i) {
				case 1:
					(*iter).modify_contact_name(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 2:
					(*iter).modify_contact_tel(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 3:
					(*iter).modify_contact_add(xiugai);
					cout << "修改成功。" << endl;
					break;
				case 4:
					(*iter).modify_contact_QQ(xiugai);
					cout << "修改成功。" << endl;
					break;
				}
			}
		}
		if (!you)
			cout << "手机通信录查无此联系人。" << endl;
		break;
	}
}
//查询并显示某一联系人的信息:
void MobilePhoneAddressBook::Select(string temp) {
	bool you = false;
	for (list::iterator iter = pclist.begin(); iter != pclist.end(); iter++) {
		if (temp == (*iter).get_contact_name()) {
			you = true;
			cout << *iter;
		}
	}
	if (!you)
		cout << "手机中暂无联系人信息。" << endl;
}
#ifndef USER_H
#define USER_H
#include"MobilePhoneAddressBook.h"
#include"MobilePhoneCardAddressBook.h"
class User {
private:
	MobilePhoneAddressBook phone;
	MobilePhoneCardAddressBook card;
public:
	User() {}
	~User() {}
	//增加函数:增加一个联系人
	void Insert();
	//删除操作:删除一个联系人
	void Delete();
	//Display : 显示所有联系人的信息
	void Disply();
	//修改某一联系人的信息:
	void Update();
	//查询并显示某一联系人的信息:
	void Select();
	//将手机卡中的存储的联系人的信息移动到手机中
	void Card_X_Phone();
	//将手机中存储的联系人的信息移动到手机卡中
	void Phone_X_Card();
	//将手机卡中的存储的联系人的信息复制到手机中
	void Card_C_Phone();
	//将手机中存储的联系人的信息复制到手机卡中
	void Phone_C_Card();
};
#endif // !USER_H
#include"User.h"
#include"AddressBook.h"
#include"MobilePhoneAddressBook.h"
#include"MobilePhoneCardAddressBook.h"
#include 
#include
#include
using namespace std;
//增加函数:增加一个联系人
void User::Insert() {
	AddressBook* p;
	int i;
	bool pd = true;
	while (pd) {
		cout << "返回上一级请按 0 " << endl;
		cout << "添加手机联系人请按 1 " << endl;
		cout << "添加手机卡联系人请按 2 " << endl;
		cin >> i;
		switch (i) {
		case 0:pd = false; break;
		case 1:
			p = ☎
			p->Insert();
			pd = false;
			break;
		case 2:
			p = &card;
			p->Insert();
			pd = false;
			break;
		default: 
		{cout << "输入范围不对,请重新输入。" << endl;
		//A
		cout << "按其他任意键继续......" << endl;
		system("pause"); system("cls");
		}
		}
	}
}
//删除操作:删除一个联系人
void User::Delete() {
	AddressBook* p;
	int i;
	bool pd = true;
	string temp;
	while (pd) {
		cout << "请按照下面提示操作:" << endl;
		cout << "返回上一级请按 0 " << endl;
		cout << "按联系人电话删除请按 1 " << endl;
		cout << "按联系人姓名删除请按 2 " << endl;
		cin >> i;
		system("cls");
		switch (i) {
		case 0:pd = false; break;
		case 1:
			cout << "请输入要删除联系人的电话:" << endl;
			cin >> temp;
			p = ☎
			p->Delete(temp,i);
			p = &card;
			p->Delete(temp, i);
			pd = false;
			break;
		case 2:
			cout << "请输入要删除联系人的姓名:" << endl;
			cin >> temp;
			p = ☎
			p->Delete(temp, i);
			p = &card;
			p->Delete(temp, i);
			pd = false;
			break;
		default: cout << "输入范围不对,请重新输入。" << endl;
			cout << "按其他任意键继续......" << endl;
			system("pause"); system("cls");
		}
	}
}
//Display : 显示所有联系人的信息
void User::Disply() {
	AddressBook* p;
	int i;
	bool pd = true;
	while (pd) {
		cout << "返回上一级请按 0 " << endl;
		cout << "显示手机联系人请按 1 " << endl;
		cout << "显示手机卡联系人请按 2 " << endl;
		cin >> i;
		switch (i) {
		case 0:pd = false; break;
		case 1:
			p = ☎
			p->Disply();
			pd = false;
			break;
		case 2:
			p = &card;
			p->Disply();
			pd = false;
			break;
		default: cout << "输入范围不对,请重新输入。" << endl;
			cout << "按其他任意键继续......" << endl;
			system("pause"); system("cls");
		}
	}
}
//修改某一联系人的信息:
void User::Update() {
	AddressBook* p;
	string temp;
	string xiugai;
	int i;
	int j;
	bool pd = true;
	bool pd1 = true;
	while (pd) {
		cout << "请按照下面提示操作:" << endl;
		cout << "返回上一界面 请按 0" << endl;
		cout << "要按照联系人姓名查找修改 请按 1" << endl;
		cout << "要按照联系人电话查找修改 请按 2 " << endl;
		cin >> j;
		system("cls");
		switch (j) {
		case 0:pd = false; system("cls"); break;
		case 1:
			cout << "请按照下面提示操作:" << endl;
			cout << "请输入要修改联系人的姓名:" << endl;
			cin >> temp;
			system("cls");
			while (pd1) {
				cout << "请按照下面提示操作:" << endl;
				cout << "返回上一界面 请按 0" << endl;
				cout << "修改联系人姓名请按 1 " << endl;
				cout << "修改联系人电话请按 2 " << endl;
				cout << "修改联系人籍贯请按 3 " << endl;
				cout << "修改联系人QQ号请按 4 " << endl;
				cin >> i;
				switch (i) {
				case 0: pd1 = false; system("cls");  break;
				case 1:
					cout << "请输入修改后的姓名:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					p = &card;
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 2:
					cout << "请输入修改后的电话:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					p = &card;
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 3:
					cout << "请输入修改后的籍贯:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 4:
					cout << "请输入修改后的QQ号:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				default:
					cout << "输入范围不对,请重新输入。" << endl;
					cout << "按其他任意键继续......" << endl;
					system("pause"); system("cls");
				}
			}
			cout << "按其他任意键继续......" << endl;
			system("pause"); system("cls");
			pd = false;
			break;
		case 2:
			cout << "请按照下面提示操作:" << endl;
			cout << "请输入要修改联系人的手机号:" << endl;
			cin >> temp;
			system("cls");
			while (pd1) {
				cout << "请按照下面提示操作:" << endl;
				cout << "返回上一界面 请按 0" << endl;
				cout << "修改联系人电话请按 1 " << endl;
				cout << "修改联系人姓名请按 2 " << endl;
				cout << "修改联系人籍贯请按 3 " << endl;
				cout << "修改联系人QQ号请按 4 " << endl;
				cin >> i;
				switch (i) {
				case 0: pd1 = false; system("cls");  break;
				case 1:
					cout << "请输入修改后的电话:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					p = &card;
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 2:
					cout << "请输入修改后的电话:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					p = &card;
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 3:
					cout << "请输入修改后的籍贯:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				case 4:
					cout << "请输入修改后的QQ号:" << endl;
					cin >> xiugai;
					p = ☎
					p->Update(temp, i, xiugai, j);
					pd1 = false;
					break;
				default:
					cout << "输入范围不对,请重新输入。" << endl;
					cout << "按其他任意键继续......" << endl;
					system("pause"); system("cls");
				}
				cout << "按其他任意键继续......" << endl;
				system("pause"); system("cls");
				pd = false;
				break;
		default:
			cout << "输入范围不对,请重新输入。" << endl;
			cout << "按其他任意键继续......" << endl;
			system("pause"); system("cls");
			break;
			}
		}
	}
}
//查询并显示某一联系人的信息:
void User::Select() {
	AddressBook* p;
	string temp;
	cout << "请输入要查询联系人的姓名:" << endl;;
	cin >> temp;
	p = ☎
	p->Select(temp);
	p = &card;
	p->Select(temp);
	cout << "按其他任意键继续......" << endl;
	system("pause"); system("cls");
}
//
void User::Card_X_Phone() {
	bool flag = true;
	for (list::iterator iter = card.pcclist.begin(); iter != card.pcclist.end();) {
		//判断有无重复,是否添加
		bool pd = true;
		for (list::iterator it = phone.pclist.begin(); it != phone.pclist.end(); it++) {
			if ((*iter).get_contact_name() == (*it).get_contact_name() && (*iter).get_contact_tel() == (*it).get_contact_tel()) {
				pd = false;
				break;
			}
		}
		if (pd) {
			if (phone.sum <= 1000) {
				phone.pclist.push_back(PhoneContacts((*iter).get_contact_name(), (*iter).get_contact_tel()));
				phone.sum++;
			}
			else {
				cout << "电话内存已满" << endl;
				flag = false;
				break;
			}
		}
		iter = card.pcclist.erase(iter);
	}
	if (flag)
		cout << "移动成功。" << endl;
}
//将手机中存储的联系人的信息移动到手机卡中
void User::Phone_X_Card() {
	bool flag = true;
	for (list::iterator iter = phone.pclist.begin(); iter != phone.pclist.end();) {
		bool pd = true;
		for (list::iterator it = card.pcclist.begin(); it != card.pcclist.end(); it++) {
			if ((*iter).get_contact_name() == (*it).get_contact_name() && (*iter).get_contact_tel() == (*it).get_contact_tel()) {
				pd = false;
				break;
			}
		}
		if (pd) {
			if (card.sum <= 1000) {
				card.pcclist.push_back(PhoneCardContacts((*iter).get_contact_name(), (*iter).get_contact_tel()));
				card.sum++;
			}
			else {
				cout << "电话卡内存已满" << endl;
				flag = false;
				break;
			}
		}
		iter = phone.pclist.erase(iter);
	}
	if (flag)
		cout << "移动成功。" << endl;
}
//将手机卡中的存储的联系人的信息复制到手机中
void User::Card_C_Phone() {
	bool flag = true;
	for (list::iterator iter = card.pcclist.begin(); iter != card.pcclist.end();iter++) {
		bool pd = true;
		for (list::iterator it = phone.pclist.begin(); it != phone.pclist.end(); it++) {
			if ((*iter).get_contact_name() == (*it).get_contact_name() && (*iter).get_contact_tel() == (*it).get_contact_tel()) {
				pd = false;
				break;
			}
		}
		if (pd) {
			if (phone.sum <= 1000) {
				phone.pclist.push_back(PhoneContacts((*iter).get_contact_name(), (*iter).get_contact_tel()));
				phone.sum++;
			}
			else {
				cout << "电话内存已满" << endl;
				flag = false;
				break;
			}
		}
	}
	if (flag)
		cout << "复制成功。" << endl;
}
//将手机中存储的联系人的信息复制到手机卡中
void User::Phone_C_Card() {
	bool flag = true;
	for (list::iterator iter = phone.pclist.begin(); iter != phone.pclist.end(); iter++) {
		bool pd = true;
		for (list::iterator it = card.pcclist.begin(); it != card.pcclist.end() && pd; it++) {
			if ((*iter).get_contact_name() == (*it).get_contact_name() && (*iter).get_contact_tel() == (*it).get_contact_tel()) {
				pd = false;
				break;
			}
		}
		if (pd) {
			if (card.sum <= 1000) {
				card.pcclist.push_back(PhoneCardContacts((*iter).get_contact_name(), (*iter).get_contact_tel()));
				card.sum++;
			}
			else {
				cout << "电话卡内存已满" << endl;
				flag = false;
				break;
			}
		}
	}
	if (flag)
		cout << "复制成功。" << endl;
}
#ifndef MENU_H
#define MENU_H
#include"User.h"
class Menu:public User {
public:
	void Display();
};
#endif // !MENU_H
#include"Menu.h"
#include
using namespace std;
void Menu::Display() {
	bool pd = true;
	int i;
	while (pd) {
        cout << "欢迎来到 bug满天飞 的通信录系统,请小心操作。" << endl;
        cout << "-----主菜单-----" << endl;
        cout << "按0 离开本操作系统" << endl;
        cout << "按1 新建联系人" << endl;
        cout << "按2 删除联系人" << endl;
        cout << "按3 修改联系人信息" << endl;
        cout << "按4 查询联系人信息" << endl;
        cout << "按5 浏览全部联系人" << endl;
        cout << "按6 将手机卡中的存储的联系人的信息移动到手机中" << endl;
		cout << "按7 将手机中存储的联系人的信息移动到手机卡中" << endl;
		cout << "按8 将手机卡中的存储的联系人的信息复制到手机中" << endl;
		cout << "按9 将手机中存储的联系人的信息复制到手机卡中" << endl;
        cin >> i;
        switch (i) {
        case 0: pd = false; break;
        case 1: Insert(); break;
        case 2: Delete(); break;
        case 3: Update(); break;
        case 4:Select(); break;
        case 5:Disply(); break;
        case 6:Card_X_Phone(); break;
        case 7:Phone_X_Card(); break;
        case 8:Card_C_Phone(); break;
        case 9:Phone_C_Card(); break;
        default: 
            cout << "输入范围不对,请重新输入。" << endl;
            cout << "按其他任意键继续......" << endl;
            system("pause"); system("cls");
        
        }
        cout << "按其他任意键继续......" << endl;
        system("pause"); system("cls");
	}
    cout << "感谢您的使用。" << endl;
}
#include"Menu.h"
int main() {
	Menu m;
	m.Display();
	return 0;
}

因为之前写过图书馆管理系统,所以思路没有困难。

而且上课和老师的word文件里都教过按功能分成那几个类怎么去写类的关系。

但还是在写代码时遇到了很多问题。

  1. 多文本操作时,即使条件编译也容易出现

标识符错误。查了很多资料,发现是头文件和命名空间没有处理好的问题。

现在在代码里已经解决了,但具体的原因和真正的解决方案还是不太懂。

  1. int类型的数据变量,如果用char输入的话,就会陷入死循环。

查了资料发现,这样情况下cin会直接锁死。可以用cin.clear()重置cin的状态,从而解锁。但先前输入的char类型的数据还在换成流中。

在实际操作中,如果用cin输入变量的话,我们可以先用cin.fail()去判断输入的数据类型和声明的数据类型是否相同。

每次弄明白了这些小知识都很高兴,但是用掉了大量时间。而且感觉这些东西现在不需要学到这么细,因为没大有用。

查资料的能力是我此次课程设计的收获之一。

至于其他的小bug,死循环之类的,在做算法题的时候就学了,很多小技巧。因为写算法题太容易出现出现错误了。

可以控制变量,注释掉一部分,或者输出变量的值等等。

断点没有学,找到比较费时,不过还好有之前的做算法题的经验。

总体上,感觉c++这门语言很细,编程需要细心,语言好学,但懂其原理,和怎么从实际要求里抽出类来,这是很难的。如果抛弃那个满天飞的bug,也是很有趣的,当然解决bug也是很有趣的。

因为都在机房写的,所以同学朋友之间互帮互助,共同进步是件好事。

所以我发现的问题更多的是从别人的代码中遇到的,而且我也从中学到了很多。有同学直接用vector存的数据,但他没有用迭代器和其成员函数,他的删除功能是当前项加一位的数据去赋值到当前项。这样的话,遍历到最后一项的时候,最后一项加一,就造成了vector越界的情况。

另一位同学,他的打开文件那里一直报错,我io流学的也不太好,和他一起找了很多地方,感觉都很对。最后弄了很久才发现,原来他的文本文件名后面加了.txt。所以就直接找不到文件。

还有同学是继承抽象类后,报没有实现抽象类中的纯虚函数的错误,他实现的函数和他的纯虚函数,函数名相同,但形参表不同。这个错误我之前在写图书馆管理系统的时候也犯错,当时困扰了我很久,所以在这次就很快的找出来了,因为印象太深了。感觉代码多写,每次都尽全力的去想怎么能更加完美,能力就上来了。

还有个也是虚函数的问题,找了一会儿,才发现,他派生类没有继承虚函数。

我发现同一份代码,每个人写的天差地别。有人写的很条例,要找错误,简简单单,层次一看就能看出来。有些人写的乱七八糟的,甚至有些人说,本来挺好的,后来越改越乱。我之前也这样过,这样只会让bug更多或者碰巧解决了,但不敢动了,因为一动就要动很多。有些人写的很随意,感觉没有想到这个系统是给人用的,就体验感极差。其实我第一次写图书馆管理系统也差不多,因为平时大多写的是一些基础的算法题,有很多不好的习惯。变量名随便起,能跳就跳,不管用户怎么想,只求能快速解决问题。不过写完后,我问过学长看过一些书,才发现,写项目要很细心,要考虑到很多的点,什么要即使的刷新缓冲流,返回上一项,在找数据或者别的什么操作的时候,要及时反馈给用户信息,找没找到,添加成功了吗等等。我每次写东西的时候都会把我当成用户,想一想我如果不小心点错了或者怎么样,这个程序能不能人性化一点。或者想一想图书馆是的借阅是什么样的,管理者需要什么信息,用户需要知道哪些信息。手机通信录做的时候,我就想我小时候的小手机,我当时按的哪些键,删联系人的界面有哪些选项啥的。或许我写的很烂,有很多东西写不出来。但是我每次都尽全力去写,多想,我相信我总会进步的。

你可能感兴趣的:(青少年编程)