目录

前言

项目需求

需求分析

整体分析

设计思路

数据类型

实现框架

函数设计

增加函数addPerson()

设计思路

函数实现

查询函数ifExit()

设计思路

函数实现

删除函数deletePerson()

设计思路

函数实现

修改函数modifyPerson()

设计思路

函数实现

查找函数findPerson()

设计思路

函数实现

清空函数

设计思路

函数实现

源码地址

结语


技术栈:c++ 指针&结构体

须知:

1.需要有一定的c++基础

2.需要知道github是什么

3.需要知道怎么从github上下载源码并运行

如果本文章对您有所帮助,麻烦您点赞、收藏加评论三连走起哦!

前言

最近,在学习的过程中。上手跟做了一个通讯录管理系统,后来自己又复现了一遍。加了一点自己的内容。完成这个项目之后,想把自己对于这个项目的理解和设计分享出来。供大家做个参考,也希望能对大家有所帮助!

项目需求

设计一个通讯录管理系统,主要实现以下功能:

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

需求分析

整体分析

该项目的主要的功能就是使用c++实现对数据简单的增删改查,还有基础的输入与输出功能即可完成该项目的功能需求。

设计思路

数据类型

首先,需要保存数据。不能通过单个的int、string这样的数据类型。操作太过繁杂且不好管理。所以就需要使用到结构体来保存。由于通讯录和联系人直接时包含关系,所以只需要在使用系统的时候就新建一个通讯录的结构体,然后在通讯录结构体内再定义一个新的结构体数据,用于保存联系人的信息和一个整型变量存储通讯录的人数。如下图所示:

另外,项目还要求该通讯录限制联系人个数为1000。那么,联系人结构体数组的长度就已知了。之后也不需要改变长度。就直接在源码头部定义一个宏常量MAX_SIZE来代替总人数,方便后续维护。通过以上的两步,就可以先初步设计出我们所需要的数据类型了。代码部分如下所示:

#define MAX_SIZE 1000 //设置最大人数// 定义联系人结构体
struct people {string name;//姓名string sex;//性别int age;//年龄string telephoneNumber;//联系电话string address;//家庭住宅
};// 定义通讯录结构体
struct addressBook {int id;// 联系人编号people peopleArray[MAX_SIZE];// 联系人数组
};

实现框架

选择完所需要数据类型,就可以进行对自己代码的整体框架进行一个设计。首先,主函数部分我们通过一个 while 循环和 switch 语句分别进行不同功能的实现。其中,修改函数的部分我们同样可以参照主函数使用一个二级菜单界面让用户选择。其它的函数只需要实现对应的功能并完成封装和调用即可。大概的逻辑示意图如下所示:

根据示意图,自定义函数名。就完成了一个大概的需求分析。

//显示界面函数
void showMenu();// 增加函数
void addPerson(addressBook *p);// 显示函数
// 只读不写 加const防止误操作
void showPerson(const addressBook *p);// 查找函数
int ifExit(addressBook *p,string name);// 删除函数
void deletePerson(addressBook *p);// 查找函数
void findPerson(addressBook *p);// 修改联系人
void modifyPerson(addressBook *p);// 修改的界面显示函数
void showSmallMenu();// 清空通讯录
void cleanAll(addressBook *p);

为什么是传址?

因为传地址调用更节省内存空间而且可以通过形参修饰实参。

函数设计

此处主要讲解主要的增删改查的函数,其余函数我会在源代码中给出。因为这个项目中最核心的部分就是对数据的增删改查。具体指针部分不做过多讲解,如果不理解基础的内容。直接讲解如何使用指针作用不大。会给出源码,自己可以自行先了解指针的原理就可以明白如何我是如何使用指针的。

增加函数addPerson()

设计思路

首先获取用户想要输入的联系人个数,然后对用户的输入做一个合法性的判断。如果输入正确且没有超出容量个数,就可以正常进行输入。通过以上描述,主要使用 if 判断和 for 循环语句来完成。

函数实现

void addPerson(addressBook *p) {cout<<"当前系统容量为:"<<MAX_SIZE - p->id<<endl;// 询问添加人数int num=0;cout << "你要添加的人数为:";cin >> num;// 判断用户输入是否大于总容量 1000if (num > 1000 || num + (p->id) > 1000) {cout << "你的添加量已经超出容量,请检查容量后再输入" << endl;} else if(num<=1000 && num>0  && num+(p->id)<=1000){for (int i = 0; i < num; i++) {// 指针赋值操作cout<<"\n姓名:";cin >> p->peopleArray[p->id].name;cout<<"性别:";cin >> p->peopleArray[p->id].sex;// 只有年龄需要准确的判断cout<<"年龄:";while(true){cin >> p->peopleArray[p->id].age;if(p->peopleArray[p->id].age<0||p->peopleArray[p->id].age>150){cout<<"请重新输入你的年龄:";}else{break;}}cout<<"联系电话:";cin >> p->peopleArray[p->id].telephoneNumber;cout<<"家庭住址:";cin >> p->peopleArray[p->id].address;(p->id) += 1; // 每加一个人 就记录当前通讯录的人数}cout << "添加成功!"<<endl;}else{cout<<"你的输入有误,请检查后重新输入"<<endl;}system("pause"); //暂停指令system("cls"); //清屏指令
}

查询函数ifExit()

我们可以发现,在删除特定联系人、查找特定联系人以及修改联系人信息中。都是要做到一个操作,就是先要查询联系人列表,看是否有这个人。如果有,再进行下一步操作。所以,为了减少代码的重复,就在此处单独定义一个查询函数,之后直接调用即可。

设计思路

参数应该有两个,联系人数组和想要查询的姓名。直接 for 循环遍历联系人,在for循环内部嵌套一个 if 判断语句。如果数组中的联系人姓名与查询的姓名相同。就返回当前联系人的下标。如果没有找到,就返回一个-1。在函数中接受返回值,进行判断即可。

函数实现

// 若找到 返回下标
// 若未找到 返回-1
int ifExit(addressBook *p,string name){for(int i = 0;i<p->id;i++){//判断是否相等if(p->peopleArray[i].name == name){//找到 返回下标return i;}}// 遍历完数组若没找到 返回-1return -1;
}

删除函数deletePerson()

设计思路

直接调用查询函数,用一个变量接收查询函数返回的值。如果找到查询的下标,直接用一个 for 循环从当前下标开始遍历,用下一个联系人信息覆盖所要删除的联系人信息即可。遍历结束后,只需让总人数做一个减一即可。若没有找到,直接显示查无此人即可。

函数实现

void deletePerson(addressBook *p){// 询问获取姓名string name;cout<<"请输入你想要删除的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查无此人"<<endl;}else{//遍历覆盖int temp = p->id;for(int i = result;i<temp;i++){p->peopleArray[i]=p->peopleArray[i+1];}(p->id)--;cout<<"删除完成"<<endl;}system("pause"); //暂停指令system("cls"); //清屏指令
}

修改函数modifyPerson()

设计思路

直接调用查询函数,用一个变量接收查询函数返回的值。如果找到查询的下标,进入一个二级菜单,然后分别显示需要修改的内容。直到用户修改完成,选择退出二级菜单的修改界面即可。若没有找到,直接显示查无此人即可。

函数实现

// 二级菜单函数定义
void showSmallMenu(){system("cls");cout<<"******1.修改姓名********"<<endl;cout<<"******2.修改性别********"<<endl;cout<<"******3.修改年龄********"<<endl;cout<<"******4.修改电话********"<<endl;cout<<"******5.修改住址********"<<endl;cout<<"******0.退出修改********"<<endl;}// 修改函数
void modifyPerson(addressBook *p){// 询问获取姓名string name;cout<<"请输入你想要修改的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查无此人"<<endl;}else{int select_modify = 0;int num = 1;while (num) {showSmallMenu();cout<<"请输入你的选择:";cin>>select_modify;switch (select_modify) {case 1:cout << "请输入新的姓名:";cin >> p->peopleArray[result].name;break;case 2:cout << "请输入新的性别:";cin >> p->peopleArray[result].sex;break;case 3:cout << "请输入新的年龄:";cin >> p->peopleArray[result].age;break;case 4:cout << "请输入新的电话:";cin >> p->peopleArray[result].telephoneNumber;break;case 5:cout << "请输入新的住址:";cin >> p->peopleArray[result].address;break;case 0:num--;cout<<"退出成功"<<endl;break;default:cout<<"输入有误!请重新输入:";break;}}}system("pause"); //暂停指令system("cls"); //清屏指令
}

查找函数findPerson()

设计思路

直接调用查询函数,用一个变量接收查询函数返回的值。如果找到查询的下标,直接使用 cout 输出当前下标人的信息。若没有找到,直接显示查无此人即可。

函数实现

void findPerson(addressBook *p){// 询问获取姓名string name;cout<<"请输入你想要查找的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查无此人"<<endl;}else{cout<<"姓名:";cout<<p->peopleArray[result].name;cout<<"\t性别:";cout<<p->peopleArray[result].sex;cout<<"\t年龄:";cout<<p->peopleArray[result].age;cout<<"\t联系电话:";cout<<p->peopleArray[result].telephoneNumber;cout<<"\t家庭地址:";cout<<p->peopleArray[result].address<<endl;}system("pause"); //暂停指令system("cls"); //清屏指令
}

清空函数

设计思路

如果选择全部清空,二次询问防止误操作。如果二次确认清空,直接将总人数改为 0 即可做到一个逻辑上的清零。如果是误操作,直接退出即可

函数实现

void cleanAll(addressBook *p){cout<<"是否清空?(y/n):";char select_clean;cin >> select_clean;while(true) {if (select_clean == 'y' || select_clean == 'Y') {p->id = 0;cout<<"清空成功"<<endl;break;} else if (select_clean == 'n' || select_clean == 'N') {break;} else{cout<<"输入有误,请重新输入"<<endl;cin>>select_clean;}}system("pause"); //暂停指令system("cls"); //清屏指令
}

源码地址

获取源码https://github.com/TuoXiaodong/Address-book-management-system


结语

到此为止,对于通讯录管理系统的整体部分讲解已经结束了。希望以上的讲解对你有所帮助!如果你需要源码,可以自己自行跳转链接下载即可。别忘了点个star哦!当前的系统还是有不足之处,希望你能提出宝贵意见,我会根据你的建议继续不断地完善这个系统。github上会持续更新的,也欢迎你关注我的更新与完善。

  创作不易,请多多支持!

希望大家能多多点赞+评论+收藏!!!!!

C++ | 通讯录管理系统相关推荐

  1. c语言个人通讯录管理系统实验报告_C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include ...

  2. c++小项目:通讯录管理系统

    该项目非常适合新手c++的同学来做(当然也包括我),先看一个通讯录管理系统需要写什么东西. 学习于:https://www.bilibili.com/video/BV1et411b73Z?p=75(自 ...

  3. 教你如何用python实现学生通讯录管理系统

    这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现学生通讯录管理系统的具 ...

  4. android运用 sqlite 实现简单的通讯录_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...

    说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号.性别.籍贯.政治面貌.手机号.Q ...

  5. 单位员工通讯录管理系统(线性表的应用)

    [问题描述] 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话.手机号.及电子邮箱.其功能包括通讯录链表的建立.员工通讯信息的查询.修改.插入与删除.以及整个通讯录表的输出. ...

  6. 【黑马程序员 C++教程从0到1入门编程】【笔记2】通讯录管理系统

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.系统需求 2.创建项目 2.1 创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1 设计联系人结构体 5.2 设 ...

  7. c语言3级菜单_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...

    说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号.性别.籍贯.政治面貌.手机号.Q ...

  8. python通讯录管理程序的用户可行性_通讯录管理系统项目可行性分析

    通讯录管理系统可行性 分析报告 一.可行性研究报告 .................................................................. 错 误!未定义 ...

  9. C++阶段02笔记【通讯录管理系统 完整代码(系统需求、创建项目、添加/显示/删除/查找/修改/清空)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 01.系统需求 02.创建项目 2.1 创建项目 2.2 添加文件 03.菜单功能 04.退出功能 05.添加联系人 5.1 设 ...

  10. 一个很Low的通讯录管理系统(但是能用)C/C++单链表实现

    通讯录管理系统的设计 问题需求分析 在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的.现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程 ...

最新文章

  1. python join split
  2. 正则表达式用户名密码电话身份证Email使用
  3. 自动驾驶关键技术报告:惯性导航和背后的芯片大战
  4. Csharp: FreeTextbox 编辑器控件运行时错误: 'FTB_ResizeGalleryArea' 未定义
  5. Javascript基础系列之(三)数据类型 (数值 Number)
  6. ACM入门之【分块习题】
  7. tcpsyn发生在哪层_必看面试题之计算机网络:来自一位拿到了腾讯和字节双offer的大佬...
  8. 中餐菜单分类名称创意_(全)西餐厨师岗位分类、薪资待遇与职责介绍
  9. java 字符串比较 == equals_java怎么比较字符串,==和equals有什么区别
  10. 【Git基础笔记】常用命令
  11. python函数的参数细节
  12. 短视频APP测试要点
  13. Unity播放序列帧,功能丰富
  14. 生物化学《第一章概述》
  15. python中返回上上级目录的命令
  16. 想打游戏/追剧,又放心不下学习,该怎么办?
  17. UVM中starting_phase
  18. 【读书笔记】文案创作完全手册
  19. 运维之DNS服务器Bind9配置解析和基础示例及附带命令
  20. 最火爆的人工智能学习基础课程(2021人工智能视觉训练营)

热门文章

  1. Ubuntu 18.04.3 双屏显示 N卡驱动 问题解决
  2. 转载黑苹果10.13N卡驱动方法
  3. 表格特性:表格实现的边框、表格特性、边框的颜色、表格的标题
  4. 安装和配置Oracle10g详细教程
  5. 解决springboot的pom.xml文件第一行报错问题
  6. 9月【笔耕不辍】勋章活动获奖名单公布
  7. Excel 2010同时打开2个或多个独立窗口
  8. 关于T检验的各种问题
  9. java web批量下载
  10. Redis Cluster集群(Linux设计搭建)