C++面向对象程序设计课程作业-通讯录管理系统

在这里插入图片描述
全部代码在visual studio 2019(本地Windows调试器)成功编译运行。
代码中有注释,看不懂的地方可以留言。
若要全套代码,请移步
通讯录管理系统(需求分析设计+代码)
person.h文件

#ifndef PERSON_H
#define PERSON_H

#include<iostream>
#include<string>
using namespace std;
//Person类
class Person
{
private:
	char name[10];//联系人姓名
	char birthday[12];//出生日期
	char telephone[12];//电话号码
	char qq[12];//QQ号码
	char email[25];//电子邮箱
	char firm[31];//工作单位名称

public:
	Person();//无参构造函数
	Person(char n[] , char bir[], char tel[], char q[], char ema[], char fir[]);//带参构造函数
	Person(char n[]);//只使用姓名构造
	bool operator ==(Person& p);//重载运算符==,判断是否为同一个联系人
	char* getName()//获取联系人姓名
	{
		return name;
	}
	char* getTelephone()//获取联系人电话号码
	{
		return telephone;
	}
	//使用友元函数重载输入输出流
	friend istream& operator >>(istream &in, Person& p);
	friend ostream& operator <<(ostream& out, Person& p);
};
 
#endif


person.cpp文件

#include<iostream>
#include "person.h"
using namespace std;
//重载输入流
istream& operator >>(istream& in, Person& p)
{
	cout << "姓名:"; in >> p.name;
	cout << "出生日期:"; in >> p.birthday;
	cout << "电话号码:"; in >> p.telephone;
	cout << "QQ:"; in >> p.qq;
	cout << "电子邮箱:"; in >> p.email;
	cout << "工作单位:"; in >> p.firm;
	return in;
}
//重载输出流
ostream& operator <<(ostream& out,  Person& p)
{
	out  << endl;
	out << "姓名:" << p.name << "\t出生日期:" << p.birthday << "\t电话号码:" << p.telephone
		<< "\tQQ:" << p.qq << "\t电子邮箱:" << p.email << "\t工作单位:" << p.firm << endl;
	return out;
}
//无参构造函数
Person::Person()
{
	name[0] = '\0';
	birthday[0] = '\0';
	telephone[0] = '\0';
	qq[0] = '\0';
	email[0] = '\0';
	firm[0] = '\0';
}
//带参构造函数
Person::Person(char n[], char bir[], char tel[], char q[], char ema[], char fir[])
{
	strcpy_s(name,strlen(n)+1, n);
	strcpy_s(birthday,strlen(bir)+1, bir);
	strcpy_s(telephone, strlen(tel)+1,tel);
	strcpy_s(qq,strlen(q)+1, q);
	strcpy_s(email, strlen(ema)+1,ema);
	strcpy_s(firm,strlen(fir)+1, fir);
}
//只带一个参数的构造函数
Person::Person(char n[])
{
	strcpy_s(name,strlen(n)+1, n);
	birthday[0] = '\0';
	telephone[0] = '\0';
	qq[0] = '\0';
	email[0] = '\0';
	firm[0] = '\0';
}
//重载运算符==
//这里将姓名作为唯一标志,即假设联系人的姓名不重复
//若姓名一致,则视为同一联系人
bool Person::operator==(Person& p)
{
	if (strcmp(this->name, p.name) == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

data.h文件

#ifndef DATA_H
#define DATA_H

#include<iostream>
#include<vector>
#include<string>
using namespace std;
#include "person.h"

typedef vector<Person> VectorPerson;//取别名

//Data类
class Data
{
private:
	VectorPerson personData;//用vector顺序容器存储联系人信息
public:
	Data() {};//构造函数
	//添加联系人
	void addPerson(Person& p);
	//删除联系人
	void deletePerson(Person& p);
	//修改联系人信息
	void modifyPerson(string& pname);
	//查找联系人
	int findPerson(Person& p);//查询通讯录中是否存在该联系人
	void findTelephone(string& pname);//通过姓名查找联系人的电话号码
	void findPerson(string& ptelephone);//通过电话号码查找联系人的全部信息
	//显示信息
	void displayPerson();//显示所有联系人的全部信息
	void displayPerson(string& pname);//显示某个联系人的全部信息
	//清空通讯录
	void clear();
	
};
#endif


data.cpp文件

#include<iostream>
using namespace std;
#include "data.h"

//查询通讯录中是否存在该联系人
int Data::findPerson(Person& p)
{
	for (unsigned i = 0; i < personData.size(); i++)
	{
		if (personData[i] == p)
		{
			return i;
		}

	}
	return -1;//未在通讯录中查找到该联系人,返回-1
}
//添加联系人
void Data::addPerson(Person& p)
{
	if (findPerson(p) == -1)//说明通讯录中暂无该联系人
	{
		personData.push_back(p);//添加
	}
	else
	{
		cout << "添加联系人操作出错!!!该联系人已存在。" << endl;
	}
}
//删除联系人
void Data::deletePerson(Person& p)
{
	int i = findPerson(p);
	if (i == -1)
	{
		cout << "删除联系人操作出错!!!不存在该联系人。" << endl;
		return;
	}
	VectorPerson::iterator pIter = personData.begin();
	int j = 0;
	while (j++ < i)
	{
		pIter++;
	}
	personData.erase(pIter);//使用erase()函数释放vector容器元素
}
//修改信息
//前提是通讯录中已经存在该联系人
void Data::modifyPerson(string& pname)
{
	unsigned i;
	bool flag = false;//标志是否找到该联系人,true代表找到
	for ( i= 0; i < personData.size(); i++)
	{
		if (string(personData[i].getName()) == pname)
		{
			flag = true;
			break;
		}
	}
	if (flag)
	{
		deletePerson(personData[i]);//先删除
		cout << "已找到" << pname << ",请输入其信息:" << endl;
		Person p;//无参构造
		cin >> p;
		personData.push_back(p);//重新添加
	}else
	{
		cout << "修改联系人信息操作出错!!!不存在该联系人。" << endl;
	}
	
}
//显示所有联系人的全部信息
void Data::displayPerson()
{
	for (unsigned i = 0; i < personData.size(); i++)
	{
		cout << personData[i];
	}
}
//显示单个联系人的全部信息
void Data::displayPerson(string& pname)
{
	unsigned i;
	bool flag = false;
	for ( i= 0; i < personData.size(); i++)
	{
		if (string(personData[i].getName()) == pname)
		{
			flag = true;//找到该联系人
			break;
		}
	}
	if (flag)
	{
		cout << personData[i];
	}
	else
	{
		cout << "通讯录中不存在联系人:" << pname << endl;
	}
}
//通过姓名查找联系人的电话号码
void Data::findTelephone(string& pname)
{
	unsigned i;
	bool flag = false;
	for (i= 0; i < personData.size(); i++)
	{
		if (string(personData[i].getName()) == pname)
		{
			flag = true;
			break;		
		}
	}
	if (flag)
	{
		cout << pname << "的电话号码:" << personData[i].getTelephone() << endl;
	}
	else
	{
		cout << "通讯录中不存在联系人:" << pname << endl;
	}
}
//通过电话号码查找联系人的全部信息
void Data::findPerson(string& ptelephone)
{
	for (unsigned i = 0; i < personData.size(); i++)
	{
		if (string(personData[i].getTelephone()) == ptelephone)
		{
			cout << personData[i];
			return;
		}
	}
	cout << "不存在电话号码为 " << ptelephone << " 的联系人!" << endl;
}
//清空通讯录
void Data::clear()
{
	personData.clear();//使用clear()函数清空vector容器
}

menu.h文件

#ifndef MENU_H
#define MENU_H

//Menu类
class Menu
{
public:
	Menu() {};//构造函数
	int showMainMenu();//展示菜单
};
#endif

menu.cpp文件

#include "menu.h"
#include<iostream>
using namespace std;

int Menu::showMainMenu()
{
	system("cls");//清屏
	//菜单简单设计
	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 << "-------------------------8、清空通讯录-------------------------" << endl;
	cout << "-------------------------9、退出系统---------------------------" << endl;
	cout << endl;
	cout << "请选择(1-9):" << endl;
	int select;//选择菜单项
	cin >> select;
	while (select < 1 || select>9)
	{
		cout << "选择错误!!请重新选择(1-9):" << endl;
		cin.clear();
		cin.sync();
		cin >> select;
	}
	return select;
}

application.h文件

#ifndef	APPLICATION_H
#define APPLICATION_H

#include "data.h"
#include "menu.h"

//Application类
class Application
{
private:
	Data myData;//创建Data类对象
	Menu myMenu;//创建Menu类对象
public:
	Application() {};//构造函数
	void run();//主界面处理函数
	void displayAllPerson();//菜单项1,显示联系人功能的函数
	void addNewPerson();//菜单项2,添加联系人功能的函数
	void modPerson();//菜单项3,修改信息功能的函数
	void delPerson();//菜单项4,删除联系人功能的函数
	void findOnePerson();//菜单项5,查询联系人功能的函数
	void findByName();//菜单项6,通过姓名查找电话号码功能的函数
	void findByTel();//菜单项7,通过电话号码查询机主信息功能的函数
	void clearAll();//菜单项8,清空通讯录功能的函数
};
#endif

application.cpp文件

#include "application.h"

void Application::run()
{
	bool userExited = false;//标志是否退出系统,true代表退出
	while (!userExited)
	{
		int userSelection = myMenu.showMainMenu();//得到选择的菜单项
		switch (userSelection)
		{
		case 1:
			displayAllPerson();
			break;
		case 2:
			addNewPerson();
			break;
		case 3:
			modPerson();
			break;
		case 4:
			delPerson();
			break;
		case 5:
			findOnePerson();
			break;
		case 6:
			findByName();
			break;
		case 7:
			findByTel();
			break;
		case 8:
			clearAll();
			break;
		case 9:
			userExited = true;
		}
		if (userSelection != 9)
		{
			cout << endl;
			cout << "返回主界面" << endl;
			system("pause");
		}
		else
		{
			cout << "!!退出系统!!" << endl;
		}
	}
}
//展示所有联系人的全部信息
void Application::displayAllPerson()
{
	cout << "通讯录中联系人:\n";
	myData.displayPerson();
}
//新增联系人
void Application::addNewPerson()
{
	cout << "请输入新的联系人信息:" << endl;
	Person newPerson;
	cin >> newPerson;
	myData.addPerson(newPerson);
}
//修改某一联系人信息
void Application::modPerson()
{
	string pname;
	cout << "请输入要修改的联系人的姓名:" ; cin >> pname;
	myData.modifyPerson(pname);
}
//删除联系人
void Application::delPerson()
{
	string pn;
	cout << "请输入要删除的联系人的姓名:"; cin >> pn;
	// c_str()函数:返回指针,指向string类对象中的字符串,末尾加上'\0'
	Person temp((char*)pn.c_str());//只用姓名构造
	if (myData.findPerson(temp) != -1)
	{
		myData.deletePerson(temp);
	}
}
//查询单个联系人的信息
void Application::findOnePerson()
{
	string pn;
	cout << "请输入要查找的联系人的姓名:"; cin >> pn;
	myData.displayPerson(pn);
}
//通过姓名查找电话号码
void Application::findByName()
{
	string pn;
	cout << "请输入要查找的联系人的姓名:"; cin >> pn;
	myData.findTelephone(pn);
}
//通过电话号码查询机主信息
void Application::findByTel()
{
	string ptel;
	cout << "请输入电话号码:"; cin >> ptel;
	myData.findPerson(ptel);
}
//清空通讯录
void Application::clearAll()
{
	myData.clear();
}

appMain.cpp文件

#include "application.h"

int main()
{
	Application myApp;//创建对象
	myApp.run();//调用主界面函数
	return 0;
}
  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JPC客栈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值