目录
前言
通讯录管理系统,可以用于记录联系人信息,也可以进行增删改的功能(暂无利用文件操作存储信息)。
编写工具为:Microsoft Visual Studio2022
工具下载:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器
1.系统需求
可用于记录联系人的信息(姓名,性别,年龄,电话号码等)
主要功能: ① 添加联系人信息:用于添加联系人的各种信息
② 修改联系人信息:用于修改联系人的某一样信息
③ 删除联系人信息:可以删除某一位联系人信息
④ 浏览联系人信息:展示所记录的所有联系人信息
⑤ 查找联系人信息:按照姓名查找对应联系人的信息
⑥ 清空通讯录信息:清空所记录的所有信息
辅助功能: ① 检测联系人信息:检测联系人信息是否重复
② 排序联系人信息:按照联系人姓名的顺序进行联系人信息的排序
③ 菜单:封装一个可以展示选项和进行选择的菜单函数
2.系统功能
2.1 联系人结构体
#define MAX 100 //设置封装好的信息的最大数目
typedef struct Information
{
string name; //姓名
int sex_num = NULL; //性别
int age = NULL; //年龄
long long Phone = NULL; //电话号码
}Informations;
typedef struct my_Info
{
Informations infos[MAX]; //信息结构体
int In_size = NULL; //信息计数器
}Infos;
2.2 功能函数
2.2.1 菜单
作用:展示出系统的各种选项功能,同时进行功能的选择,以此对联系人信息进行增添、删减、修改等功能
函数:void MainMenu()
void MainMenu()
{
bool flag = true; //循环标志
system("cls"); //清屏
int choose = 0; //选项
Infos Info;
Info.In_size = 0;
while (flag) {
//Menu
cout << "\t********************************" << endl;
cout << "\t***** 1.添加联系人信息 *****" << endl;
cout << "\t***** 2.修改联系人信息 *****" << endl;
cout << "\t***** 3.删除联系人信息 *****" << endl;
cout << "\t***** 4.浏览联系人信息 *****" << endl;
cout << "\t***** 5.查找联系人信息 *****" << endl;
cout << "\t***** 6.清空通讯录信息 *****" << endl;
cout << "\t***** 0.退出通讯录系统 *****" << endl;
cout << "\t********************************" << endl;
cout << "请选择(0-6):";
cin >> choose; //获取选项
switch (choose)
{
case 0:
flag = false; //退出通讯录系统
break;
case 1:
AddInfo(&Info); //添加联系人信息
break;
case 2:
AfterInfo(&Info); //修改联系人信息
break;
case 3:
DelInfo(&Info); //删除联系人信息
break;
case 4:
InfoList(&Info); //浏览联系人信息
break;
case 5:
FindInfo(&Info); //查找联系人信息
break;
case 6:
AllDelInfo(&Info); //清空通讯录信息
break;
default:
cout << "输入有误,请重新输入" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
break;
}
}
}
2.2.2 检测联系人信息
作用:利用遍历对比信息的方法,避免了在修改、删除或添加时不会出现修改不存在联系人信息、删除不存在联系人信息或添加已存在联系人信息等问题的出现;同时可以在查找信息的检测联系人是否存在,以便快速查找到联系人的信息。
函数:int CheckInfo(Infos* Info, string name)
解释:若检测出联系人已经存在,则返回联系人所在的位置;若联系人不存在,则返回-1
int CheckInfo(Infos* Info, string name)
{
for (int i = 0; i < Info->In_size; i++)
{
if (Info->infos[i].name == name)
{
return i; //表示存在
}
}
return -1; //表示不存在
}
2.2.3 排序联系人信息
作用:为了能够清晰的查看联系人的信息,所以按照联系人姓名的字典顺序进行信息的排序;该排序功能函数采用的是冒泡排序的方法。
函数:void SortInfo(Infos* Info)
void SortInfo(Infos* Info)
{
if (Info->In_size >= 2)
{
for (int i = 0; i < Info->In_size; i++)
{
for (int j = 0; j < Info->In_size; j++)
{
if (Info->infos[j].name > Info->infos[i].name) //升序排序
{
Informations data;
data = Info->infos[i];
Info->infos[i] = Info->infos[j];
Info->infos[j] = data;
}
}
}
}
}
2.2.4 添加联系人信息
作用:将需要添加的联系人信息一步一步地记录在系统中;在记录完成之后会对已存在的联系人信息进行排序。
函数:void AddInfo(Infos* Info)
void AddInfo(Infos* Info)
{
if (Info->In_size == MAX) //判断联系人数量是否已满
{
cout << "通讯录已满" << endl;
system("pause");
system("cls");
return;
}
else
{
string name;
int sex_num = 0;
int age = 0;
long long phone = 0;
//姓名
cout << "请输入姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1) //判断联系人是否存在
{
cout << "该联系人已存在" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
else
{
Info->infos[Info->In_size].name = name;
}
//性别
cout << "请输入性别" << endl;
cout << "1--男\n2--女" << endl;
cin >> sex_num;
while (sex_num != 1 && sex_num != 2)
{
cout << "输入有误,请重新输入" << endl;
cin >> sex_num;
}
Info->infos[Info->In_size].sex_num = sex_num;
//年龄
cout << "请输入年龄" << endl;
cin >> age;
Info->infos[Info->In_size].age = age;
//电话
cout << "请输入联系电话" << endl;
cin >> phone;
Info->infos[Info->In_size].Phone = phone;
//更新通讯录人数
Info->In_size += 1;
cout << "添加成功" << endl;
SortInfo(Info);
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
2.2.5 修改联系人信息
作用:对已添加的联系人的信息进行修改,同时会对修改完成的联系人信息再次进行排序。
函数:void AfterInfo(Infos* Info)
void AfterInfo(Infos* Info)
{
string name;
if (Info->In_size == 0) //判断通讯录中是否存在记录
{
cout << "当前记录为空" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name); //记录检测联系人的返回结果
if (Check != -1)
{
cout << "\t(1) 姓名\t(2) 性别\n\t(3) 年龄\t(4) 联系电话" << endl;
cout << "请选择需要修改的信息(1~4):" << endl;
int choose = 0;
cin >> choose;
switch (choose)
{
case 1: //修改姓名
{
string name;
cout << "请输入姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
cout << "该联系人已存在" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
else
{
Info->infos[Info->In_size].name = name;
SortInfo(Info);
cout << "修改成功" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
}
break;
case 2: //修改性别
{
int sex_num = NULL;
cout << "请输入性别" << endl;
cout << "1--男\n2--女" << endl;
cin >> sex_num;
while (sex_num != 1 && sex_num != 2)
{
cout << "输入有误,请重新输入" << endl;
cin >> sex_num;
}
Info->infos[Info->In_size].sex_num = sex_num;
cout << "修改成功" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
break;
case 3: //修改年龄
{
int age = NULL;
cout << "请输入年龄" << endl;
cin >> age;
Info->infos[Info->In_size].age = age;
cout << "修改成功" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
break;
case 4: //修改联系电话
{
long long phone = NULL;
cout << "请输入联系电话" << endl;
cin >> phone;
Info->infos[Info->In_size].Phone = phone;
cout << "修改成功" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
break;
default:
break;
}
}
else
{
cout << "该联系人不存在" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
}
}
2.2.6 删除联系人信息
作用:利用检测联系人是否存在的功能找到需要删除的联系人,若存在联系人,则进行删除;若不存在,则删除失败;
函数:void DelInfo(Infos* Info)
void DelInfo(Infos* Info)
{
string name;
if (Info->In_size == 0) //判断通讯录中是否存在记录
{
cout << "当前记录为空" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name); //记录检测联系人的返回结果
if (Check != -1)
{
for (int i = Check; i < Info->In_size; i++)
{
Info->infos[i] = Info->infos[i + 1];
}
Info->In_size -= 1;
cout << "删除成功" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
else
{
cout << "该联系人不存在" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
return;
}
}
}
2.2.7 浏览联系人信息
作用:将系统中记录的所有信息逐个打印出来。
函数:void InfoList(Infos* Info)
注:该功能函数使用了三目运算符,Info->infos[i].sex_num == 1 ? "男" : "女"
void InfoList(Infos* Info)
{
if (Info->In_size == 0) //判断通讯录是否存在记录
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
return;
}
else
{
//cout << "\t姓名\t" << "性别\t" << "年龄\t" << "电话" << endl;
for (int i = 0; i < Info->In_size; i++)
{
cout << "\t" << i + 1 <<
"\t姓名:" << Info->infos[i].name <<
"\t性别:" << (Info->infos[i].sex_num == 1 ? "男" : "女") <<
"\t年龄:" << Info->infos[i].age <<
"\t电话:" << Info->infos[i].Phone << endl;
}
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
2.2.8 查找联系人信息
作用:利用检测联系人是否存在的功能寻找到所需要的联系人信息,并将其打印出来
函数:void FindInfo(Infos* Info)
注:该功能函数使用了与InfoList函数中相同的三目运算符
void FindInfo(Infos* Info)
{
string name;
if (Info->In_size == 0)
{
cout << "当前记录为空" << endl; //判断通讯录是否存在记录
system("pause");
system("cls");
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name); //记录检测联系人的返回结果
if (Check != -1)
{
cout << "\t" << Check + 1 <<
"\t姓名:" << Info->infos[Check].name <<
"\t性别:" << (Info->infos[Check].sex_num == 1 ? "男" : "女") <<
"\t年龄:" << Info->infos[Check].age <<
"\t电话:" << Info->infos[Check].Phone << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
else
{
cout << "该联系人不存在" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
}
2.2.9 清空通讯录信息
作用:将当前所记录的所有联系人信息进行间接清空的操作(改变结构体中的In_size).
函数:void AllDelInfo(Infos* Info)
解释:将In_size的值改为0,则系统将冲第一条开始记录,之后记录的信息将会覆盖原来的信息,达到间接清空联系人信息的作用。
void AllDelInfo(Infos* Info)
{
if (Info->In_size != 0) //判断通讯录是否存在记录
{
string choose;
cout << "确定要清空通讯录信息(Yes/No)?" << endl;
cin >> choose;
if (choose == "Yes")
{
Info->In_size = 0;
cout << "清空成功!" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
else
{
cout << "取消操作成功!" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
else
{
cout << "当前记录为空" << endl;
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
2.2.10 main函数
int main()
{
MainMenu();
return 0;
}
3,完整代码
#include <iostream>
#include <string>
#include <string.h>
#define MAX 100
using namespace std;
typedef struct Information
{
string name; //姓名
int sex_num = NULL; //性别
int age = NULL; //年龄
long long Phone = NULL; //电话号码
}Informations;
typedef struct my_Info
{
Informations infos[MAX];
int In_size = NULL;
}Infos;
//检测联系人是否存在
int CheckInfo(Infos* Info, string name)
{
for (int i = 0; i < Info->In_size; i++)
{
if (Info->infos[i].name == name)
{
return i; //表示存在
}
}
return -1; //表示不存在
}
//排序联系人信息(冒泡排序)
void SortInfo(Infos* Info)
{
if (Info->In_size >= 2)
{
for (int i = 0; i < Info->In_size; i++)
{
for (int j = 0; j < Info->In_size; j++)
{
if (Info->infos[j].name > Info->infos[i].name)
{
Informations data;
data = Info->infos[i];
Info->infos[i] = Info->infos[j];
Info->infos[j] = data;
}
}
}
}
}
//添加联系人信息
void AddInfo(Infos* Info)
{
if (Info->In_size == MAX)
{
cout << "通讯录已满" << endl;
system("pause");
system("cls");
return;
}
else
{
string name;
int sex_num = 0;
int age = 0;
long long phone = 0;
//姓名
cout << "请输入姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
cout << "该联系人已存在" << endl;
system("pause");
system("cls");
return;
}
else
{
Info->infos[Info->In_size].name = name;
}
//性别
cout << "请输入性别" << endl;
cout << "1--男\n2--女" << endl;
cin >> sex_num;
while (sex_num != 1 && sex_num != 2)
{
cout << "输入有误,请重新输入" << endl;
cin >> sex_num;
}
Info->infos[Info->In_size].sex_num = sex_num;
//年龄
cout << "请输入年龄" << endl;
cin >> age;
Info->infos[Info->In_size].age = age;
//电话
cout << "请输入联系电话" << endl;
cin >> phone;
Info->infos[Info->In_size].Phone = phone;
//更新通讯录人数
Info->In_size += 1;
cout << "添加成功" << endl;
SortInfo(Info);
system("pause"); //暂停操作,等待下一步
system("cls"); //清屏
}
}
//修改联系人信息
void AfterInfo(Infos* Info)
{
string name;
if (Info->In_size == 0)
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
return;
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
cout << "\t(1) 姓名\t(2) 性别\n\t(3) 年龄\t(4) 联系电话" << endl;
cout << "请选择需要修改的信息(1~4):" << endl;
int choose = 0;
cin >> choose;
switch (choose)
{
case 1: //修改姓名
{
string name;
cout << "请输入姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
cout << "该联系人已存在" << endl;
system("pause");
system("cls");
return;
}
else
{
Info->infos[Info->In_size].name = name;
SortInfo(Info);
cout << "修改成功" << endl;
system("pause");
system("cls");
return;
}
}
break;
case 2: //修改性别
{
int sex_num = NULL;
cout << "请输入性别" << endl;
cout << "1--男\n2--女" << endl;
cin >> sex_num;
while (sex_num != 1 && sex_num != 2)
{
cout << "输入有误,请重新输入" << endl;
cin >> sex_num;
}
Info->infos[Info->In_size].sex_num = sex_num;
cout << "修改成功" << endl;
system("pause");
system("cls");
return;
}
break;
case 3: //修改年龄
{
int age = NULL;
cout << "请输入年龄" << endl;
cin >> age;
Info->infos[Info->In_size].age = age;
cout << "修改成功" << endl;
system("pause");
system("cls");
return;
}
break;
case 4: //修改联系电话
{
long long phone = NULL;
cout << "请输入联系电话" << endl;
cin >> phone;
Info->infos[Info->In_size].Phone = phone;
cout << "修改成功" << endl;
system("pause");
system("cls");
return;
}
break;
default:
break;
}
}
else
{
cout << "该联系人不存在" << endl;
system("pause");
system("cls");
return;
}
}
}
//删除联系人信息
void DelInfo(Infos* Info)
{
string name;
if (Info->In_size == 0)
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
return;
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
for (int i = Check; i < Info->In_size; i++)
{
Info->infos[i] = Info->infos[i + 1];
}
Info->In_size -= 1;
cout << "删除成功" << endl;
system("pause");
system("cls");
return;
}
else
{
cout << "该联系人不存在" << endl;
system("pause");
system("cls");
return;
}
}
}
//浏览联系人信息
void InfoList(Infos* Info)
{
if (Info->In_size == 0)
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
return;
}
else
{
//cout << "\t姓名\t" << "性别\t" << "年龄\t" << "电话" << endl;
for (int i = 0; i < Info->In_size; i++)
{
cout << "\t" << i + 1 <<
"\t姓名:" << Info->infos[i].name <<
"\t性别:" << (Info->infos[i].sex_num == 1 ? "男" : "女") <<
"\t年龄:" << Info->infos[i].age <<
"\t电话:" << Info->infos[i].Phone << endl;
}
system("pause");
system("cls");
}
}
//查找联系人信息
void FindInfo(Infos* Info)
{
string name;
if (Info->In_size == 0)
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
}
else
{
cout << "请输入联系人姓名" << endl;
cin >> name;
int Check = CheckInfo(Info, name);
if (Check != -1)
{
cout << "\t" << Check + 1 <<
"\t姓名:" << Info->infos[Check].name <<
"\t性别:" << (Info->infos[Check].sex_num == 1 ? "男" : "女") <<
"\t年龄:" << Info->infos[Check].age <<
"\t电话:" << Info->infos[Check].Phone << endl;
system("pause");
system("cls");
}
else
{
cout << "该联系人不存在" << endl;
system("pause");
system("cls");
}
}
}
//清空通讯录信息
void AllDelInfo(Infos* Info)
{
if (Info->In_size != 0)
{
string choose;
cout << "确定要清空通讯录信息(Yes/No)?" << endl;
cin >> choose;
if (choose == "Yes")
{
Info->In_size = 0;
cout << "清空成功!" << endl;
system("pause");
system("cls");
}
else
{
cout << "取消操作成功!" << endl;
system("pause");
system("cls");
}
}
else
{
cout << "当前记录为空" << endl;
system("pause");
system("cls");
}
}
//菜单功能
void MainMenu()
{
bool flag = true; //循环标志
system("cls"); //清屏
int choose = 0; //储存选项
Infos Info;
Info.In_size = 0;
while (flag) {
//Menu
cout << "\t********************************" << endl;
cout << "\t***** 1.添加联系人信息 *****" << endl;
cout << "\t***** 2.修改联系人信息 *****" << endl;
cout << "\t***** 3.删除联系人信息 *****" << endl;
cout << "\t***** 4.浏览联系人信息 *****" << endl;
cout << "\t***** 5.查找联系人信息 *****" << endl;
cout << "\t***** 6.清空通讯录信息 *****" << endl;
cout << "\t***** 0.退出通讯录系统 *****" << endl;
cout << "\t********************************" << endl;
cout << "请选择(0-6):";
cin >> choose;
switch (choose)
{
case 0:
flag = false;
break;
case 1:
AddInfo(&Info);
break;
case 2:
AfterInfo(&Info);
break;
case 3:
DelInfo(&Info);
break;
case 4:
InfoList(&Info);
break;
case 5:
FindInfo(&Info);
break;
case 6:
AllDelInfo(&Info);
break;
default:
cout << "请重新输入" << endl;
break;
}
}
}
int main()
{
MainMenu();
return 0;
}
总结
在完成该系统的制作的,先是将会用到的功能列出来,然后再进行功能的逐步完善。在完成的过程中出现了很多种bug,但也花时间去解决了,不足之处就是一些不必要的代码段任然没找出,没能将代码进行简化显得有点杂糅。与此同时,这次完成好这个系统+做好笔记后让我对整体更加了解,也巩固了我对知识的理解,之后会继续努力,争取之后能够添加上文件操作的功能,以此来保存信息至本地文件中