C语言进阶第八课 --------通讯录的实现

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


通讯录的实现

  • **作者前言**
  • 通讯录的结构
  • 通讯录的各各方向
    • 通讯录的大致架构
    • 菜单
    • 人的信息和通讯录
    • 结构体变量初始化
    • 增加成员
    • 显示
    • 删除
    • 查找
    • 修改
    • 排序
    • 最终的结构
    • 这个通讯录的问题
  • 总结

通讯录的结构

我们要写一个通讯录首先要知道具体架构

  1. 可以保存100个人的信息
  2. 删除指定联系人的信息
  3. 查找指定联系人的信息
  4. 修改指定联系人的信息
  5. 排序通讯录的信息

我们还要知道联系人的信息有哪里

  1. 名字
  2. 年龄
  3. 性别
  4. 电话
  5. 住址

现在我们大概清楚了通讯录的大致架构下面我们一一解决

通讯录的各各方向

通讯录的大致架构

#include "通讯录声明.h"
int main()
{int input = 0;;printf("是否开始通讯录的操作(0(否)/1(是)):>");scanf("%d",&input);switch (input){case 0:printf("欢迎下次光临,大佬慢走\n");break;case 1:while (1){int select;emun();printf("你要进行的行为是:>");scanf("%d", &select);switch (select){case 0://结束break;case 1://增break;case 2://删break;case 3://查break;case 4://修改break;case 5://排序break;case 6://显示break;default:printf("你的操作有误,请重新操作\n");break;}if (select == 0)break;}printf("操作完成,请慢走\n");break;default:printf("输入错误,请重新输入\n");}return 0;
}

或者是这种

#include "通讯录声明.h"
enum Operate
{EXIT,ADD,DEL,SEEK,MODIFY,SORT,SHOW,};
int main()
{int input = 0;printf("是否开始通讯录的操作(0(否)/1(是)):>");scanf("%d", &input);do{if (input != 0 && input != 1){printf("输入错误,请重新输入\n");printf("是否开始通讯录的操作(0(否)/1(是)):>");scanf("%d", &input);continue;}int select;emun();printf("你要进行的行为是:>");scanf("%d", &select);switch (select){case EXIT://结束break;case ADD://增break;case DEL://删break;case SEEK://查break;case MODIFY://修改break;case SORT://排序break;case SHOW://显示break;default:printf("你的操作有误,请重新操作\n");break;}if (select == 0){break;}} while (input);printf("退出成功,欢迎下次光临,大佬慢走\n");return 0;
}

我以第二种架构为例

菜单

void emun()
{printf("********************************\n");printf("******  0.Exit     1.Add  ******\n");printf("******  2.Del      3.Seek ******\n");printf("******  4.modify   5.sort ******\n");printf("******      6.short       ******\n");printf("********************************\n");
}

人的信息和通讯录

//人的信息
struct People
{char name[NAME];int age;char sex[SEX];char phone[PHONE];char address[ADDRESS];};
//封装成通讯录的样子
struct address_book
{struct People peple_address_num[PEPLE_ADDRESS_NUM]; //人的信息集合int conut; //统计人数
};

结构体变量初始化

void initialization(struct address_book* table)
{assert(table);(*table).conut = 0;//peple_address_num数组的初始化 ---方法1int sz = sizeof(struct People) * PEPLE_ADDRESS_NUM;memset(table->peple_address_num, 0, sz);//peple_address_num数组的初始化 ---方法2/*int i = 0;for (i = 0; i < ADDRESS; i++){(*table).peple_address_num[i].age = 0;int j = 0;for (j = 0; j < NAME; j++){(*table).peple_address_num[i].name[j] = 0;}for (j = 0; j < SEX; j++){(*table).peple_address_num[i].sex[j] = 0;}for (j = 0; j < PHONE; j++){(*table).peple_address_num[i].phone[j] = 0;}for (j = 0; j < ADDRESS; j++){(*table).peple_address_num[i].address[j] = 0;}}*/
}

增加成员

void Add_address(struct address_book* table)
{assert(table);//判断count的大小if (table->conut == PEPLE_ADDRESS_NUM){printf("通讯录已经满了");return;}getchar();printf("输入名字:");gets(table->peple_address_num[table->conut].name);printf("输入年龄:");scanf("%d", &(table->peple_address_num[table->conut].age));getchar();printf("输入性别:");gets(table->peple_address_num[table->conut].sex);printf("输入电话号码:");gets(table->peple_address_num[table->conut].phone);printf("输入地址");gets(table->peple_address_num[table->conut].address);
}

显示

void Show_address(const struct address_book* table)
{assert(table);if (table->conut == 0){printf("内容为空,无需打印\n");return;}int i = 0;printf("显示如下:\n");printf("%-20s %-5s %-5s %-12s %-100s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < table->conut; i++){printf("%-20s ", table->peple_address_num[i].name);printf("%-5d ", table->peple_address_num[i].age);printf("%-5s ", table->peple_address_num[i].sex);printf("%-12s ", table->peple_address_num[i].phone);printf("%-100s\n", table->peple_address_num[i].address);}
}

删除

void Del_adderss( struct address_book * table)
{assert(table);//判断通讯录是否为空if (table->conut == 0){printf("通讯录为空\n");return;}//开始删除printf("你要删除人的名字是:");char arr[NAME];scanf("%s", arr);int idx = Seek_adderss(table, arr);if ( idx != -1){//进行删除table->conut--;while (idx < table->conut){table->peple_address_num[idx] = table->peple_address_num[idx + 1];idx++;}printf("删除成功\n");}elseprintf("无这个人\n");}

查找

int Seek_adderss(struct address_book* table, char * arr)
{assert(arr && table);int i = 0;for (i = 0; i < table->conut; i++){if (strcmp((char*)(&(table->peple_address_num[i])), arr) == 0){return i;}}return -1;
}

修改

void Modify_adderss(struct address_book* table)
{assert(table);//判断通讯录是否为空if (table->conut == 0){printf("通讯录为空\n");return;}//开始修改printf("你要修改人的名字是:");char arr[NAME];scanf("%s", arr);int idx = Seek_adderss(table, arr);if (idx != -1){//进行修改printf("请开始修改\n");printf("修改名字:");scanf("%s", table->peple_address_num[idx].name);printf("修改年龄:");scanf("%d", &(table->peple_address_num[idx].age));printf("修改性别:");scanf("%s", table->peple_address_num[idx].sex);printf("修改电话:");scanf("%s", table->peple_address_num[idx].phone);printf("修改地址:");scanf("%s", table->peple_address_num[idx].address);printf("修改成功\n");}elseprintf("无这个人\n");
}

排序

//排序
void Sort_address(struct address_book* table)
{assert(table);int input;printf("输入你要排序的数字>1(名字),2(年龄),3(性别),4(电话),5(地址)<:");scanf("%d", &input);switch (input){//名字case 1:qsort(table->peple_address_num, table->conut, sizeof(table->peple_address_num[0]), strsort);printf("成功");break;//年龄case 2:qsort(table->peple_address_num, table->conut, sizeof(table->peple_address_num[0]), strsort1);printf("成功");break;// 性别case 3:qsort(table->peple_address_num, table->conut, sizeof(table->peple_address_num[0]), strsort2);printf("成功");break;// 电话case 4:qsort(table->peple_address_num, table->conut, sizeof(table->peple_address_num[0]), strsort3);printf("成功");break;//地址case 5:qsort(table->peple_address_num, table->conut, sizeof(table->peple_address_num[0]), strsort4);printf("成功\n");break;default:printf("输入错误");break;}
}//名字排序
int strsort(const void* e1, const void* e2)
{return strcmp(((struct People*)e1)->name, ((struct People*)e2)->name);
}
//年龄
int strsort1(const void* e1, const void* e2)
{return ((struct People*)e1)->age - ((struct People*)e2)->age;
}
//性别
int strsort2(const void* e1, const void* e2)
{return strcmp(((struct People*)e1)->sex, ((struct People*)e2)->sex);
}
//电话
int strsort3(const void* e1, const void* e2)
{return strcmp(((struct People*)e1)->phone, ((struct People*)e2)->phone);
}
//地址
int strsort4(const void* e1, const void* e2)
{return strcmp(((struct People*)e1)->address, ((struct People*)e2)->address);
}

最终的结构

#include "通讯录声明.h"
int main()
{//创建一个通讯表struct address_book  table;//初始化通讯表initialization(&table);int input = 0;printf("是否开始通讯录的操作(0(否)/1(是)):>");scanf("%d", &input);do{if (input != 0 && input != 1){printf("输入错误,请重新输入\n");printf("是否开始通讯录的操作(0(否)/1(是)):>");scanf("%d", &input);continue;}int select;emun();printf("你要进行的行为是:>");scanf("%d", &select);switch (select){case EXIT://结束break;case ADD://增Add_address(&table);table.conut++;printf("增加成功\n");break;case DEL://删Del_adderss(&table);break;case SEEK://查printf("你要查找人的名字是:");char arr[NAME];scanf("%s", arr);int i = Seek_adderss(&table, arr);if (i == -1)printf("无这个人\n");else{printf("显示如下:\n");printf("%-20s %-5s %-5s %-12s %-100s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s ", table.peple_address_num[i].name);printf("%-5d ", table.peple_address_num[i].age);printf("%-5s ", table.peple_address_num[i].sex);printf("%-12s ", table.peple_address_num[i].phone);printf("%-100s\n", table.peple_address_num[i].address);}break;case MODIFY://修改Modify_adderss(&table);break;case SORT://排序Sort_address(&table);break;case SHOW://显示Show_address(&table);break;default:printf("你的操作有误,请重新操作\n");break;}if (select == 0){break;}} while (input);printf("退出成功,欢迎下次光临,大佬慢走\n");return 0;
}

这个通讯录的问题

  1. 这里录入的信息是存放在内存中,只要程序或者掉电了就会丢失
  2. 这里的通讯录的大小是写死的,如果要实现通讯录满了要扩充就要使用到动态内存管理函数
  3. 函数调用主要是依赖查找函数,缺少这个不行

总结

这个通讯录大致来讲缺陷很多,如果要实现更加完美,我们就要使用后面的知识,代码我会上传到gitee里面有空可以看看,

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

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

相关文章

C/C++面试常见问题——static关键字的主要用法

首先我们要明确一下C/C的内存区域划分 在C/C中内存主要被划分为四大块&#xff0c;堆&#xff0c;栈&#xff0c;全局/静态存储区&#xff0c;代码区 而全局/静态存储区又被细分为常量区(静态常量区&#xff0c;const关键字修饰)&#xff0c;全局区(全局变量区)和静态变量区(…

卫星结构。。。

• 下图介绍了现代卫星中常见的组件&#xff0c;它们被分为 卫星有效载荷 和 卫星总线 。 – 卫星有效载荷 包括任务专用设备&#xff0c;例如用于地球观测的高分辨率相机或用于电信的强大无线电硬件。 – 卫星总线 包括操作和维护卫星所需的所有组件。 • 它被设计为独立于有效…

Tomcat部署项目的两种方式

第一种: 将项目放到tomcat的webapps目录下,war包会自动解压 里面有个页面 为什么会默认访问asd.html 可以配置 tomcat--->conf---->web.xml 第二种方式 在Tomcat/conf/Catalina/localhost/目录下随便建个xxx.xml文件 注意字符编码 utf-8 注意aaa就是上下文地址 …

PMP的智慧(2) - 系统性思考及复杂性

PMP的智慧(2) - 系统性思考及复杂性 在2021年推出的第七版《管理专业知识体系指南》中&#xff0c;PMI在传统的过程和ITTO的基础上&#xff0c;重新增加了12大项目管理原则。 管家式管理 stewardship团队 team干系人 stakeholders价值 value系统思考 system thinking领导力 l…

基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码

基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.人工蜂鸟优化BP神经网络3.1 BP神经网络参数设置3.2 人工蜂鸟算法应用 4.测试结果…

进阶课2——语音分类

语音分类主要是对语音从不同的维度进行识别和分类&#xff0c;这些维度可以包括语种、性别、年龄段、情绪、说话人身份等&#xff0c;具体如下&#xff1a; 语种分类&#xff1a;根据发音人的母语或者惯用语言&#xff0c;将语音分为不同的语种&#xff0c;例如中文、英文、法…

中文编程工具开发语言编程案例:会员VIP管理系统软件实例

中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例 中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&#xff0c;卡类型设置&a…

学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例

要想通过SpringBoot写一个简单的处理请求的服务器&#xff08;方法&#xff09;&#xff0c;需要有以下步骤 建立连接请求响应 来复习的话直接在文章末尾看源码就行 1、创建SpringBoot项目 https://blog.csdn.net/dream_ready/article/details/133948253 2、编写Controller建…

【docker】容器无法使用vi等命令,无法联网,无法换源如何解决?

解决方案&#xff1a; 在宿主机某个位置上创建文件&#xff1a; sources.list 然后修改文件&#xff0c;写入清华源 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricte…

Kotlin中抽象类与接口

Kotlin 中的抽象类和接口是面向对象编程中的重要概念&#xff0c;它们提供了一种用于定义和组织代码的方式。在下面的代码示例中&#xff0c;我们将介绍 Kotlin 中的抽象类和接口&#xff0c;并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类&#xff0c;它仅用作其他…

Android 画板小工具

工作之余&#xff0c;自己想着利用空闲时间做一些小工具出来&#xff0c;今天分享的是一个简单的画板工具&#xff0c;支持轨迹绘制、更换笔迹颜色等功能&#xff0c;并且可以把成品保存到系统相册。支持Android 13 先看一下效果&#xff0c;吐槽一下csdn的视频上传&#xff0…

音频抓取代码示例

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…

npm ERR! node-sass@6.0.1 postinstall: `node scripts/build.js`

1.遇到的问题 vue npm install提示以下错误 2.首次尝试方法 尝试用下面的方式重新安装弄得-saas&#xff0c;结果不起作用 。 npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install node-sass 这时考虑降级node版本&#xff0c;node.js从…

从手动操作到自动化管理,如何实现企业身份业务全面自动化?

在数字化时代&#xff0c;身份管理已经成为了企业和组织不可或缺的一部分&#xff0c;企业对于管理员工、客户和合作伙伴的身份信息和访问权限的需求变得愈发复杂。身份管理不仅仅是一项必要的任务&#xff0c;更是确保业务流畅运营和数据安全的关键因素。然而&#xff0c;传统…

系统架构之微服务架构

微服务架构 一.传统的单体架构与微服务架构的区别1.1 单体架构1.1.1 优点1.1.2 缺点 1.2 微服务架构1.2.1 优点1.2.2 面临的问题与挑战 二. 微服务架构模式方案2.1 聚合器微服务2.2 链式微服务2.3 数据共享微服务2.4 异步消息传递微服务 三. SOA与微服务的区别 微服务&#xff…

Vue 中setup的特性

特性四&#xff1a;父传子组件传参【defineProps】&#xff1a; 父组件&#xff08;传递数据&#xff09;&#xff1a;利用自定义属性传递数据。 <template><h3>我是父组件</h3><hr /><Child :name"info.name" :age"info.age"…

vue图表引用使用

如果你选择Vue作为你的前端框架&#xff0c;并且需要使用图表插件&#xff0c;那么可以考虑以下几种方式&#xff1a; 使用Vue插件&#xff1a;Vue有许多专门为图表设计的插件&#xff0c;如Vue-chartjs、Vue-echarts等。这些插件提供了一些已经封装好的组件并支持常见的图表库…

前端渲染后端返回的HTML格式的数据

在日常开发中&#xff0c;经常有需要前端渲染后端返回页面的需求&#xff0c;对于不同数据结构&#xff0c;前端的渲染方式也不尽相同&#xff0c;本文旨在对各种情况进行总结。 后端返回纯html文件格式 数据包含html标签等元素&#xff0c;数据类型如下图&#xff1a; 前端通…

“编辑微信小程序与后台数据交互与微信小程序wxs的使用“

引言 在现代移动应用开发中&#xff0c;微信小程序已经成为了一个非常流行和广泛使用的平台。为了使小程序能够展示丰富的内容和实现复杂的功能&#xff0c;与后台数据的交互是至关重要的。同时&#xff0c;微信小程序还提供了一种特殊的脚本语言——wxs&#xff0c;用于增强小…