前言:

  代码写的挺简单的,更像是c语言的课设,然后没有持久化的东西,之前也写过一个类似的,不过我写的纯c语言大概有1700多行,把信息全用文件存起来了,

所以如果要写完整的话,最好还是用数据库或者文件保存下来,另外这个是纯手敲视频的,练练熟练度,不喜勿喷

1. 任务需求

2. 创建项目

然后选择空项目,如果没有空项目,自己百度下插件拓展

将视图切换成解决方案的视图,就在那个视图那里选择,里面写的很清楚的,

3.代码展示

3.1 设计通讯录和联系人的结构体,注意里面的联系人结构体数组的定义数字设置成变量,是有利后期修改的

#define MAX 1000
//设计联系人的结构体
struct Person {
//姓名
string m_Name;
//性别 1男 2女
int m_Sex;
//年龄
int m_Age;
//电话
string m_Phone;
//住址
string m_Addr;
};
//设计通讯录的结构体
struct Addressbooks {
//通讯录中保存的联系人数组
struct Person personArray[MAX];
//现在的保存的人数
int m_Size;
};

3.2 菜单编写

//菜单界面
void showMenu()
{
cout << "***** 1. 添加联系人 *****" << endl;
cout << "***** 2. 显示联系人 *****" << endl;
cout << "***** 3. 删除联系人 *****" << endl;
cout << "***** 4. 查找联系人 *****" << endl;
cout << "***** 5. 修改联系人 *****" << endl;
cout << "***** 6. 清空联系人 *****" << endl;
cout << "***** 0. 退出通讯录 *****" << endl;
}

3.3 添加联系人

//1.添加联系人
void addPerson(Addressbooks *abs)
{
//判断通讯录是否已满
if (abs->m_Size==MAX)
{
cout << "通讯录已满,无法添加" << endl;
return;
}
else
{
//添加具体联系人
//姓名
string name;
cout << "请输入姓名: " << endl;
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
//性别
cout << "请输入性别: " << endl;
cout << "1 --- 男" << endl;
cout << "2 --- 女" << endl;
int sex = 0;
while (true)
{
//如果输入的是1或2可以退出循环,输入错误要重新进入循环
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
} //年龄
cout << "请输入年龄: " << endl;
int age = 0;
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
//住址
cout << "请输入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[abs->m_Size].m_Addr = address;
//更新通讯录人数
abs->m_Size++;
cout << "添加成功!" << endl;
system("pause"); //请按任意键继续
system("cls");//清屏
}
}

先判断人数是否达到了上限,没有的话,再进行添加

3.4 显示联系人

void showPerson(Addressbooks *abs)
{
//判断通讯录中人数是否为0,如果为0,提示记录为空
//如果不为0,显示记录的联系人信息
if (abs->m_Size == 0)
{
cout << "当前记录为空" << endl;
}
else
{
for (int i = 0; i < abs->m_Size; i++)
{
cout << "姓名: " << abs->personArray[i].m_Name << "\t";
cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
cout << "年龄: " << abs->personArray[i].m_Age << "\t";
cout << "电话: " << abs->personArray[i].m_Phone << "\t";
cout << "住址: " << abs->personArray[i].m_Addr << "\t";
}
}
system("pause");
system("cls");
}

3.5 判断是否有这个人,为后面函数使用提供遍历

//检测联系人是否存在,如果存在,返回联系人所在数组的具体位置,不存在返回-1
int isExist(Addressbooks *abs,string name)
{
for (int i = 0; i < abs->m_Size; i++)
{
//找到用户输入的姓名
if (abs->personArray[i].m_Name == name)
{
return i;
}
}
//如果没找到就返回-1
return -1; }

3.6 删除联系人

//3.删除指定联系人
void deletePerson(Addressbooks* abs)
{
cout << "请输入要删除人的名称" << endl;
string name;
cin >> name;
int ret=isExist(abs, name);
if (ret != -1)
{
//查找到人,要进行删除操作
for (int i = ret; i < abs->m_Size - 1; i++)
{
//数据迁移
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_Size--; //更新人数
cout << "删除成功" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}

3.7 查找指定联系人

//4.查找指定联系人信息
void findPerson(Addressbooks* abs)
{
cout << "请输入您要查找的联系人r" << endl;
string name;
cin >> name;
//判断指定的联系人是否存在联系人中
int ret=isExist(abs, name);
if (ret != -1)
{
cout << "姓名: " << abs->personArray[ret].m_Name << "\t";
cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
cout << "年龄: " << abs->personArray[ret].m_Age << "\t";
cout << "电话: " << abs->personArray[ret].m_Phone << "\t";
cout << "住址: " << abs->personArray[ret].m_Addr << "\t";
}
else
{
cout << "查无此人" << endl;
}
//任意键按下后,清屏
system("pause");
system("cls");
}

3.8 修改联系人信息

//5.修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
cout << "请输入要修改的联系人" << endl;
string name;
cin >> name;
int ret=isExist(abs, name);
if (ret != -1) //找到指定的联系人
{
//姓名
string name;
cout << "请输入姓名: " << endl;
cin >> name;
abs->personArray[ret].m_Name = name;
//性别
cout << "请输入性别" << endl;
cout << "1 -- 男" << endl;
cout << "2 -- 女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[ret].m_Sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
//年龄
cout << "请输入年龄" << endl;
int age = 0;
cin >> age;
abs->personArray[ret].m_Age = age;
//电话
cout << "请输入联系方式:" << endl;
string phone;
cin >> phone;
abs->personArray[ret].m_Phone = phone;
//住址
cout << "请输入家庭住址" << endl;
string address;
cin >> address;
abs->personArray[ret].m_Addr = address;
cout << "修改成功" << endl; }
else //未找到指定联系人
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}

3.9 清空联系人,这里就有点灵性了,不是覆盖,而是将size=0,非常便利

//清空联系人
void cleanPerson(Addressbooks *abs)
{
abs->m_Size = 0; //将当前记录人联系人置为0
cout << "通讯录已经被清空" << endl;
system("pause");
system("cls");
}

4.0 主函数

int main()
{
//创建通讯录结构体变量
Addressbooks abs;
//通讯录当前个数为0
abs.m_Size = 0; int select = 0;
while (true)
{
//菜单调用
showMenu();
cin >> select;
switch (select)
{
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: //清空联系人
break;
case 0: //退出通讯录
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}; }

总结: 其实就是练熟练度的,走一遍开发的流程,老师讲的还是挺细的,下一篇应该就是核心篇的项目了

源码的github链接: https://github.com/YenKoc/blackhorsexx

黑马c++基础的一个通讯录系统的更多相关文章

  1. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  2. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  3. 如何设计一个 RPC 系统

    本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型 ...

  4. 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器

    一.Linux基础使用:linux服务器环境搭建(FTP服务器), 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器,要求能使用ftp服务将本机文件到保存linux虚拟机上 资料: VMwa ...

  5. 《Unity 3D游戏客户端基础框架》消息系统

    功能分析: 首先,我们必须先明确一个消息系统的核心功能: 一个通用的事件监听器 管理各个业务监听的事件类型(注册和解绑事件监听器) 全局广播事件 广播事件所传参数数量和数据类型都是可变的(数量可以是 ...

  6. 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】

    此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...

  7. day 65 Django基础十一之认证系统

    Django基础十一之认证系统   本节目录 一 auth模块 二 User对象 三 扩展默认的auth_user表 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 auth模块 我们 ...

  8. day 68 Django基础四之模板系统

      Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关 ...

  9. day 54 Django基础四之模板系统

    Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模 ...

随机推荐

  1. PID参数

    大家奉上一篇关于PID算法及参数整定的知识! 1.位置表达式 位置式表达式是指任一时刻PID控制器输出的调节量的表达式. PID控制的表达式为 式中的y(t)为时刻t控制器输出的控制量,式中的y(0) ...

  2. 重新整理 .net core 实践篇————依赖注入应用之生命法则[三]

    前言 该章演示依赖注入中,对象的释放行为. 紧接上文表示,演示: services.AddSingleton<IMySingletonService, MySingletonService> ...

  3. CRC校验原理简介及C代码实现说明

    1 原理 参考文档:CRC校验 (qq.com) 参考书籍:<计算机网络(第7版)-谢希仁> 1.1 原理简介 CRC是一种检错方法. 在发送端,先把数据划分为组,假定每组k个比特.现假定 ...

  4. (最新)VS2015安装以及卸载过程——踩坑实录

    前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...

  5. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  6. CEVA引入新的可配置传感器集线器DSP架构

    CEVA引入新的可配置传感器集线器DSP架构 CEVA introduces new configurable sensor hub DSP architecture 在一个将多个传感器设计成几乎所有 ...

  7. algorithm头文件下的常用函数

    algorithm头文件常用高效函数 max() max(a, b)返回a和b中的最大值,参数必须是两个(可以是浮点型). 1 #include <iostream> 2 #include ...

  8. springboot——发送put、delete请求

    在springmvc中我们要发送put和delete请求,需要先配置一个过滤器HiddenHttpMethodFilter,而springboot中,已经帮我们自动配置了,所以我们可以不用配置这个过滤 ...

  9. Zabbix 4.0 使用笔记

    自定义监控项1.确认需监控内容 (例如:登陆用户数)2.确认监控方法(例如:脚本)3.编写脚本 vi /etc/zabbix/custom_shell/current_login_user.sh# w ...

  10. 【NX二次开发】Block UI 双精度

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...