阶段项目:通讯录项目系统
说明:
通讯录项目系统为之前所有知识的阶段性汇总
系统需求
通讯录是一个课记录亲人,好友信息的工具。我们利用C++来完成一个通讯录管理系统:
系统中主要实现以下功能:
- 添加联系人:想通讯录中添加新人,信息包括(姓名,性别,年龄,联系电话,家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 删除联系人:按照姓名进行删除指定联系人
- 查找联系人:按照姓名查看指定联系人信息
- 修改联系人:按照姓名重新修改指定联系人
- 情况联系人:情况通讯录中所有信息
- 退出通讯录:退出当前使用的通讯录
菜单功能
用户悬着功能的界面
步骤:
- 创建封装函数:showMenu()
- 在main函数中调用这个showMenu函数
代码:
#include <iostream>
using namespace std;
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;
}
int main()
{
showMenu();
system("pause");
return 0;
}
清空屏幕
代码:
// 清屏函数
void cleanScreen()
{
system("pause");
system("cls");
}
退出功能
功能描述:退出通讯录系统
思路:
根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建,当用户选择 0 时,直接退出,选择其他先不做操作,而不会退出程序
代码:
#include <iostream>
using namespace std;
int main()
{
// 保存程序一直运行,除了输入 0
while (true)
{
// 打印菜单,并提醒用户输入
showMenu(); // 打印菜单
cout << "请输入选择的操作:";
int select = 0;
cin >> select;
switch (select)
{
case 1: // 1 添加联系人
break;
case 2: // 2 显示联系人
break;
case 3: // 3 删除联系人
break;
case 4: // 4 查找联系人
break;
case 5: // 5 修改联系人
break;
case 6: // 6 清空联系人
break;
case 0: // 0 退出通讯录
cout << "还原下次使用" << endl;
return 0;
break;
default:
cout << "输入错误,请从新选择" << endl;
}
}
system("pause");
return 0;
}
添加联系人
实现添加联系人功能,联系人上线为1000人,联系人信息包括(姓名,性别,年龄,联系电话,家庭地址)
实现添加联系人的步骤:
- 设计联系人结构体
- 设计通讯录结构体
- main函数中创建通讯录
- 封装联系人添加函数
- 测试添加联系人功能
设计联系人结构体
代码:
//联系人结构体
struct Person
{
string p_Name; // 姓名
int p_Age; // 年龄
int p_Gender; // 1 男; 2女
string p_Phone; // 电话
string p_Addr; // 地址
};
设计通讯录结构体
代码:
// 通讯录结构体
struct AddressBooks
{
// 通讯录中保存联系人数组
struct Person personArry[MAX];
// 通讯录中当前联系人人数
int bookSize = 0;
};
main中初始化通讯录
代码:
// 初始化通讯录
struct AddressBooks abs; // 当用户选择了添加联系人,需要调用通讯录
// 初始化通讯录中的人数
abs.bookSize = 0;
封装联系人添加函数
代码:
// 添加联系人
void addPerson(struct AddressBooks* abs)
{
// 判断通讯录当前人数是否达到最大
if (abs->bookSize == MAX)
{
cout << "通讯录已达最大人数,无法添加!!!" << endl;
return;
}
else
{
// 添加具体联系人
// 添加姓名
cout << "请输入联系人姓名:";
string name;
cin >> name;
abs->personArry[abs->bookSize].p_Name = name;
// 添加性别
int gender = 0;
while (true)
{
cout << "请输入性别( 1-男 | 2-女 ):" ;
cin >> gender;
if (gender == 1 || gender == 2)
{
abs->personArry[abs->bookSize].p_Gender = gender;
break;
}
else
{
cout << "输入有误,请重新输入!!!" << endl;
}
}
//添加年龄
int age = 0;
while (true)
{
cout << "请输入年龄:";
cin >> age;
if (0 <= age && age< 130)
{
abs->personArry[abs->bookSize].p_Age = age;
break;
}
else
{
cout << "年龄不合法,请重新输入!!!" << endl;
}
}
// 添加电话
string phone = "";
while (true)
{
cout << "请输入联系人手机:";
string phone = "";
cin >> phone;
int a = phone.length();
if (phone.length() != 12)
{
abs->personArry[abs->bookSize].p_Phone = phone;
break;
}
else
{
cout << "手机号码格式不对,请重新输入!!!" << endl;
}
}
// 添加地址
string addr = "";
cout << "请输入联系人地址:";
cin >> addr;
abs->personArry[abs->bookSize].p_Addr = addr;
// 添加联系人成功人数自增
abs->bookSize++;
cout << "添加联系人成功!!!" << endl;
}
//添加联系人成功后,程序暂停,并清空屏幕
cleanScreen();
}
拼接联系人信息函数
由于多次用到打印用户信息,顾抽离出来一个单独的函数
代码:
// 显示用户信息
void showInfo(struct AddressBooks * abs, int user_id)
{
cout << "姓名:" << abs->personArry[user_id].p_Name << "\t"
<< "性别:" << (abs->personArry[user_id].p_Gender == 1 ? "男" : "女") << "\t" // 三目运算,将添加 数字1转换为男,2转换为女
<< "年龄:" << abs->personArry[user_id].p_Age << "\t"
<< "电话:" << abs->personArry[user_id].p_Phone << "\t"
<< "地址:" << abs->personArry[user_id].p_Addr << endl;
显示所有联系人
代码:
void showPerson(struct AddressBooks* abs)
{
// 判断通讯录人数是否为0,如果为0提示记录为空
if (abs->bookSize == 0)
{
cout << "通讯录中无记录" << endl;
}
else
{
for (int i = 0; i < abs->bookSize; i++)
{
showInfo(abs, i); // 调用拼接联系人信息函数
}
}
cleanScreen();
}
检测联系人是不是在通讯录中
代码:
// 检测联系人是否存在通讯录中
int isPersonExist(struct AddressBooks* abs, string name)
{
// 检测联系人是否存在,如果存在,返回联系人在数组中的具体位置,不存在返回 -1
for (int i = 0; i < abs->bookSize; i++)
{
if (abs->personArry[i].p_Name == name) // 找到了该联系人,返回下标
{
return i;
}
}
return -1;
}
删除联系人
代码:
// 删除联系人
void delPerson(struct AddressBooks* abs)
{
// 先判断通讯录是否为空,如果为空,直接返回
if (abs->bookSize == 0)
{
cout << "通讯录为空无联系人,不能删除!!!" << endl;
cleanScreen();
return;
}
cout << "请输入要删除的联系人姓名:";
string name;
cin >> name;
// 调用方法查询输入的姓名是否在通讯录中
int checkRet = isPersonExist(abs, name);
if (checkRet != -1)
{
for (int i = checkRet; i < abs->bookSize; i++)
{
abs->personArry[i] = abs->personArry[i + 1];
}
cout << "删除联系人【 " << name << " 】成功!!!" << endl;
abs->bookSize--;
}
else
{
cout << "查无此人" << endl;
}
cleanScreen();
}
查找联系人
代码:
// 查找联系人
void searchPerson(struct AddressBooks* abs)
{
cout << "请输入要查找的联系人姓名:";
string name;
cin >> name;
int searchRet = isPersonExist(abs, name);
if (searchRet != -1)
{
showInfo(abs, searchRet);
}
else
{
cout << "查无此人" << endl;
}
cleanScreen();
}
修改联系人
代码:
// 修改联系人
void modifyPerson(struct AddressBooks* abs)
{
cout << "请输入要修改的联系人姓名:";
string name;
cin >> name;
int checkRet = isPersonExist(abs, name);
if (checkRet != -1)
{
// 重新打印联系人未更改前信息
showInfo(abs, checkRet);
//修改姓名
cout << "请输入联系人新姓名:";
string newName = "";
cin >> newName;
abs->personArry[checkRet].p_Name = newName;
// 修改性别
cout << "请输入联系人新性别( 1-男 | 2-女 ):";
int newGender;
cin >> newGender;
abs->personArry[checkRet].p_Gender = newGender;
// 修改年龄
cout << "请输入联系人新年龄:";
int newAge;
cin >> newAge;
abs->personArry[checkRet].p_Age = newAge;
// 修改手机号
cout << "请输入联系人新手机号:";
string newPhone;
cin >> newPhone;
abs->personArry[checkRet].p_Phone = newPhone;
// 修改地址
cout << "请输入联系人新地址:";
string newAddr;
cin >> newAddr;
abs->personArry[checkRet].p_Addr = newAddr;
}
else
{
cout << "查无此人!!!" << endl;
}
cleanScreen();
}
清空联系人
代码:
// 清空联系人
void cleanPerson(struct AddressBooks* abs)
{
abs->bookSize = 0;
cout << "清空通讯录联系人成功!!!" << endl;
cleanScreen();
}
主函数
代码:
int main()
{
// 初始化通讯录
struct AddressBooks abs; // 当用户选择了添加联系人,需要调用通讯录
// 初始化通讯录中的人数
abs.bookSize = 0;
// 打印菜单,并提醒用户输入
while (true)
{
showMenu();
cout << "请输入选择的操作:";
int select = 0;
cin >> select;
switch (select)
{
case 1: // 1 添加联系人
addPerson(&abs);
break;
case 2: // 2 显示联系人
showPerson(&abs);
break;
case 3: // 3 删除联系人
delPerson(&abs);
break;
case 4: // 4 查找联系人
searchPerson(&abs);
break;
case 5: // 5 修改联系人
modifyPerson(&abs);
break;
case 6: // 6 清空联系人
cleanPerson(&abs);
break;
case 0: // 0 退出通讯录
cout << "欢迎下次使用" << endl;
return 0;
break;
default:
cout << "输入错误,请从新选择" << endl;
}
}
//system("pause");
return 0;
}
全部代码:
#include <iostream>
using namespace std;
#define MAX 100 // 宏变量设置通讯录最大人数
// 显示菜单
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;
}
//联系人结构体
struct Person
{
string p_Name; // 姓名
int p_Age; // 年龄
int p_Gender; // 1 男; 2女
string p_Phone; // 电话
string p_Addr; // 地址
};
// 通讯录结构体
struct AddressBooks
{
// 通讯录中保存联系人数组
struct Person personArry[MAX];
// 通讯录中当前联系人人数
int bookSize = 0;
};
// 显示用户信息
void showInfo(struct AddressBooks * abs, int user_id)
{
cout << "姓名:" << abs->personArry[user_id].p_Name << "\t"
<< "性别:" << (abs->personArry[user_id].p_Gender == 1 ? "男" : "女") << "\t" // 三目运算,将添加 数字1转换为男,2转换为女
<< "年龄:" << abs->personArry[user_id].p_Age << "\t"
<< "电话:" << abs->personArry[user_id].p_Phone << "\t"
<< "地址:" << abs->personArry[user_id].p_Addr << endl;
}
// 清屏函数
void cleanScreen()
{
system("pause");
system("cls");
}
// 添加联系人
void addPerson(struct AddressBooks* abs)
{
// 判断通讯录当前人数是否达到最大
if (abs->bookSize == MAX)
{
cout << "通讯录已达最大人数,无法添加!!!" << endl;
return;
}
else
{
// 添加具体联系人
// 添加姓名
cout << "请输入联系人姓名:";
string name;
cin >> name;
abs->personArry[abs->bookSize].p_Name = name;
// 添加性别
int gender = 0;
while (true)
{
cout << "请输入性别( 1-男 | 2-女 ):" ;
cin >> gender;
if (gender == 1 || gender == 2)
{
abs->personArry[abs->bookSize].p_Gender = gender;
break;
}
else
{
cout << "输入有误,请重新输入!!!" << endl;
}
}
//添加年龄
int age = 0;
while (true)
{
cout << "请输入年龄:";
cin >> age;
if (0 <= age && age< 130)
{
abs->personArry[abs->bookSize].p_Age = age;
break;
}
else
{
cout << "年龄不合法,请重新输入!!!" << endl;
}
}
// 添加电话
string phone = "";
while (true)
{
cout << "请输入联系人手机:";
string phone = "";
cin >> phone;
int a = phone.length();
if (phone.length() != 12)
{
abs->personArry[abs->bookSize].p_Phone = phone;
break;
}
else
{
cout << "手机号码格式不对,请重新输入!!!" << endl;
}
}
// 添加地址
string addr = "";
cout << "请输入联系人地址:";
cin >> addr;
abs->personArry[abs->bookSize].p_Addr = addr;
// 添加联系人成功人数自增
abs->bookSize++;
cout << "添加联系人成功!!!" << endl;
}
//添加联系人成功后,程序暂停,并清空屏幕
cleanScreen();
}
// 显示所有联系人
void showPerson(struct AddressBooks* abs)
{
// 判断通讯录人数是否为0,如果为0提示记录为空
if (abs->bookSize == 0)
{
cout << "通讯录中无记录" << endl;
}
else
{
for (int i = 0; i < abs->bookSize; i++)
{
showInfo(abs, i);
}
}
cleanScreen();
}
// 检测联系人是否存在通讯录中
int isPersonExist(struct AddressBooks* abs, string name)
{
// 检测联系人是否存在,如果存在,返回联系人在数组中的具体位置,不存在返回 -1
for (int i = 0; i < abs->bookSize; i++)
{
if (abs->personArry[i].p_Name == name) // 找到了该联系人,返回下标
{
return i;
}
}
return -1;
}
// 删除联系人
void delPerson(struct AddressBooks* abs)
{
// 先判断通讯录是否为空,如果为空,直接返回
if (abs->bookSize == 0)
{
cout << "通讯录为空无联系人,不能删除!!!" << endl;
cleanScreen();
return;
}
cout << "请输入要删除的联系人姓名:";
string name;
cin >> name;
// 调用方法查询输入的姓名是否在通讯录中
int checkRet = isPersonExist(abs, name);
if (checkRet != -1)
{
for (int i = checkRet; i < abs->bookSize; i++)
{
abs->personArry[i] = abs->personArry[i + 1];
}
cout << "删除联系人【 " << name << " 】成功!!!" << endl;
abs->bookSize--;
}
else
{
cout << "查无此人" << endl;
}
cleanScreen();
}
// 查找联系人
void searchPerson(struct AddressBooks* abs)
{
cout << "请输入要查找的联系人姓名:";
string name;
cin >> name;
int searchRet = isPersonExist(abs, name);
if (searchRet != -1)
{
showInfo(abs, searchRet);
}
else
{
cout << "查无此人" << endl;
}
cleanScreen();
}
// 修改联系人
void modifyPerson(struct AddressBooks* abs)
{
cout << "请输入要修改的联系人姓名:";
string name;
cin >> name;
int checkRet = isPersonExist(abs, name);
if (checkRet != -1)
{
// 重新打印联系人未更改前信息
showInfo(abs, checkRet);
//修改姓名
cout << "请输入联系人新姓名:";
string newName = "";
cin >> newName;
abs->personArry[checkRet].p_Name = newName;
// 修改性别
cout << "请输入联系人新性别( 1-男 | 2-女 ):";
int newGender;
cin >> newGender;
abs->personArry[checkRet].p_Gender = newGender;
// 修改年龄
cout << "请输入联系人新年龄:";
int newAge;
cin >> newAge;
abs->personArry[checkRet].p_Age = newAge;
// 修改手机号
cout << "请输入联系人新手机号:";
string newPhone;
cin >> newPhone;
abs->personArry[checkRet].p_Phone = newPhone;
// 修改地址
cout << "请输入联系人新地址:";
string newAddr;
cin >> newAddr;
abs->personArry[checkRet].p_Addr = newAddr;
}
else
{
cout << "查无此人!!!" << endl;
}
cleanScreen();
}
// 清空联系人
void cleanPerson(struct AddressBooks* abs)
{
abs->bookSize = 0;
cout << "清空通讯录联系人成功!!!" << endl;
cleanScreen();
}
int main()
{
// 初始化通讯录
struct AddressBooks abs; // 当用户选择了添加联系人,需要调用通讯录
// 初始化通讯录中的人数
abs.bookSize = 0;
// 打印菜单,并提醒用户输入
while (true)
{
showMenu();
cout << "请输入选择的操作:";
int select = 0;
cin >> select;
switch (select)
{
case 1: // 1 添加联系人
addPerson(&abs);
break;
case 2: // 2 显示联系人
showPerson(&abs);
break;
case 3: // 3 删除联系人
delPerson(&abs);
break;
case 4: // 4 查找联系人
searchPerson(&abs);
break;
case 5: // 5 修改联系人
modifyPerson(&abs);
break;
case 6: // 6 清空联系人
cleanPerson(&abs);
break;
case 0: // 0 退出通讯录
cout << "欢迎下次使用" << endl;
return 0;
break;
default:
cout << "输入错误,请从新选择" << endl;
}
}
//system("pause");
return 0;
}