全部代码在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;
}