C++基础实战——通讯录管理系统

本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注
当前章节处于:
---------第1阶段-C++基础入门
====>第2阶段实战-通讯录管理系统
---------第3阶段-C++核心编程,
---------第4阶段实战-基于多态的企业职工系统
---------第5阶段-C++提高编程
---------第6阶段实战-基于STL泛化编程的演讲比赛
---------第7阶段-C++实战项目机房预约管理系统

文章目录

  • 一、系统需求
  • 二、需求分析
  • 三、封装函数
    • 3.1 定义通讯录的结构体
    • 3.2 通讯录显示菜单
    • 3.3 添加联系人
    • 3.4 显示联系人
    • 3.5 删除联系人
    • 3.7 查找联系人
    • 3.8 修改联系人
    • 3.9 清空通讯录
    • 3.10 main主函数
  • 四、完整代码
  • 五、测试样例

一、系统需求

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

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

二、需求分析

整个通讯录系统说白了就是一个结构体数组,数组里面的每个结构体就代表一个联系人

  1. 添加联系人上的信息,这个结构体应该包括姓名,性别,年龄,联系方式和家庭住址,最多1000人,那么数组的长度就指定为1000。
  2. 显示联系人,由于创建数组长度是1000,肯定不会填满,那么打印时候就需要做一个判断,如果到空的了就不打印,防止无用信息也被打印出来。
  3. 删除联系人:找到该联系人,然后将该结构体置空。
  4. 查找联系人:也是比较简单,遍历,然后用if去判断就可以。
  5. 修改联系人:查找到然后修改。
  6. 清空联系人:将整个结构体数组置空。
  7. 退出通讯录:说明整个是在一个while循环里面,那么就需要写一个菜单,输入不同的选项代表不同的操作,其中有一个选项代表退出循环。每一个功能都封装成一个函数,用switch case进行判断。并且,如果想通过封装的函数对结构体数组直接改变的话,那么一定是地址传递,因此还需要定义一个结构体指针用于指向结构体数组,传的时候就传入结构体指针,遍历的时候仍然采用索引的方式。

三、封装函数

3.1 定义通讯录的结构体

// 通讯录结构体
struct people
{string name;string gender;int age;long long phone;string address;
};

3.2 通讯录显示菜单

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

3.3 添加联系人

注意字符串比较的时候用compare方法,而不能直接用==判断,并且如果两字符串compare相等时返回的是0。

// 添加联系人
bool addPeople(struct people* p) {string name;string gender;int age;long long phone;string address;cout << "姓名:";cin >> name;cout << "性别:";cin >> gender;cout << "年龄:";cin >> age;cout << "电话:";cin >> phone;cout << "地址:";cin >> address;struct people temp = { name,gender,age,phone,address };// 找数组中空的地方for (int i = 0; i < 1000; i++) {if (p[i].name.compare("")==0){//cout << i << endl;p[i] = temp;return true;}}return false;
}

3.4 显示联系人

// 显示联系人
void showSystem(const struct people *p) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare("") !=0 ) {cout << p[i].name << endl;}}
}

3.5 删除联系人

删除相当于将结构体内各值重新初始化。

// 删除联系人
bool del(struct people* p,string targetName) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare(targetName)==0)// 创建新的联系人p[i] = {"","",0,0,""};cout << "删除完成!" << endl;return true;}return false;
}

3.7 查找联系人

// 查找联系人
bool find(struct people* p, string targetName) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare(targetName) == 0) {cout << "姓名:" << p[i].name << "  性别:" << p[i].gender << "  年龄:" << p[i].age << "   电话:" << p[i].phone << "   地址:" << p[i].address << endl;return true;}}return false;
}

3.8 修改联系人

修改比较麻烦,由于不知道用户需要修改哪个属性,因此需要逐个判断。

// 修改联系人
bool change(struct people* p, string targetName) {string target = ""; // 存放需要更改的选项string result = ""; // 存放修改的具体内容int result_age = 0; // 存放修改后的年龄long long result_phone = 0; // 存放修改后的电话for (int i = 0; i < 1000; i++) {//cout << (p[i].name.compare(targetName) == 0) << endl;if (p[i].name.compare(targetName)==0) {cout << "请输入你要修改的信息:";cin >> target;if (target.compare("姓名")==0){cout << "请输入修改后的姓名:";cin >> result;p[i].name = result;cout << "修改成功!" << endl;}else if (target.compare("年龄")==0) {cout << "请输入修改后的年龄:";cin >> result_age;p[i].age = result_age;cout << "修改成功!" << endl;}else if (target.compare("性别")==0) {cout << "请输入修改后的性别:";cin >> result;p[i].gender = result;cout << "修改成功!" << endl;}else if (target.compare("联系方式")==0) {cout << "请输入修改后的联系方式:";cin >> result_phone;p[i].phone = result_phone;cout << "修改成功!" << endl;}else if (target.compare("家庭住址")==0) {cout << "请输入修改后的性别:";cin >> result;p[i].address = result;cout << "修改成功!" << endl;}else {cout << "没有这项信息!" << endl;return false;}return true;}}return false;
}

3.9 清空通讯录

// 清空通讯录
bool clean(struct people* p) {string flag = "";cout << "确认清空通讯录吗?Y/N" << endl;cin >> flag;if (flag.compare("Y")==0) {for (int i = 0; i < 1000; i++) {p[i] = { "","",0,0,"" };}cout << "清空成功!" << endl;return true;}else {return false;}
}

3.10 main主函数

主函数包括创建结构体数组,接收用户的选择输入,在跳出主循环采用goto标志位的方式跳出双重循环。

int main() {// 创建结构体数组struct people PhoneSystemArr[1000];//cout << (PhoneSystemArr[0].name == "") << endl;// 创建指针struct people* p = PhoneSystemArr;mainwhile:while (1) {showMenu();cout << "请输入你选择的选项:";int choice = 0;bool flag = 0;string targetname = "";cin >> choice;switch (choice){case 1:flag = addPeople(p);if (flag) {cout << "添加成功!" << endl;}else {cout << "添加失败!" << endl;}break;case 2:showSystem(p);break;case 3:cout << "请输入你要删除的姓名:";cin >> targetname;flag = del(p,targetname);if (flag) {cout << endl;}else {cout << "添加失败!" << endl;}break;case 4:cout << "请输入你要查找的姓名:";cin >> targetname;flag = find(p,targetname);if (flag) {cout << "查找成功!" << endl;}else {cout << "查找失败!" << endl;}break;case 5:cout << "请输入你要修改的姓名:";cin >> targetname;flag = change(p, targetname);if (flag) {cout  << endl;}else {cout << "修改失败!" << endl;}break;case 6:clean(p);break;case 7:goto FLAG;  // goto跳转cout << "退出成功!" << endl;break;default:cout << "没有这个选项,请重新输入!" << endl;break;}}FLAG:system("pause");return 0;}

四、完整代码

#include <iostream>
using namespace std;
// 通讯录结构体
struct people
{string name;string gender;int age;long long phone;string address;
};
// 显示通讯录菜单
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;
}
// 添加联系人
bool addPeople(struct people* p) {string name;string gender;int age;long long phone;string address;cout << "姓名:";cin >> name;cout << "性别:";cin >> gender;cout << "年龄:";cin >> age;cout << "电话:";cin >> phone;cout << "地址:";cin >> address;struct people temp = { name,gender,age,phone,address };// 找数组中空的地方for (int i = 0; i < 1000; i++) {if (p[i].name.compare("")==0){//cout << i << endl;p[i] = temp;return true;}}return false;
}
// 显示联系人
void showSystem(const struct people *p) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare("") !=0 ) {cout << p[i].name << endl;}}
}
// 删除联系人
bool del(struct people* p,string targetName) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare(targetName)==0)// 创建新的联系人p[i] = {"","",0,0,""};cout << "删除完成!" << endl;return true;}return false;
}
// 查找联系人
bool find(struct people* p, string targetName) {for (int i = 0; i < 1000; i++) {if (p[i].name.compare(targetName) == 0) {cout << "姓名:" << p[i].name << "  性别:" << p[i].gender << "  年龄:" << p[i].age << "   电话:" << p[i].phone << "   地址:" << p[i].address << endl;return true;}}return false;
}
// 修改联系人
bool change(struct people* p, string targetName) {string target = ""; // 存放需要更改的选项string result = ""; // 存放修改的具体内容int result_age = 0; // 存放修改后的年龄long long result_phone = 0; // 存放修改后的电话for (int i = 0; i < 1000; i++) {//cout << (p[i].name.compare(targetName) == 0) << endl;if (p[i].name.compare(targetName)==0) {cout << "请输入你要修改的信息:";cin >> target;if (target.compare("姓名")==0){cout << "请输入修改后的姓名:";cin >> result;p[i].name = result;cout << "修改成功!" << endl;}else if (target.compare("年龄")==0) {cout << "请输入修改后的年龄:";cin >> result_age;p[i].age = result_age;cout << "修改成功!" << endl;}else if (target.compare("性别")==0) {cout << "请输入修改后的性别:";cin >> result;p[i].gender = result;cout << "修改成功!" << endl;}else if (target.compare("联系方式")==0) {cout << "请输入修改后的联系方式:";cin >> result_phone;p[i].phone = result_phone;cout << "修改成功!" << endl;}else if (target.compare("家庭住址")==0) {cout << "请输入修改后的性别:";cin >> result;p[i].address = result;cout << "修改成功!" << endl;}else {cout << "没有这项信息!" << endl;return false;}return true;}}return false;
}
bool clean(struct people* p) {string flag = "";cout << "确认清空通讯录吗?Y/N" << endl;cin >> flag;if (flag.compare("Y")==0) {for (int i = 0; i < 1000; i++) {p[i] = { "","",0,0,"" };}cout << "清空成功!" << endl;return true;}else {return false;}
}
int main() {// 创建结构体数组struct people PhoneSystemArr[1000];//cout << (PhoneSystemArr[0].name == "") << endl;// 创建指针struct people* p = PhoneSystemArr;mainwhile:while (1) {showMenu();cout << "请输入你选择的选项:";int choice = 0;bool flag = 0;string targetname = "";cin >> choice;switch (choice){case 1:flag = addPeople(p);if (flag) {cout << "添加成功!" << endl;}else {cout << "添加失败!" << endl;}break;case 2:showSystem(p);break;case 3:cout << "请输入你要删除的姓名:";cin >> targetname;flag = del(p,targetname);if (flag) {cout << endl;}else {cout << "添加失败!" << endl;}break;case 4:cout << "请输入你要查找的姓名:";cin >> targetname;flag = find(p,targetname);if (flag) {cout << "查找成功!" << endl;}else {cout << "查找失败!" << endl;}break;case 5:cout << "请输入你要修改的姓名:";cin >> targetname;flag = change(p, targetname);if (flag) {cout  << endl;}else {cout << "修改失败!" << endl;}break;case 6:clean(p);break;case 7:goto FLAG;  // goto跳转cout << "退出成功!" << endl;break;default:cout << "没有这个选项,请重新输入!" << endl;break;}}FLAG:system("pause");return 0;}

五、测试样例

-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:8
没有这个选项,请重新输入!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:1
姓名:张三
性别:男
年龄:18
电话:123456
地址:安徽
添加成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:1
姓名:李四
性别:男
年龄:21
电话:45678
地址:天津
添加成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
张三
李四
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:3
请输入你要删除的姓名:张三
删除完成!-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:4
请输入你要查找的姓名:李四
姓名:李四  性别:男  年龄:21   电话:45678   地址:天津
查找成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
李四
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:5
请输入你要修改的姓名:李四
请输入你要修改的信息:年龄
请输入修改后的年龄:23
修改成功!
修改成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:4
请输入你要查找的姓名:李四
姓名:李四  性别:男  年龄:23   电话:45678   地址:天津
查找成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:6
确认清空通讯录吗?Y/N
Y
清空成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:7
请按任意键继续. . .

这个项目还是很有综合性的,把之前学的知识都囊括再内,至此,C++基础告一段落,明天开始C++核心编程的学习。

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

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

相关文章

解决“SQLServer 添加数据库,报Error 5118“错误

当将把一个SQLServer的数据库文件*.MDF和日志文件*.LDF&#xff0c;从电脑A拷贝到电脑B&#xff0c;然后在电脑B上&#xff0c;使用Microsoft SQL Server Management Studio添加该*.MDF文件&#xff0c;有时报"Error 5118"错误&#xff0c;如图(1)所示&#xff1a; 图…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…

Docker安装WebRTC下TURN服务

详细实现方式以及代码下载请前往 https://www.passerma.com/article/90 实现效果 一、手动构建镜像 1.新建Dockerfile文件 文件用于编译镜像 以alpine为基础镜像 添加coturn需要的依赖库 获取coturn并进行编译 通过start.sh启动turnserver服务 Dockerfile FROM alpineRUN ap…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …

深入剖析pcap中的网络异常:TTL过期攻击、ARP中毒、TCP重传与重叠碎片等

网络流量数据包捕获是网络安全领域的重要部分&#xff0c;而pcap文件则是这一过程的常见载体。为了深入解析pcap文件中潜在的可疑网络流量&#xff0c;我们需要运用强大的网络安全威胁评估与审计工具。这些工具能够帮助我们捕捉、记录、检测和诊断网络中的数据传输问题&#xf…

【Python】批量回归分析得到相关系数

我有一个excel&#xff0c;第二列为Y&#xff0c;第三列到最后一列&#xff0c;为x1、x2、……xn&#xff0c;现在要分析第三列到最后一列逐列数据与第二列Y数据的相关性&#xff0c;生成一个新excel&#xff0c;得到R2、p值、截距、斜率&#xff08;对标excel中的回归分析&…

#P0044. [FJOI2014] 最短路径树问题

题目描述 给一个包含 nn 个点&#xff0c;mm 条边的无向连通图。从顶点 11出发&#xff0c;往其余所有点分别走一次并返回。 往某一个点走时&#xff0c;选择总长度最短的路径走。若有多条长度最短的路径&#xff0c;则选择经过的顶点序列字典序最小的那条路径&#xff08;如路…

鸟类分类、鸟类声音相关深度学习数据集大合集

最近收集了一大波和鸟类相关的图片、声音数据集&#xff0c;包含&#xff1a;鸟类分类、鸟类声音识别、鸟类和无人机分类、鸟类状态、鸟类行为等相关数据集。现在分享给大家&#xff01;&#xff01; 1、英国20大园林鸟类的图像数据集 20英国花园鸟类数据集提供了20个类别的3…

开源网络安全工具

开源工具代表了技术领域的一股动态力量&#xff0c;体现了创新、协作和可访问性。这些工具以透明度和社区驱动的原则开发&#xff0c;允许用户根据自己的独特需求仔细检查、修改和调整解决方案。 在网络安全领域&#xff0c;开源工具是无价的资产&#xff0c;使组织能够增强防…

探索 2024 年:未来可能带来的新奇事物

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

MATLAB插值函数

一、MATLAB插值函数概览 1&#xff09;本节重点介绍的插值函数 MATLAB插值函数适用情况基础句式interp1 函数interp1 主要用于一维数据的插值interp1(x, y, x_interp, ‘linear’); 其中 x 和 y 是已知数据点&#xff0c;x_interp 是要插值的目标点。interp2 函数interp2 用于…

C++可变参数模板(展开参数包)

C版本 C11 - C14 例子&#xff1a; #include "X:\Work\Share\CCode\CPlatform\Base\global_c_all.h" using namespace lf; using namespace std;//递归终止函数 void Print() {_cout << _t("\n"); }template <typename T, typename ...Args>…

【LMM 015】LAMM:多模态指令微调数据集,框架和基准

论文标题&#xff1a;LAMM: Language-Assisted Multi-Modal Instruction-Tuning Dataset, Framework, and Benchmark 论文作者&#xff1a;Zhenfei Yin, Jiong Wang, Jianjian Cao, Zhelun Shi, Dingning Liu, Mukai Li, Lu Sheng, Lei Bai, Xiaoshui Huang, Zhiyong Wang, Jin…

Linux第12步_磁盘重新分区

解决“挂载后的U盘出现中文乱码”后&#xff0c;我们接着学习“磁盘重新分区”&#xff0c;熟悉fdisk命令。 1、删除磁盘的分区 输入“cd /回车”&#xff0c;进入根目录 输入“ls /dev/sd*回车”&#xff0c;显示dev以sd所有文件。 输入“sudo fdisk /dev/sdb1回车” 输入…

四元数傅里叶变换(Quaternion Fourier Transforms) 在信号和图像处理中的应用

引言: 信号和图像处理是现代科学和工程领域中非常重要的一个方向,它涉及到对信号和图像进行分析、压缩、增强和恢复等操作。传统的信号和图像处理方法主要依赖于傅里叶变换和滤波器等工具,但这些方法在处理复杂系统时存在一定的局限性。近年来,四元数傅里叶变换作为一种新兴…

IPv6有状态地址自动配置(DHCPv6)

IPv6有状态地址自动配置 IPv6实现了对无状态地址自动配置的支持。这种不需要特殊服务器的地址自动配置方式有着极大的好处。使用起来也很方便,而在IPv4时代曾经是地址自动分配的首选方式的DHCP好像显得有些没落了。但是,DHCP作为有状态地址自动配置的方式之一,依旧有着无状…

BMS电池管理系统带充放电控制过流过压保护

2.4G无线采集BMS开发板&#xff08;主从一体&#xff09; 全新升级 &#xff08;赠送上位机源码TTL 上位机&#xff0c;可以改成自己想要的界面&#xff09; 12串电池TTL上位机 CAN通信上位机源码有偿开源&#xff0c;供项目二次开发。 增加STM32平台 USB转TTL通信 CAN通信 增加…

互联网分布式应用之SpringSecurity

SpringSecurity Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringSecurity基本应用…

kafka中,使用ack提交时,存在重复消费问题

ack提交时&#xff0c;存在重复消费&#xff1f;&#xff1f; 往consumer监听的topic中&#xff0c;增加了一条数据&#xff0c;但是代码消费了好几次&#xff0c;而且确实也走ack.acknowledge();这块逻辑了&#xff0c;因为处理的逻辑是要入库的&#xff0c;导致数据多了好几…

【算法每日一练]-图论(保姆级教程篇14 )#会议(模板题) #医院设置 #虫洞 #无序字母对 #旅行计划 #最优贸易

目录 今日知识点&#xff1a; 求数的重心先dfs出d[1]和cnt[i]&#xff0c;然后从1进行dp求解所有d[i] 两两点配对的建图方式&#xff0c;检查是否有环 无向图欧拉路径路径输出 topodp求以i为终点的游览城市数 建立分层图转化盈利问题成求最长路 会议&#xff08;模板题&a…