1、系统需求
通讯录是一个可以记录亲人、好友信息的工具。
本教程主要利用C++来实现一个通讯录管理系统
系统中需要实现的功能如下:
- 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 删除联系人:按照姓名进行删除指定联系人
- 查找联系人:按照姓名查看指定联系人信息
- 修改联系人:按照姓名重新修改指定联系人
- 清空联系人:清空通讯录中所有信息
- 退出通讯录:退出当前使用的通讯录
2、创建项目
创建项目步骤如下:
- 创建新项目
- 添加文件
2.1 创建项目
打开vs2019后,点击创建新项目,创建新的C++项目
填写项目名称,选择项目路径
2.2添加源文件
添加成功后,效果如图:
至此,项目已创建完毕
3、菜单功能
功能描述: 用户选择功能的界面
步骤:
- 封装函数显示该界面 如
void showMean()
- 在main函数中调用封装好的函数
代码:
#include<iostream>
using namespace std;
//1.2 showMean函数声明
void showMean();
int main() {
//1.3 调用showmean函数展示通讯录管理系统的功能页面
showMean();
system("pause");
return 0;
}
//1.1 定义一个showmean函数用于展示通讯录管理系统的功能页面
void showMean() {
cout << "欢迎使用通讯录管理系统" << endl;
cout << "1、添加联系人" << endl;
cout << "2、删除联系人" << endl;
cout << "3、修改联系人" << endl;
cout << "4、查询联系人" << endl;
cout << "5、显示通讯录系统所有联系人" << endl;
cout << "6、清空通讯录系统所有联系人" << endl;
cout << "0、退出通讯录管理系统" << endl;
cout << "请根据功能菜单对应的数字进行功能选择" << endl;
}
菜单界面效果如下图:
4、退出功能
功能描述:退出通讯录系统
思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建
当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序
代码:
#include<iostream>
using namespace std;
//1.2 showMean函数声明
void showMean();
//2.3 isNumber函数声明
int isNumber();
int main() {
//2.1.定义一个selectNumber变量用于存储用户输入的数字
int selectNumber;
//2.7.当客户输入有误,重新输入
while (true) {
//1.3 调用showmean函数展示通讯录管理系统的功能页面
showMean();
//2.4 调用isNumber函数对输入的内容进行校核并将用户在窗口输入的数字保存到变量中
string promptLanguage = "请输入数字";
selectNumber = isNumber(promptLanguage);
//2.5.对用户输入的数字进行判断,展示相应功能给客户进行操作
switch (selectNumber) {
case 1://①添加联系人
break;
case 2://②删除联系人
break;
case 3://③修改联系人
break;
case 4://④查询联系人
break;
case 5://⑤显示通讯录系统所有联系人
break;
case 6://⑥清空通讯录系统所有联系人
break;
case 0://⑦退出通讯录管理系统
//2.6 当客户输入0时,提示退出通讯录管理系统
cout << "欢迎你下次使用通讯录管理系统" << endl;
system("pause");
return 0;
break;
default:
cout << "请根据功能菜单对应的数字进行功能选择:" << endl;
system("cls");
break;
}
}
system("pause");
return 0;
}
//1.1 定义一个showmean函数用于展示通讯录管理系统的功能页面
void showMean() {
cout << "欢迎使用通讯录管理系统" << endl;
cout << "1、添加联系人" << endl;
cout << "2、删除联系人" << endl;
cout << "3、修改联系人" << endl;
cout << "4、查询联系人" << endl;
cout << "5、显示通讯录系统所有联系人" << endl;
cout << "6、清空通讯录系统所有联系人" << endl;
cout << "0、退出通讯录管理系统" << endl;
cout << "请根据功能菜单对应的数字进行功能选择" << endl;
}
//2.2 定义一个isNumber函数用于对客户输入的内容进行校核
int isNumber(string promptLanguage) {
int isNumber;
cout << promptLanguage << endl;
cin >> isNumber;
//4.判断输入是否有效
while (cin.fail())
{
cin.clear();
cin.ignore(100, '\n');
cout << "You can only enter numbers.";
cout << "Enter a number:" << endl;
cin >> isNumber;
}
return isNumber;
}
效果图:
5、添加联系人
功能描述:
实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)
添加联系人实现步骤:
- 设计联系人结构体
- 设计通讯录结构体
- main函数中创建通讯录
- 封装添加联系人函数
- 测试添加联系人功能
5.1 设计联系人结构体
联系人信息包括:姓名、性别、年龄、联系电话、家庭住址
设计如下:
//如果引用string报错,进行添加string头文件
#include <string>
//4.1 定义一个联系人结构体
struct linkMan
{
//姓名
string m_Name;
//性别:1男 2女
int m_Sex;
//年龄
int m_Age;
//电话
string m_Phone;
//住址
string m_Addr;
};
5.2 设计通讯录结构体
设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量
设计如下
//4.2 定义一个宏常量来方便对通讯录系统的联系人的容量
#define max_LinkMans 1000
//4.3 定义一个通讯录结构体
struct Addressbooks {
//定义一个联系人数组来满足通讯录中保存的联系人
struct linkMan linkManArray[max_LinkMans];
//定义一个变量来记录通讯录中人员数量
int m_Size;
};
5.3 main函数中创建通讯录
添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录
int main() {
//4.4 创建一个通讯录的变量
struct Addressbooks abs;
//4.5 初始化通讯录中记录通讯录中人员数量
abs.m_Size = 0;
//2.1 定义一个selectNumber变量用于存储用户输入的数字
int selectNumber;
//2.7.当客户输入有误,重新输入
while (true) {
//1.3 调用showmean函数展示通讯录管理系统的功能页面
showMean();
//2.4 调用isNumber函数对输入的内容进行校核并将用户在窗口输入的数字保存到变量中
string promptLanguage = "请输入数字";
selectNumber = isNumber(promptLanguage);
//2.5 对用户输入的数字进行判断,展示相应功能给客户进行操作
switch (selectNumber) {
case 1://①添加联系人
break;
case 2://②删除联系人
break;
case 3://③修改联系人
break;
case 4://④查询联系人
break;
case 5://⑤显示通讯录系统所有联系人
break;
case 6://⑥清空通讯录系统所有联系人
break;
case 0://⑦退出通讯录管理系统
//2.6 当客户输入0时,提示退出通讯录管理系统
cout << "欢迎你下次使用通讯录管理系统" << endl;
system("pause");
return 0;
break;
default:
cout << "请根据功能菜单对应的数字进行功能选择:" << endl;
system("cls");
break;
}
}
system("pause");
return 0;
}
5.4 封装添加联系人函数
思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录
添加联系人代码:
//4.7 addLinkMan函数声明
void addLinkMan(Addressbooks* abs);
//4.6 定义一个addLinkMan函数用于在通讯录管理系统的进行添加联系人
//注意:形参推荐地址传递,方便对通讯录系统进行中存储的数据进行同步
void addLinkMan(Addressbooks* abs) {
//1.当通讯录管理系统爆满时,提示客户无法添加联系人
if (abs->m_Size >= max_LinkMans) {
cout << "通讯录系统空间已满,无法添加联系人" << endl;
return;
}
else {
//2.定义5个变量用于存储客户输入的联系人的成员列表
string name;//姓名
int sex;//性别
int age;//年龄
string phone;//电话
string address;//地址
//3.提示客户输入相应的联系人的属性,将客户输入的联系人属性数据进行存储到通讯录中
cout << "请输入姓名:" << endl;
cin >> name;
abs->linkManArray[abs->m_Size].m_Name = name;
cout << "请输入性别:" << endl;
cout << "1代表男,0代表女" << endl;
cout << "请根据性别对应的数字进行输入:" << endl;
//4.定义根据要求输入性别对应的数字,否则需要重新输入
while (true) {
cin >> sex;
if (sex == 0 || sex == 1) {
abs->linkManArray[abs->m_Size].m_Sex = sex;
break;
}
else {
cout << "你输入的数字无对应的性别,请重新输入" << endl;
}
}
cout << "请输入年龄:" << endl;
cin >> age;
abs->linkManArray[abs->m_Size].m_Age = age;
cout << "请输入电话:" << endl;
cin >> phone;
abs->linkManArray[abs->m_Size].m_Phone = phone;
cout << "请输入居住地址:" << endl;
cin >> address;
abs->linkManArray[abs->m_Size].m_Addr = address;
//5.对通讯录中人员数量进行更新
abs->m_Size++;
//6.系统提示,添加联系人成功
cout << "新增联系人成功!" << endl;
return;
}
}
5.5 测试添加联系人功能
在switch case 语句中,case 1里添加:
case 1://①添加联系人
//4.8 调用addLinkMan函数
addLinkMan(&abs);
system("pause");
system("cls");
break;
选择界面中,如果用户选择了1,代表添加联系人,我们可以测试下该功能
测试效果如图:
6、显示联系人
功能描述:显示通讯录中已有的联系人信息
显示联系人实现步骤:
- 封装显示联系人函数
- 测试显示联系人功能
6.1 封装显示联系人函数
思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
显示联系人代码:
//5.2 showAllLinkMans函数声明
void showAllLinkMans(Addressbooks* abs);
//5.1 定义一个showAllLinkMans函数用于展示通讯录管理系统中所有联系人
void showAllLinkMans(Addressbooks* abs) {
//1.当通讯录管理系统无联系人时,提示客户通讯录联系人列表为空
if (abs->m_Size == 0) {
cout << "抱歉,当前通讯录联系人列表为空!" << endl;
}
else {
//2.通过for循环来输出通讯录联系人列表信息
for (int i = 0; i < abs->m_Size; i++)
{
cout << "姓名:" << abs->linkManArray[i].m_Name << "\t";
//注意:添加括号之后,括号内的优先级优先于括号外
cout << "性别:" << (abs->linkManArray[i].m_Sex == 1 ? "男" : "女") << "\t";
cout << "年龄:" << abs->linkManArray[i].m_Age << "\t";
cout << "电话:" << abs->linkManArray[i].m_Phone << "\t";
cout << "住址:" << abs->linkManArray[i].m_Addr << endl;
}
}
}
6.2 测试显示联系人功能
在switch case 语句中,case 5里添加:
case 5://⑤显示通讯录系统所有联系人
//5.3 调用showAllLinkMans函数
showAllLinkMans(&abs);
system("pause");
system("cls");
break;
选择界面中,如果用户选择了5,代表显示通讯录系统所有联系人,我们可以测试下该功能
测试效果如图:
7、删除联系人
功能描述:按照姓名进行删除指定联系人
删除联系人实现步骤:
- 封装检测联系人是否存在
- 封装删除联系人函数
- 测试删除联系人功能
7.1 封装检测联系人是否存在
设计思路:
删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人
因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1
检测联系人是否存在代码:
//6.2 existLinkManName函数声明
int isExistLinkManName(Addressbooks* abs, string name);
//6.1 定义一个existLinkManName函数用于根据客户输入的姓名查询通讯录管理系统中所有联系人,是否已经存在该姓名对应的联系人信息
int isExistLinkManName(Addressbooks* abs, string name) {
for (int i = 0; i < abs->m_Size; i++) {
//注意;存在返回该姓名对应的联系人在通讯录数组中最小索引位置,不存在返回-1
if (abs->linkManArray[i].m_Name == name) {
return i;
}
}
return -1;
}
7.2 封装删除联系人函数
根据用户输入的联系人判断该通讯录中是否有此人
查找到进行删除,并提示删除成功
查不到提示查无此人。
//7.2 deleteLinkManName函数声明
void deleteLinkManName(Addressbooks* abs);
//7.1定义一个deleteLinkManName函数用于根据客户输入的姓名查询通讯录管理系统中所有联系人,存在该姓名对应的联系人信息则进行删除
void deleteLinkManName(Addressbooks* abs) {
//1.定义一个变量存储客户输入的联系人姓名
cout << "请输入你要删除的联系人姓名:" << endl;
string name;
cin >> name;
//2.调用isExistLinkManName判断通讯录联系人列表是否存在该姓名对应的联系人
int result = isExistLinkManName(abs, name);
//3.定义一个整型的数组,用来保存相同联系人的姓名的索引位置,方便后续删除
int nameIndex[max_LinkMans];
//4.定义一个变量记录客户查询到姓名对应的联系人记录数目
int count_size = 0;
//5.根据查询返回的结果进行判断,返回-1表示无搜索结果,返回为非-1表示存在联系人
if (result == -1) {
cout << "无搜索结果" << endl;
}
else {
//6.将通讯录中根据姓名查找到的联系人展示出来
cout << "联系人信息如下:" << endl;
for (int i = result; i < abs->m_Size; i++) {
if (abs->linkManArray[i].m_Name == name) {
cout << "姓名:" << abs->linkManArray[i].m_Name << "\t性别:" << abs->linkManArray[i].m_Sex << "\t年龄:" << abs->linkManArray[i].m_Age << "\t电话:" << abs->linkManArray[i].m_Phone << "\t地址" << abs->linkManArray[i].m_Addr << endl;
//7.将查找到联系人的索引下标存入数组中
nameIndex[count_size] = i;
//8.更新nameIndex数组中的数量
count_size++;
}
}
//9.将通讯录中根据姓名查找到的联系人进行删除
for (int n = 0; n < count_size; n++) {
for (int j = nameIndex[n]; j < abs->m_Size; j++) {
//10.数据迁移
abs->linkManArray[j] = abs->linkManArray[j + 1];
}
//11.数据迁移的时候,通讯录中的根据姓名查找到的联系人的下标也在发生改变
nameIndex[n + 1] = nameIndex[n + 1] - n - 1;
}
//12.系统提示,删除联系人成功
cout << "删除联系人成功!" << endl;
//13.对通讯录中联系人数量进行更新
abs->m_Size -= count_size;
}
}
7.3 测试删除联系人功能
在switch case 语句中,case3里添加:
case 2://②删除联系人
//7.3 调用deleteLinkManName函数
deleteLinkManName(&abs);
system("pause");
system("cls");
break;
选择界面中,如果用户选择了2,代表根据联系人姓名删除通讯录系统相应联系人,我们可以测试下该功能
测试效果如图:
存在情况:
不存在情况:
8、查找联系人
功能描述:按照姓名查看指定联系人信息
查找联系人实现步骤
- 封装查找联系人函数
- 测试查找指定联系人
8.1 封装查找联系人函数
实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。
查找联系人代码:
//8.2 showLinkMans函数声明
void showLinkMans(Addressbooks* abs);
// 8.1 定义一个showLinkMans函数用于根据客户输入的联系人姓名查询相应的联系人信息
void showLinkMans(Addressbooks* abs) {
//1.定义一个变量保存客户输入的联系人姓名
string name;
cout << "请输入你要查询的联系人姓名:" << endl;
cin >> name;
//2.调用isExistLinkManName来判断客户输入的联系人姓名在通讯录系统中是否存在,
int result = isExistLinkManName(abs, name);
//3.存在返回通讯录数组中最小的联系人信息的下标索引,不存在返回-1
if (result != -1) {
cout << "联系人信息如下:" << endl;
for (int i = result; i < abs->m_Size; i++) {
if (abs->linkManArray[i].m_Name == name) {
cout << "姓名:" << abs->linkManArray[i].m_Name << "\t性别:" << abs->linkManArray[i].m_Sex << "\t年龄:" << abs->linkManArray[i].m_Age << "\t电话:" << abs->linkManArray[i].m_Phone << "\t地址" << abs->linkManArray[i].m_Addr << endl;
}
}
}
else
{
cout << "无搜索结果" << endl;
}
}
8.2 测试查找指定联系人
在switch case 语句中,case4里添加:
case 4://④查询联系人
//8.3 调用showLinkMans函数
showLinkMans(&abs);
system("pause");
system("cls");
break;
测试效果如图
存在情况:
不存在情况:
9、修改联系人
功能描述:按照姓名重新修改指定联系人
修改联系人实现步骤
- 封装修改联系人函数
- 测试修改联系人功能
9.1 封装修改联系人函数
实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人
修改联系人代码:
//9.2 modifyLinkMan函数声明
void modifyLinkMan(Addressbooks* abs);
//10.2 showLinkManProperty函数声明
void showLinkManProperty();
// 9.1 定义一个函数用于根据客户输入的联系人姓名进行修改
void modifyLinkMan(Addressbooks* abs) {
//1.定义一个变量保存客户输入的联系人姓名
string name;
cout << "请输入你要修改的联系人姓名:" << endl;
cin >> name;
//2.调用isExistLinkManName来判断客户输入的联系人姓名在通讯录系统中是否存在,
int result = isExistLinkManName(abs, name);
//3.定义一个整型的数组,用来保存相同联系人的姓名的索引位置,方便后续修改
int nameIndex[max_LinkMans];
//4.定义一个变量记录客户查询到姓名对应的联系人记录数目
int count_size = 0;
//9. 定义一个变量接受客户输入的内容
int number;
//10.定义一个变量编写提示语
string promptLanguage;
//5.存在返回通讯录数组中最小的联系人信息的下标索引,不存在返回-1
if (result != -1) {
//6.将通讯录中根据姓名查找到的联系人展示出来
cout << "联系人信息如下:" << endl;
for (int i = result; i < abs->m_Size; i++) {
if (abs->linkManArray[i].m_Name == name) {
cout <<"第"<< count_size + 1 <<"条" << "姓名:" << abs->linkManArray[i].m_Name << "\t性别:" << abs->linkManArray[i].m_Sex << "\t年龄:" << abs->linkManArray[i].m_Age << "\t电话:" << abs->linkManArray[i].m_Phone << "\t地址" << abs->linkManArray[i].m_Addr << endl;
//7.将查找到联系人的索引下标存入数组中
nameIndex[count_size] = i;
//8.更新nameIndex数组中的数量
count_size++;
}
}
//11,根据客户输入的输入修改的联系人记录,进行确认
while (true)
{
promptLanguage = "请输入你要修改第几条记录对应的联系人";
number = isNumber(promptLanguage);
cout << "当前记录数为:" << count_size << endl;
if (0 < number && number <= count_size) {
cout << "你确定修改的联系人信息如下:" << endl;
cout << "姓名:" << abs->linkManArray[nameIndex[number - 1]].m_Name << "\t性别:" << abs->linkManArray[nameIndex[number - 1]].m_Sex << "\t年龄:" << abs->linkManArray[nameIndex[number - 1]].m_Age << "\t电话:" << abs->linkManArray[nameIndex[number - 1]].m_Phone << "\t地址" << abs->linkManArray[nameIndex[number - 1]].m_Addr << endl;
break;
}
else
{
cout << "你输入的数字对应的联系人不存在,请重新输入" << endl;
}
}
//12.定义一个bool类型变量控制while循环退出
bool flag = true;
while (flag)
{
//13.(10.3)调用showLinkManProperty函数展示客户可以根据序号对应联系人信息进行修改
showLinkManProperty();
//14.定义一个变量用于存储客户数据修改联系人信息的数字
int num;
promptLanguage = "请输入数字";
num = isNumber(promptLanguage);
//13.根据菜单对应联系人信息进行修改
switch (num)
{
case 1://①修改联系人姓名
{
string input_name;
cout << "请输入姓名:" << endl;
cin >> input_name;
abs->linkManArray[number-1].m_Name = input_name;
cout << "已修改用户名" << endl;
system("pause");
system("cls");
}
break;
case 2://②修改联系人性别
{
int input_sex;
cout << "请输入性别:" << endl;
cout << "1代表男,0代表女" << endl;
cout << "请根据性别对应的数字进行输入:" << endl;
cin >> input_sex;
abs->linkManArray[number-1].m_Sex = input_sex;
cout << "已修改性别" << endl;
system("pause");
system("cls");
}
break;
case 3://③修改联系人年龄
{
int input_age;
cout << "请输入年龄:" << endl;
cin >> input_age;
abs->linkManArray[number-1].m_Age = input_age;
cout << "已修改年龄" << endl;
system("pause");
system("cls");
}
break;
case 4://④修改联系人电话
{
string input_phone;
cout << "请输入电话号码:" << endl;
cin >> input_phone;
abs->linkManArray[number-1].m_Phone = input_phone;
cout << "已修改电话号码" << endl;
system("pause");
system("cls");
}
break;
case 5://⑤修改联系人地址
{
string input_address;
cout << "请输入地址:" << endl;
cin >> input_address;
abs->linkManArray[number-1].m_Addr = input_address;
cout << "已修改地址" << endl;
system("pause");
system("cls");
}
break;
case 0://⑥退出联系人编辑
flag = false;
break;
default:
cout << "请根据联系人信息对应的数字进行信息修改:" << endl;
break;
}
}
//14.系统提示,修改联系人成功
cout << "修改联系人成功!" << endl;
}
else
{
cout << "无搜索结果" << endl;
}
}
//10.1 定义一个showmean函数用于展示通讯录管理系统的功能页面
void showLinkManProperty() {
cout << "联系人信息编辑" << endl;
cout << "1、修改姓名" << endl;
cout << "2、修改性别" << endl;
cout << "3、修改年龄" << endl;
cout << "4、修改电话" << endl;
cout << "5、修改地址" << endl;
cout << "0、修改完毕" << endl;
cout << "请根据信息编辑对应的数字进行联系人信息修改" << endl;
}
9.2 测试修改联系人功能
在switch case 语句中,case 5里添加:
case 3://③修改联系人
//9.3 调用modifyLinkMan函数
modifyLinkMan(&abs);
system("pause");
system("cls");
break;
测试效果如图:
查不到指定联系人情况:
查找到联系人,并修改成功:
再次查看通讯录,确认修改完毕
10、清空联系人
功能描述:清空通讯录中所有信息
清空联系人实现步骤
- 封装清空联系人函数
- 测试清空联系人
10.1 封装清空联系人函数
实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。
清空联系人代码:
//11.2 showLinkManProperty函数声明
void clearLinkMans(Addressbooks* abs);
//11.1 定义一个clearLinkMans函数用于清空通讯录管理系统中的联系人列表
void clearLinkMans(Addressbooks* abs) {
cout << "你是否要清空通讯录中联系人信息" << endl;
cout << "请确定:" << endl;
cout << "y代表是,n代表否" << endl;
cout << "请根据是否对应的字符进行输入:" << endl;
// 定义一个变量保存客户输入的字符
char character;
while (true) {
cin >> character;
if (character == 'y') {
// 注意:当需要清空已存在通讯录管理系统中的联系人列表,只需要将记录通讯录中的联系人数量
abs->m_Size = 0;
cout << "已清空通讯录" << endl;
break;
}
else if (character == 'n') {
cout << "取消清空通讯录" << endl;
break;
}
else {
cout << "你输入的字符无效,请重新输入" << endl;
}
}
}
10.2 测试清空联系人
在switch case 语句中,case 6 里添加:
case 6://⑥清空通讯录系统所有联系人
//11.3 调用clearLinkMans函数
clearLinkMans(&abs);
system("pause");
system("cls");
break;
测试效果如图:
查看通讯录
清空通讯录
再次查看信息,显示记录为空
至此,通讯录管理系统完成!