C++入门项目:通讯录管理系统

文章目录

    • 一、步骤拆分
      • 1.系统需求
      • 2.显示菜单
      • 3.添加联系人
      • 4.显示联系人
      • 5.删除联系人
      • 6.查找联系人
      • 7.修改联系人
      • 8.清空通讯录
      • 9.退出功能
    • 二、完整代码(200行)
    • 三、手把手视频教程

一、步骤拆分

1.系统需求

利用C++来实现一个通讯录管理系统,系统中需要实现的功能如下:

添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
显示联系人:显示通讯录中所有联系人信息
删除联系人:按照姓名进行删除指定联系人
查找联系人:按照姓名查看指定联系人信息
修改联系人:按照姓名重新修改指定联系人
清空联系人:清空通讯录中所有信息
退出通讯录:退出当前使用的通讯录


2.显示菜单

功能描述: 用户选择功能的界面

菜单界面效果如下图:
在这里插入图片描述


代码实现:

//显示菜单
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;
}

3.添加联系人

在这里插入图片描述

//1.添加联系人
void addPerson(AddressBook &abs){cout << "添加联系人" << endl;if(abs.size == MAX){cout << "通讯录已满,无法添加" << endl;return;}cout << "abs.size = " << abs.size << endl;//姓名string name;cout << "请输入姓名" << endl;cin >> name;abs.personArray[abs.size].name = name;//性别string sex;cout << "请输入性别" << endl;while(true){cin >> sex;if(sex == "男" || sex == "女"){abs.personArray[abs.size].sex = sex;break;}cout << "输入有误,请重新输入性别,男 或 女" << endl;}//年龄int age;cout << "请输入年龄" << endl;cin >> age;abs.personArray[abs.size].age = age;//电话int phoneNumber;cout << "请输入电话" << endl;cin >> phoneNumber;abs.personArray[abs.size].phoneNumber= phoneNumber;//家庭住址string address;cout << "请输入家庭住址" << endl;cin >> address;abs.personArray[abs.size].address = address;//更新通讯录人数abs.size++;cout << "添加成功。" << endl;return;
}

4.显示联系人

//2.显示所有联系人
void showPerson(AddressBook &abs){if(abs.size == 0)  cout << "记录为空";else{for(int i = 0; i < abs.size; ++i){cout << "姓名:" << abs.personArray[i].name << "    ";cout << "性别:" << abs.personArray[i].sex << "    ";cout << "年龄:" << abs.personArray[i].age << "    ";cout << "电话:" << abs.personArray[i].phoneNumber << "    ";cout << "住址:" << abs.personArray[i].address << endl;}}
}

5.删除联系人

在这里插入图片描述

//3.删除联系人
void deletePerson(AddressBook &abs){string name;cout << "请输入要删除的联系人姓名" <<endl;cin >> name;int ret = isExist(abs,name);if(ret != -1){for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除}abs.size--; //更新人员数cout << "删除成功。" << endl;}else{ //ret == -1cout << "查无此人。" << endl;}
}

6.查找联系人

//4.查找指定的联系人的信息
void findPerson(AddressBook abs){cout << "请输入您要查找的联系人" << endl;string name;cin >> name;int ret = isExist(abs,name);if(ret != -1){cout << "姓名:" << abs.personArray[ret].name << "    ";cout << "性别:" << abs.personArray[ret].sex << "    ";cout << "年龄:" << abs.personArray[ret].age << "    ";cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";cout << "住址:" << abs.personArray[ret].address << endl;}else{cout << "查无此人" << endl;}
}

7.修改联系人

//5.修改联系人
void modifyPerson(AddressBook &abs){cout << "请输入要修改的联系人姓名" << endl;string name;cin >> name;int ret = isExist(abs,name);if(ret != -1){//姓名cout << "将姓名改为:" << endl;string name = "";cin >> name;abs.personArray[ret].name = name;//性别cout << "将性别改为:" << endl;string sex = "";while(true){cin >> sex;if(sex == "男" || sex == "女"){abs.personArray[ret].sex = sex;break;  //输入正确,退出循环}cout << "输入有误,请重新输入" << endl;}//年龄cout << "将年龄改为:" << endl;int age = 0;cin >> age;abs.personArray[ret].age = age;//联系电话cout << "将电话改为:" << endl;string phoneNumber = "";cin >> phoneNumber;abs.personArray[ret].phoneNumber = phoneNumber;//家庭住址cout << "将家庭住址改为:" << endl;string address = "";cin >> address;abs.personArray[ret].address = address;cout << "修改成功!" << endl;}else{cout << "查无此人" << endl;}
}

8.清空通讯录

//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;string str;cin >> str;if(str == "1"){abs.size = 0;cout << "联系人目录已清空。" << endl;}else{cout << "已放弃清空操作。" << endl;}
}

9.退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择7时候,执行退出,选择其他先不做操作,也不会退出程序

case 7:cout << "欢迎下次使用,再见。" << endl;return 0;



二、完整代码(200行)

#include <iostream>
#include <string>
using namespace std;
#define MAX 5  //通讯录人数上限//联系人结构体
struct ContactPerson{string name;string sex;int age;string phoneNumber;string address;
};//通讯录结构体:数组 + 容量
struct AddressBook{struct ContactPerson personArray[MAX];int size;
};//显示菜单
void showMenu(){cout << "***********************" << endl;cout << "***** 1.添加联系人 *****" << endl;cout << "***** 2.显示联系人 *****" << endl;cout << "***** 3.删除联系人 *****" << endl;cout << "***** 4.查找联系人 *****" << endl;cout << "***** 5.修改联系人 *****" << endl;cout << "***** 6.清空联系人 *****" << endl;cout << "***** 7.退出通讯录 *****" << endl;cout << "***********************" << endl;
}//1.添加联系人
void addPerson(AddressBook &abs){cout << "添加联系人,通讯录当前联系人个数:" << abs.size << endl;if(abs.size == MAX){cout << "通讯录已满,无法添加" << endl;return;}//姓名string name;cout << "请输入姓名" << endl;cin >> name;abs.personArray[abs.size].name = name;//性别string sex;cout << "请输入性别" << endl;while(true){cin >> sex;if(sex == "男" || sex == "女"){abs.personArray[abs.size].sex = sex;break;}cout << "输入有误,请重新输入性别,男 或 女" << endl;}//年龄int age;cout << "请输入年龄" << endl;cin >> age;abs.personArray[abs.size].age = age;//电话string phoneNumber;cout << "请输入电话" << endl;cin >> phoneNumber;abs.personArray[abs.size].phoneNumber= phoneNumber;//家庭住址string address;cout << "请输入家庭住址" << endl;cin >> address;abs.personArray[abs.size].address = address;//更新通讯录人数abs.size++;cout << "添加成功。" << endl;return;
}//2.显示所有联系人
void showPerson(AddressBook &abs){if(abs.size == 0)  cout << "当前记录为空,没有联系人。" << endl;else{for(int i = 0; i < abs.size; ++i){cout << "姓名:" << abs.personArray[i].name << "    ";cout << "性别:" << abs.personArray[i].sex << "    ";cout << "年龄:" << abs.personArray[i].age << "    ";cout << "电话:" << abs.personArray[i].phoneNumber << "    ";cout << "住址:" << abs.personArray[i].address << endl;}}
}//3.检测联系人是否存在:若存在,返回联系人在通讯录中的位置;若不存在,返回-1
int isExist(AddressBook abs,string name){for(int i = 0; i < abs.size; ++i){  //数组下标从0开始if(abs.personArray[i].name == name)  return i;}return -1;
}//3.删除联系人
void deletePerson(AddressBook &abs){string name;cout << "请输入要删除的联系人姓名" <<endl;cin >> name;int ret = isExist(abs,name);if(ret != -1){for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除}abs.size--; //更新人员数cout << "删除成功。" << endl;}else{ //ret == -1cout << "查无此人。" << endl;}
}//4.查找指定的联系人的信息
void findPerson(AddressBook abs){cout << "请输入您要查找的联系人" << endl;string name;cin >> name;int ret = isExist(abs,name);if(ret != -1){cout << "姓名:" << abs.personArray[ret].name << "    ";cout << "性别:" << abs.personArray[ret].sex << "    ";cout << "年龄:" << abs.personArray[ret].age << "    ";cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";cout << "住址:" << abs.personArray[ret].address << endl;}else{cout << "查无此人" << endl;}
}//5.修改联系人
void modifyPerson(AddressBook &abs){cout << "请输入要修改的联系人姓名" << endl;string name;cin >> name;int ret = isExist(abs,name);if(ret != -1){//姓名cout << "将姓名改为:" << endl;string name = "";cin >> name;abs.personArray[ret].name = name;//性别cout << "将性别改为:" << endl;string sex = "";while(true){cin >> sex;if(sex == "男" || sex == "女"){abs.personArray[ret].sex = sex;break;  //输入正确,退出循环}cout << "输入有误,请重新输入" << endl;}//年龄cout << "将年龄改为:" << endl;int age = 0;cin >> age;abs.personArray[ret].age = age;//联系电话cout << "将电话改为:" << endl;string phoneNumber = "";cin >> phoneNumber;abs.personArray[ret].phoneNumber = phoneNumber;//家庭住址cout << "将家庭住址改为:" << endl;string address = "";cin >> address;abs.personArray[ret].address = address;cout << "修改成功!" << endl;}else{cout << "查无此人" << endl;}
}//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;string str;cin >> str;if(str == "1"){abs.size = 0;cout << "联系人目录已清空。" << endl;}else{cout << "已放弃清空操作。" << endl;}
}int main() {AddressBook abs; //创建一个通讯录对象abs.size = 0;while(true){cout << endl;showMenu(); //菜单调用cout << "请输入您选择的功能编号" << endl;int select = 0; //用户选择cin >> select;if (cin.fail()) { // 检查是否输入错误cin.clear(); // 清除cin的错误状态cin.ignore(); // 清除缓冲区直到下一个换行符// 输出错误信息并继续循环cout << "输入无效,请输入一个数字。" << endl;continue;}switch(select) {  //switch-case结构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 7:cout << "欢迎下次使用,再见。" << endl;return 0;default:cout << "功能数字不存在" << endl;}}
}



三、手把手视频教程

1.通讯录管理系统

2.黑马程序员 C++语法教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511996.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm、cnpm、pnpm使用详细

简介&#xff1a; npm&#xff1a;npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;用于安装、更新、卸载Node.js的模块和包。它提供了一个命令行界面&#xff0c;使得开发者可以轻松地管理项目依赖。npm 是 nodejs 中的一部分&#xff0c;…

视频怎么在线转换gif?分享简单一招在线转换

在现在的互联网时代&#xff0c;gif动图已经是非常流行的一种图像格式了。特别是在网络聊天中&#xff0c;能够快速有效的传达情感等。当我们的手中有一些视频素材&#xff0c;想要从中截取gif动画时可使用在线动画制作&#xff08;https://www.gif.cn/&#xff09;工具&#x…

新手想玩硬件,买单片机还是树莓派好?

新手想玩硬件&#xff0c;买单片机还是树莓派好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#x…

服务器出现故障如何恢复数据?

服务器数据恢复案例之服务器raid6中3块硬盘离线导致阵列崩溃的数据恢复案例 服务器故障&#xff1a; 服务器中有一组由6块盘组建的 RAID6&#xff0c;这台网站服务器上运行MYSQL数据库和存放其它类型的文件。该组raid中有两块磁盘离线&#xff0c;管理员没有及时更换磁盘&#…

基本设计模式

单例模式 ES5 function Duck1(name:string){this.namenamethis.instancenull }Duck1.prototype.getNamefunction(){console.log(this.name) }Duck1.getInstancefunction(name:string){if(!this.instance){this.instance new Duck1(name)} } const aDuck1.getInstance(a) const…

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和&#xff0c;但是这里的l和r的范围为1e12&#xff0c;明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点&#xff0c;可以按照等差数列对序列进行分块。如上图&#xff0c;在求前10个…

unity Game视图看不到贴花,但是在Scene视图能看到

解决方法&#xff1a;找到URP的配置文件 &#xff0c;修改Quality–RederScale为1&#xff0c;就可以了&#xff0c;这是unity 的bug&#xff0c;2022版本以后就没有这个问题了

ES完全入门

1、ES集群节点有哪些主要角色&#xff1f; 1.1、Master 1.2、Data 1.3、Ingest 1.4、Coordination 2、Shard数量的确定

Guitar Pro 8.1中文版永久许可证激活2024最新24位注册激活码生成器

Guitar Pro是一款非常受欢迎的音乐制作软件&#xff0c;它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件&#xff0c;在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#…

BERT学习【BERT的例子以及作用】

一、case 1.case1 多输入单输出。通过输入一个句子&#xff08;sequence&#xff09;&#xff0c;然后输出一个句子的分类&#xff08;这个句子是正向还是负向&#xff09;。将句子输入BERT&#xff0c;然后通过softmax输出分类。 2.case2 多输入多输出。输入一个句子&…

Linux - 进程概念

1、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系&#xff1b; 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 输入单元&#xff1a;…

C++ Primer Plus Sixth Edition - 下载电子书与源代码

C Primer Plus Sixth Edition - 下载电子书与源代码 1. C Primer Plus, 6th Edition1.1. Download the source code files1.2. 下载源代码文件 2. C Primer Plus, Sixth Edition (PDF)3. Table of ContentsReferences 1. C Primer Plus, 6th Edition C Primer Plus, 6th Editi…