通讯录是一个可以记录亲人、好友信息的工具。
本教程主要利用C++来实现一个通讯录管理系统
系统中需要实现的功能如下:
完整代码:
#include
#include // string头文件,用于字符串操作
#define MAX 1000 // 定义最大联系人数量,宏定义有助于后期维护,例如将1000改为其他数字时,只需修改这里即可
using namespace std;
/*
* 第一步,实现菜单系统
* 步骤:
* 1.定义一个结构体,存储联系人信息封装函数显示菜单图形界面:void showMenu()
* 2.在main函数中调用封装好的函数
*/
// 菜单界面
void showMenu() {
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;
}
/*
* 第二步,实现退出功能
* 思路:根据用户不同选择进入不同功能,可以选择switch分支结构将整个架构搭建
* 当用户选择0的时候,执行退出,选择其他先不做操作,也不会退出程序9后续补充其他数字实现的功能)
*/
/*
* 第三步:添加联系人
* 添加联系人步骤:
* 1.设计联系人结构体
* 2.设计通讯录结构体 // 一个联系人无法组成通讯录,需要设计一个通讯录结构体存储多个联系人,以及记录当前通讯录中有多少联系人,不能超过1000人
* 3.main函数中创建通讯录
* 4.封装添加联系人函数
* 5.测试添加联系人功能
*/
// 设计联系人结构体
struct Person {
string m_Name;
int m_Sex; // 性别 0-女 1-男
int m_Age; // 年龄
string m_Phone; // 电话号码
string m_Addr; // 家庭住址
};
// 设计通讯录结构体
struct Contact {
struct Person personArray[MAX]; // 定义一个数组存储联系人信息
int m_Size; // 记录当前通讯录中有多少联系人
};
//1.添加联系人
void addPerson(Contact* abs) {
//判断通讯录是否已满,如果满了就不再添加联系人
if(abs -> m_Size == MAX) {
cout << "通讯录已满,无法添加!" << endl;
return; // 结束函数
}
else {
// 添加具体联系人
//姓名
string name;
cout << "请输入姓名:" << endl;
cin >> name; // 输入姓名
abs->personArray[abs->m_Size].m_Name = name;
//性别
cout << "请输入性别" << endl;
cout << "0----女" << endl;
cout << "1----男" << endl;
int sex = 0;
// 实现循环展示菜单
while (true) {
cin >> sex;
if (sex == 0 || sex == 1) {
abs->personArray[abs->m_Size].m_Sex = sex; // 将性别存储到通讯录中
break; // 跳出循环
}
else {
cout << "输入有误,请重新输入性别" << endl;
cout << "0----女" << endl;
cout << "1----男" << endl;
}
}
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age; // 输入年龄
abs->personArray[abs->m_Size].m_Age = age; // 将年龄存储到通讯录中
//电话
cout << "请输入电话号码:" << endl;
string phone;
cin >> phone; // 输入电话号码
abs->personArray[abs->m_Size].m_Phone = phone; // 将电话号码存储到通讯录中
//住址
cout << "请输入家庭住址:" << endl;
string addr;
cin >> addr; // 输入家庭住址
abs->personArray[abs->m_Size].m_Addr = addr; // 将家庭住址存储到通讯录中
// 添加成功后,更新通讯录人数
abs->m_Size += 1; // 通讯录人数加1=
cout << "添加联系人成功!" << endl;
system("pause"); // 请按任意键继续
system("cls"); //清屏
}
}
// 2.显示联系人
// 步骤:
// 封装显示联系人函数
void showPerson(Contact* abs) {
// 判断通讯录中人数是否为0,如果为0则不显示联系人
// 如果不为0,显示联系人信息
if (abs->m_Size == 0) {
cout << "当前通讯录中没有联系人" << endl;
}
else {
for (int i = 0; i < abs->m_Size; i++) {
cout << "姓名:" << abs->personArray[i].m_Name << " ";
cout << "性别:" << ( abs->personArray[i].m_Sex == 0 ? "女" : "男" ) << " ";
cout << "年龄:" << abs->personArray[i].m_Age << " ";
cout << "电话:" << abs->personArray[i].m_Phone << " ";
cout << "住址:" << abs->personArray[i].m_Addr << endl;
cout << "--------------------------------" << endl; // 分隔线
}
}
system("pause"); // 暂停系统,等待用户按任意键继续
system("cls"); // 清屏
}
// 测试显示联系人功能
// 3.删除联系人功能
// 步骤:
// 3.1封装检测联系人是否存在函数
// 3.2封装删除联系人函数
// 3.3测试删除联系人功能
// 3.1设计思路:删除联系人前,先判断联系人是否存在,存在则删除,不存在则提示用户
// 因此可以把检测联系人是否存在的函数单独封装出来,如果存在则返回在通讯录中的位置,如果不存在则返回-1
int isExist(Contact* abs, string name) {
// 如果通讯录中没有联系人,则直接返回-1
if (abs->m_Size == 0) {
return -1;
}
// 通讯录不为空则遍历通讯录中的联系人
else {
for(int i = 0; i < abs->m_Size; i++) {
if (abs->personArray[i].m_Name == name) { // 如果找到了联系人
return i; // 返回联系人在通讯录中的位置
}
}
// 如果遍历完通讯录都没有找到联系人,则返回-1
return -1;
}
}
//3.2封装删除联系人函数
// 根据用户输入的联系人判断通讯录中是否有此人,
// 如果有则删除此人,并提示删除成功;如果没有则提示查无此人
void deletePerson(Contact* abs) {
cout << "请输入要删除的联系人姓名:" << endl;
string name;
cin >> name; // 输入要删除的联系人姓名
// ret=-1表示联系人不存在, ret>=0表示联系人存在
int ret = isExist(abs, name); // 调用检测联系人是否存在函数
if(ret == -1)
cout << "查无此人!" << endl; // 如果返回-1,说明联系人不存在
else {
// 查找到人,要进行删除操作
for (int i = ret; i < abs->m_Size - 1; i++) {
abs->personArray[i] = abs->personArray[i + 1]; // 将后面的联系人前移一位
}
// 最后一步,更新通讯录人数
abs->m_Size--; // 通讯录人数减1
cout << "删除联系人成功!" << endl;
}
}
// 4.查找联系人功能
// 步骤:
// 4.1封装查找联系人函数
// 测试查找联系人功能
void findPerson(Contact* abs) {
cout << "请输入要查找的联系人姓名:" << endl;
string name;
cin >> name; // 输入要查找的联系人姓名
// 调用检测联系人是否存在函数
int ret = isExist(abs, name);
if (ret == -1) {
cout << "查无此人!" << endl; // 如果返回-1,说明联系人不存在
}
else {
// 查找到人,输出联系人信息
cout << "姓名:" << abs->personArray[ret].m_Name << " ";
cout << "性别:" << (abs->personArray[ret].m_Sex == 0 ? "女" : "男") << " ";
cout << "年龄:" << abs->personArray[ret].m_Age << " ";
cout << "电话:" << abs->personArray[ret].m_Phone << " ";
cout << "住址:" << abs->personArray[ret].m_Addr << endl;
}
// 任意键按下后清屏
system("pause"); // 暂停系统,等待用户按任意键继续
system("cls"); // 清屏
}
// 5.修改联系人功能
// 步骤:
// 5.1封装修改联系人函数
// 测试修改联系人功能
// 思路:查找用户输入联系人,查找成功进行修改操作,查找失败提示查无此人
void modifyPerson(Contact* abs) {
cout << "请输入要修改的联系人姓名:" << endl;
string name;
cin >> name; // 输入要修改的联系人姓名
// 调用检测联系人是否存在函数
int ret = isExist(abs, name);
if (ret == -1) {
cout << "查无此人!" << endl; // 如果返回-1,说明联系人不存在
}
else { // 找到则要修改全部信息
// 姓名
cout << "请输入新的姓名:" << endl;
string newName;
cin >> newName; // 输入新的姓名
abs->personArray[ret].m_Name = newName; // 修改姓名
// 性别
cout << "请输入新的性别" << endl;
cout << "0----女" << endl;
cout << "1----男" << endl;
int newSex = 0;
// 实现循环展示菜单,只能输入0或1,如果输入其他则提示重新输入
while (true) {
cin >> newSex; // 输入新的性别
if (newSex == 0 || newSex == 1) {
abs->personArray[ret].m_Sex = newSex; // 修改性别
break; // 跳出循环
}
else {
cout << "输入有误,请重新输入" << endl;
cout << "0----女" << endl;
cout << "1----男" << endl;
}
}
// 年龄
cout << "请输入新的年龄:" << endl;
int newAge = 0;
cin >> newAge; // 输入新的年龄
abs->personArray[ret].m_Age = newAge; // 修改年龄
// 电话
cout << "请输入新的电话号码:" << endl;
string newPhone;
cin >> newPhone; // 输入新的电话号码
abs->personArray[ret].m_Phone = newPhone; // 修改电话号码
// 住址
cout << "请输入新的家庭住址:" << endl;
string newAddr;
cin >> newAddr; // 输入新的家庭住址
abs->personArray[ret].m_Addr = newAddr; // 修改家庭住址
// 修改成功提示
cout << "修改联系人成功!" << endl;
system("pause"); // 暂停系统,等待用户按任意键继续
system("cls"); // 清屏
}
}
// 6.清空联系人功能
// 步骤:
// 6.1封装清空联系人函数
// 测试清空联系人功能
// 思路:将通讯录中所有联系人信息清空,更新通讯录人数为0
void clearPerson(Contact* abs) {
// 将通讯录中所有联系人信息清空
// 再次确认是否清空联系人
cout << "您确定要清空所有联系人吗?" << endl;
cout << "1. 确定清空" << endl;
cout << "2. 取消清空" << endl;
int choice = 0;
cin >> choice; // 输入用户选择
if(choice != 1) { // 如果用户选择不是1,则取消清空
cout << "取消清空联系人!" << endl;
system("pause"); // 暂停系统,等待用户按任意键继续
system("cls"); // 清屏
return; // 结束函数
}
else {
// 如果用户选择是1,则清空联系人
cout << "正在清空联系人..." << endl;
abs->m_Size = 0;
cout << "清空联系人成功!" << endl;
system("pause"); // 暂停系统,等待用户按任意键继续
system("cls"); // 清屏
}
}
int main() {
// 创建通讯录结构体变量
Contact abs; // 定义一个通讯录变量
// 初始化通讯录中当前人员个数
abs.m_Size = 0; // 初始化通讯录中当前人员个数为0
bool is_true = true;
while (is_true) {
int select = 0; // 用户选择
// 菜单调用
showMenu();
cout << "请输入您的选择:" << endl;
cin >> select; // 输入用户选择
switch (select) {
case 1: // 添加联系人功能
addPerson(&abs); //利用地址传递,可以修饰实参
break;
case 2: // 显示联系人功能
showPerson(&abs); //利用地址传递,可以修饰实参
break;
case 3: // 删除联系人功能
deletePerson(&abs);
break;
case 4: // 查找联系人功能
findPerson(&abs);
break;
case 5: // 修改联系人功能
modifyPerson(&abs);
break;
case 6: // 清空联系人功能
clearPerson(&abs);
break;
case 0:
is_true = false;
cout << "感谢使用通讯录管理系统,欢迎下次使用!" << endl;
system("pause"); // 暂停系统,等待用户按任意键继续
break; // 退出程序
}
}
return 0;
}