前言
C++入门案例——通讯录管理系统 & 控制台项目
目录
- 前言
- 总体概览
- 实体类设计
- 显示页面和退出系统
- 添加联系人
- 逻辑拆解
- 相关代码
- 显示联系人
- 逻辑拆解
- 相关代码
- 根据名字删除联系人
- 逻辑拆解
- 相关代码
- 根据名字查找联系人
- 逻辑拆解
- 相关代码
- 修改联系人
- 逻辑拆解
- 相关代码
- 清空所有联系人
- 逻辑拆解
- 相关代码
- 完整代码
- 总结
总体概览
实体类设计
// 设计联系人结构体
struct Person
{
string name;
int sex;
int age;
string tel;
string addr;
};
// 设计通讯录
struct AddressBooks
{
// 联系人数组
struct Person personArray[MAX];
// 当前联系人数量
int size;
};
显示页面和退出系统
// 显示界面,main中使用页面封装函数
static 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;
}
添加联系人
逻辑拆解
1.判断是否达到最大容量,如果达到,则结束,如果未达到,进入下一步;
2.用户输入要添加的人的信息,姓名等,加入到通讯录的数组中;
3.修改通讯录当前人数,更新人数+1;
相关代码
// 添加联系人
void addPerson(AddressBooks* abs)
{
// 判断是否满
if (abs->size == MAX)
{
cout << "通讯录已满,添加失败" << endl;
}
else
{
// 添加联系人
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->personArray[abs->size].name = name;
// 输入性别
cout << "请输入性别,1男,2女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->size].sex = sex;
break; // 输入正确,退出循环
}
cout << "输入有误,重新输入" << endl;
}
// 输入年龄
int age = 0 ;
cout << "请输入年龄" << endl;
cin >> age;
abs->personArray[abs->size].age = age;
// 输入电话
string tel;
cout << "请输入电话" << endl;
cin >> tel;
abs->personArray[abs->size].tel = tel;
// 输入家庭住址
string addr;
cout << "请输入家庭住址" << endl;
cin >> addr;
abs->personArray[abs->size].addr = addr;
// 更新人数
abs->size++;
cout << "添加成功!!!" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
显示联系人
逻辑拆解
1.判断通讯录是否为空,size==0;如果不为空,进入下一步;
2.把数组中的联系人一个一个拿出来,打印相关信息;
3.性别1,2输出位男和女采用三目运算符实现;
相关代码
// 显示联系人
void showPerson(AddressBooks* abs) {
if (abs->size==0)
{
cout << "通信录空" << endl;
}
else {
for (int i = 0; i < abs->size; i++)
{
cout << "姓名:" << abs->personArray[i].name << "\t";
// 三目运算符
cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";
cout << "住址:" << abs->personArray[i].addr << endl;
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
根据名字删除联系人
逻辑拆解
1.先判断一下是否存在该联系人,如果不存在,退出;如果存在,进入下一步;
2.从要删除的联系人开始,把后面的联系人一个一个迁移;
3.最后把通讯录中的人员数量 -1;
相关代码
/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>
int isExist(AddressBooks* abs, string name) {
for (int i = 0; i < abs->size; i++)
{
if (abs->personArray[i].name==name)
{
return i; // 返回位置
}
}
return -1;
}
// 删除指定的联系人
void deletePerson(AddressBooks* abs) {
cout << "输入要删除的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
else {
cout << "已找到" << endl;
for (int i = index; i < abs->size; i++)
{
// 数据迁移
abs->personArray[i] = abs->personArray[i + 1];
abs->size--; // 更新人员数量
cout << "删除成功" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
}
根据名字查找联系人
逻辑拆解
1.输入要查找的人的姓名,
2.判断该姓名是否存在数组中,如果存在进入下一步;
3.根据上一步获取该人在数组中的位置,进行人员信息的打印;
相关代码
// 查找联系人
void findPerson(AddressBooks* abs) {
cout << "输入要查找的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
}
else {
cout << "已找到" << endl;
cout << "姓名:" << abs->personArray[index].name << "\t";
// 三元表达式
cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
cout << "住址:" << abs->personArray[index].addr << endl;
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
修改联系人
逻辑拆解
1.输入要修改的联系人的name;
2.查询是否存在该联系人,如果存在,则进入下一步;
3.输入该联系人的新的信息,姓名等;
相关代码
// 修改联系人
void modifyPerson(AddressBooks* abs) {
cout << "输入要修改的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
}
else {
cout << "已找到" << endl;
cout << "姓名:" << abs->personArray[index].name << "\t";
// 三元表达式
cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
cout << "住址:" << abs->personArray[index].addr << endl;
// 进行修改
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->personArray[index].name = name;
// 输入性别
cout << "请输入性别,1男,2女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[index].sex = sex;
break; // 输入正确,退出循环
}
cout << "输入有误,重新输入" << endl;
}
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
清空所有联系人
逻辑拆解
1.因为清空操作需要慎重考虑,因此加入了二次确认的机制;
2.清空联系人把当前记录的联系人的数量置为0即可;
相关代码
// 清空所有联系人
void cleanPerson(AddressBooks* abs) {
cout << "即将清空所有联系人,是否继续,继续输入1" << endl;
int flag;
cin >> flag;
if (flag == 1)
{
abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除
cout << "清空成功" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
else
{
cout << "您取消了清空" << endl;
}
}
完整代码
# include <iostream>
# include <string>
# define MAX 1000 // 定义常量
using namespace std;
// 设计联系人结构体
struct Person
{
string name;
int sex;
int age;
string tel;
string addr;
};
// 设计通讯录
struct AddressBooks
{
// 联系人数组
struct Person personArray[MAX];
// 当前联系人数量
int size;
};
// 添加联系人
void addPerson(AddressBooks* abs)
{
// 判断是否满
if (abs->size == MAX)
{
cout << "通讯录已满,添加失败" << endl;
}
else
{
// 添加联系人
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->personArray[abs->size].name = name;
// 输入性别
cout << "请输入性别,1男,2女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->size].sex = sex;
break; // 输入正确,退出循环
}
cout << "输入有误,重新输入" << endl;
}
// 输入年龄
int age = 0 ;
cout << "请输入年龄" << endl;
cin >> age;
abs->personArray[abs->size].age = age;
// 输入电话
string tel;
cout << "请输入电话" << endl;
cin >> tel;
abs->personArray[abs->size].tel = tel;
// 输入家庭住址
string addr;
cout << "请输入家庭住址" << endl;
cin >> addr;
abs->personArray[abs->size].addr = addr;
// 更新人数
abs->size++;
cout << "添加成功!!!" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
// 显示联系人
void showPerson(AddressBooks* abs) {
if (abs->size==0)
{
cout << "通信录空" << endl;
}
else {
for (int i = 0; i < abs->size; i++)
{
cout << "姓名:" << abs->personArray[i].name << "\t";
// 三目运算符
cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";
cout << "住址:" << abs->personArray[i].addr << endl;
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>
int isExist(AddressBooks* abs, string name) {
for (int i = 0; i < abs->size; i++)
{
if (abs->personArray[i].name==name)
{
return i; // 返回位置
}
}
return -1;
}
// 删除指定的联系人
void deletePerson(AddressBooks* abs) {
cout << "输入要删除的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
else {
cout << "已找到" << endl;
for (int i = index; i < abs->size; i++)
{
// 数据迁移
abs->personArray[i] = abs->personArray[i + 1];
abs->size--; // 更新人员数量
cout << "删除成功" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
}
}
// 查找联系人
void findPerson(AddressBooks* abs) {
cout << "输入要查找的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
}
else {
cout << "已找到" << endl;
cout << "姓名:" << abs->personArray[index].name << "\t";
// 三元表达式
cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
cout << "住址:" << abs->personArray[index].addr << endl;
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
// 修改联系人
void modifyPerson(AddressBooks* abs) {
cout << "输入要修改的联系人的name" << endl;
string name;
cin >> name;
int index = isExist(abs, name);
if (index == -1)
{
cout << "查无此人" << endl;
}
else {
cout << "已找到" << endl;
cout << "姓名:" << abs->personArray[index].name << "\t";
// 三元表达式
cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
cout << "住址:" << abs->personArray[index].addr << endl;
// 进行修改
string name;
cout << "请输入姓名" << endl;
cin >> name;
abs->personArray[index].name = name;
// 输入性别
cout << "请输入性别,1男,2女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[index].sex = sex;
break; // 输入正确,退出循环
}
cout << "输入有误,重新输入" << endl;
}
}
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
// 清空所有联系人
void cleanPerson(AddressBooks* abs) {
cout << "即将清空所有联系人,是否继续,继续输入1" << endl;
int flag;
cin >> flag;
if (flag == 1)
{
abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除
cout << "清空成功" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
}
else
{
cout << "您取消了清空" << endl;
}
}
// 显示界面,main中使用页面封装函数
static 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() {
// 通讯录结构体变量
AddressBooks abs;
// 初始化当前人员个数
abs.size = 0;
// 用户的选择
int select = 0;
while (true)
{
// 调用菜单
showMenu();
cin >> select;
switch (select)
{
case 1: // 1、添加联系人
addPerson(&abs); // 利用地址传值,修饰实参
break;
case 2: // 2、显示联系人
showPerson(&abs);
break;
case 3: // 3、删除联系人
{
deletePerson(&abs);
}
break;
case 4: // 4、查找联系人
findPerson(&abs);
break;
case 5: // 5、修改联系人
modifyPerson(&abs);
break;
case 6: // 6、清空联系人
cleanPerson(&abs);
break;
case 0: // 0、退出系统
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause"); // 按任意键继续
return 0;
}
总结
C++入门案例——通讯录管理系统 & 控制台项目