前言
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++入门案例——通讯录管理系统 & 控制台项目