新增联系⼈属性,共包括:姓名、年龄、电话信息、地址、其他联系⽅式、备注。 字段规则 消息的字段可以⽤下⾯⼏种规则来修饰: singular :消息中可以包含该字段零次或⼀次(不超过⼀次)。...} 如果想要在contacts.proto文件中使用Phone message类型字段,则: syntax = "proto3"; package contacts2; import "Phone.proto...int32 age = 2; // 年龄 repeated phone.Phone payphone = 3; } 注意:在proto3文件中可以导入proto2消息类型并使用它们...: 当然,我们的关注点不在这里,我们进入到一个类当中(PeopleInfo_Phone类中,这里生成的代码有报错语法提示,是因为插件原因,不用在意,实际上没有任何问题): clear_number():...如果检测到版本不匹配,程序将中⽌。注意,每个 .pb.cc ⽂件在启动时都会⾃动调⽤此宏。在使⽤ C++ Protocol Buffer 库之前执⾏此宏是⼀种很好的做法,但不是绝对必要的。
并且在通讯录中要求实现下述功能: 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 以名字排序所有联系人 二、模块化代码 在代码编辑中,为了避免代码过于冗长...typedef关键字关于typedef: typedef 是类型重命名 与struct 结构体 连起来使用,可以让struct 在定义完成后使用{}后的名字作为类型名。...,结构体内部元素是一个结构体数组; 2.建立循环 首先我们要有一个菜单,向使用者展示通讯录的功能,并且提示他们可以输入对应的字符来进行相对应的功能。...\n"); } 注意: 在新增联系人的时候,我们首先需要判断通讯录是否为满。如果为满则跳出并给出提示。...函数比较是否相同 如果相同 return 其所在位置 如果不同 return -1 //构建一个内部函数,用于实现按名查找 int findName(Contact* p , char name
2、水平分库 荆棘之路 2:联系人、短信数据已分表,但是最初只分了 50 张表,未进行分库。...如果采用常规的扩容方案,那我们将面临着海量存量数据的迁移重新路由问题,成本太大。...:整个改造过程只需要dba执行相关SQL,更改数据表的文件格式,上层的程序代码无需做任何改动; 比较适合云服务的业务场景:用户数据备份、恢复,都不属于高性能、高QPS的业务场景,且云服务的数据表大多符合存在大量字符串字段的特征...原因是在InnoDB系统表空间是无法进行压缩的。系统表空间不仅包含用户数据,还包含 InnoDB 内部系统信息,永远不能被压缩,所以需要设置不同表不同的表空间来支持压缩。...最终线上联系人数据库进行数据压缩的效果如下: 六、写在最后 本文介绍了云服务随着业务发展,海量数据存储所带来的挑战,以及云服务在分库分表、数据库数据压缩上的一些经验,希望能提供借鉴意义。
如果找不到匹配的记录,函数会返回错误信息,告知用户联系人不存在。 如果找到了匹配的记录,函数会进一步比较新旧信息,确定哪些字段发生了变化。然后,它会更新数据库中的联系人记录,将旧的信息替换为新的信息。...在这个过程中,函数还会检查是否有必要的数据丢失或更改,如果有,它也会进行相应的处理。 最后,函数会返回一个确认信息,告知用户联系人信息已成功更新。...如果通讯录中包含大量的联系人信息,打印函数可能会消耗大量的计算资源和时间。因此,需要采用一些优化措施,比如使用高效的数据结构和算法,或者将部分计算任务异步处理,以避免阻塞用户界面。...它的作用是在函数执行完毕后,自动释放函数内部创建的所有局部变量和动态分配的内存空间。这样,操作系统或其他程序就可以重新利用这些内存空间,提高了内存的使用效率。...在某些情况下,使用枚举函数可能会导致代码变得过于复杂或难以理解。比如,当需要表示的数据类型具有大量的可能值时,如果全部使用枚举函数进行定义,那么可能会导致代码变得冗长且难以维护。
在使用这些数据时,我们发现随着数据的增加,当我们要单独寻找某一个数据时就会非常困难,就像图书馆内书籍如果没有按一定的顺序排放,及时我们知道我们要找的书籍叫什么,我们也无法在浩如烟海的书籍内找到它。...总结:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在⼀种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么方式构成,以及数据元素之间呈现的结构。...线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... (2)线性表结构特点 (a)逻辑结构:逻辑上是线性结构,也就说是连续的⼀条直线。...(b)物理结构:物理结构上并不⼀定是连续的(如顺序表物理上连续,链表不连续) 线性表在物理上存储时,通常以数组和链式结构的形式存储。...,如果 已开辟空间为0;我们先赋予它一个初始大小空间,如果不为0,我们再按每次2倍大小进行扩容(2倍空间扩容是较好选择,具体原因设计数学论证,笔者在此不过多赘述)。
一、引言 在日常生活中,我们经常需要管理大量的联系人信息,如姓名、性别、年龄、电话和地址等。为了方便地管理和查询这些信息,我们可以使用C语言编写一个通讯录管理系统。本文将带领大家一步步实现这个系统。...查询联系人:根据用户输入的联系人姓名,查询对应的联系人信息。 显示联系人:显示所有已添加的联系人信息。 加载数据:在程序启动时,系统需要从指定的文件中读取联系人数据,并恢复通讯录的状态。...查询联系人 提示用户输入要查询联系人的姓名。 在通讯录中查找对应的联系人。 如果找到,显示该联系人的详细信息。 如果未找到,提示用户联系人不存在。...展示所有联系人 读取通讯录中的所有联系人信息。 在屏幕上以表格形式展示所有联系人信息。...保存文件 在程序退出前,保存所有更改到通讯录文件。
Ⅰ. enum类型 一、定义规则 在 .proto 文件中枚举类型的书写规范为: 枚举类型名称:使用驼峰命名法,首字母大写。...枚举类型可以在消息外定义,也可以在消息体内定义(嵌套)。 枚举的常量值在 32 位整数的范围内,但因 负值无效因而不建议使用(与编码规则有关)。...<< endl; } } // 新增内容:家庭地址和公司地址字段添加,需要使用PackFrom()来序列化存储 cout 联系人的家庭地址:";...oneof 类型的字段互斥,这意味着在 同一时间只能设置其中的一个字段。 ...有如下规则: 设置一个字段时,oneof 中其他字段会被自动清除。也就是说设置多个字段后,只有最后一个被存储下来了! 如果未设置任何字段,oneof 被视为 未设置。
用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器就能在线编程。...图片 在全部空间的右侧还有一个近期删除,为了防止误删除,已删除的工作空间会展示在下方“已删除的工作空间”列表中,保留24小时。...代码实现的基本思路是定义一个通讯录类,然后通过列表进行增删改查和排序等操作,并且可以将通讯录内容保存到文件中。 在代码实现上,对于用户输入的数据进行了简单的校验,保证了数据的有效性和安全性。...但是在使用的过程中,我想要输出一个折线图并没有成功,以及其他的输出图像的方式也没输出出来。...今天我受到一个大佬的启发,我完全可以在平板上编辑程序呀,省着拿着电脑了,原来在平板上用的是python编辑器(是一个软件),体验并不是很好,只要一切换软件,程序就停止运行(已经允许它后台了)。
删除联系人:按照姓名进行删除指定联系人 查找联系人:按照姓名查看指定联系人信息 修改联系人:按照姓名重新修改指定联系人 清空联系人:清空通讯录中所有信息 退出通讯录:退出当前使用的通讯录 1.2 成品演示...通讯录管理系统 二、代码实现 2.1 菜单功能 功能描述: 用户选择功能的界面 步骤: 封装函数显示该界面 void showMenu() 在main函数中调用封装好的函数 // 菜单函数 void...设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。...因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。...封装查找联系人函数 实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。
除了所有工具外,还有一个基础的事情可以促成或破坏公司内部的任何数据倡议:您如何思考跟踪什么,如何跟踪它,以及如何随着时间的推移对其进行管理。 如果你把这些原则方法弄错了,世界上最好的工具不会拯救你。...此外,如果我想知道这些注册中有多少次,我需要单独添加所有这些独特的事件,使任何潜在的分析对任何PM来说都乏味和令人望而却步。 (好的)“注册已点击”-在这种情况下,我们对事件非常具体。...描述 - 您如何描述此事件被记录给以前从未使用过该产品的人?使用此字段消除未来使用该字段的业务团队和执行这些规范的工程团队之间任何错位的可能性。...我还使用Intent Events意图事件来识别用户在完成操作时自然采取的路径。例如,使用我们的发票和账单支付应用程序,用户是先导入联系人还是先创建发票来发送发票?...一些例子: 城市 年龄 公司规模 角色 产品等级 通常情况下,这些都是您希望能够从属性更改之前永久分割用户和事件的东西。一些平台,如Mixpanel,包含超级属性等功能,允许您轻松做到这一点。
对于通讯录一些功能的实现,无非就是添加联系人,删除联系人,更改联系人,查找联系人,展示联系人罢了,下面我们对这几个函数实现的逻辑一一叙述。 ...,确保将姓名,电话,地址等等数据填上,之后我们可以把这个写完的数据,通过顺序表的任意一个插入功能来实现,此时我们可以用任何一个插入函数来进行,小编在后续代码中使用的是尾插操作来进行的,此时是为了把我们的数据放入结构体数组之中...,在进行完判断以后,就要准备进行我们的删除操作了,首先,我们想要删除联系人的时候,底层逻辑肯定是顺序表的删除操作,因为我们删除的联系人是指定的,所以我们要使用指定位置删除的函数,此时我们需要设置一个字符数组...在之后我们要进行更改联系人的操作,此操作并没有对应着顺序表的函数,所以是一个可以看为是一个全新的函数,此时我们前面的操作和删除联系人操作是一样的,先看看指定联系人存不存在,然后遍历整个数组,存在就返回坐标...,所以读者朋友做事时不要因为一点小困难就放弃哦~不扯远了,我们在遍历完数组后,如果找到了就打印找到了,然后把指定数据打印完就好,如果没有找到就显示没有找到。
然而,AirDrop 场景带来了一系列独特的挑战:解决方案需要: (a) 在没有任何第三方服务器支持的情况下完全脱机运行,(b) 考虑恶意方对其地址簿条目或自己的联系人 ID 标识,(c) 在能源和计算资源受限的移动设备上运行...B.设备可发现性在 iOS 设备上打开共享窗格时,如果附近的设备可被发现,则会出现在用户界面中。特别是,接收器设备可以被每个人发现,也可以只被联系人发现,这是默认设置。...因此,如果接收者知道发送者,恶意发送者可以学习所有联系人标识符,而无需接收者的任何先验知识。...如果应该避免这种泄漏,应该预先计算新的加密并且永远不要重复使用。轮次复杂度:就轮次复杂度而言,可以将 PSI 发送方的最后两条消息捆绑到接收方,而无需更改接收方的视图。...由于本研究工作的目的是防止个人信息泄露,建议不包含任何(甚至缩短的)联系人标识符,只需将字段设置为固定值,例如 0x0000。
组件构成 在分析组件之前,我们需要先了解一下Vue Component ,使用Vue 的 朋友应该很熟悉了,一个组件的构成由以下组成: data 组件内部状态 computed 计算属性,监听data...如果连接已经关闭,则此方法不执行任何操作。...大体思路我说说一下: 传输格式上定了,那么接收的数据结构也就定了,更多的就是在数据结构上下文章了, 前后端需要约束好字段属性。...来确定如何显示 @ 推送全局 Notification 通知 和 聊天内部推送 设计 区分数据类型的字段,这样前端在接收到推送的消息时,知道在页面中该如何显示,例如(该显示图片样式还是文本样式)...在聊天组件中使用 Websoket 在聊天组件中,其实使用的就是 发送功能 和 获取 历史记录 功能,还有就是根据 推送的消息内容字段来决定页面中数据如何显示。
引言: 1.菜单 通讯录也如同游戏,需要菜单来供使用者选择,因此要用do...while......: 与游戏一样,通常需要三个文件: 1.contact.h 包含函数的声明和某些重要量的定义,这些量定义在头文件中方便源文件的使用,也方便代码的统一修改,使之灵活(用define来说明,如:扫雷中的行和列...->count].age)); /*年龄不是数组,要取地址*/ con->count++; /*记得++*/ } Sort部分: 运用了qsort函数,具体可参考该文章:qsort函数的使用和模拟实现排序...,更改失败\n"); } else { printf("请输入联系人名字:\n"); scanf("%s", con->data[i].name); printf("请输入联系人性别...&(con->data[i].age)); printf("更改成功\n"); } } 好的,现在只需在test.c部分运用一些语句修饰就可以啦!
使用枚举实菜单中数字具有一定的意思,提高代码可读性。...通讯录基本功能的实现 1.增加联系人 首先我们要判断通讯录中是否已满,如果已满自然不能加入联系人。如果未满,则添加联系人。...\n"); } 2.删除联系人 我们先要先判断通讯录是否为空,为空无法删,否则就删。我们删除的前提是要找到某个联系人,就像我们在微信上拉黑某人的去列表中找他在删他。...所以我们现在通讯录不为空的前提下查找某一联系人的姓名,当我们找到的时候就删了它。又因为这个查找联系人的功能我们在后面的功能里面也会使用,所以也将它封装成一个函数,以便后面使用。...我们这里采用的是根据姓名进行排序,也可以按照年龄只需要更改比较规则即可。
,这些知道了我们的结构体也就可以定义了 代码演示: 由于数组的数字使用起来不方便更改和没有什么特殊意义,所以我们就把这些数组可以定义的宏来。...一 、这里要注意的意思如果联系人为空就无法删除 二,查找函数的实现不需要声明因为我们只需要在这一个文件下用不需要跨文件使用 三 、 删除完联系人后我们需要把删除的联系人的那个节点后面的联系人都给向左填充...这里需注意的是由于我们只需要查找联系人而不用修改 所以我们在接收只指针的时候要记得,使用 const 进行修饰 来确保指针指向的内容不会被我们改变而引发程序错乱 代码演示: //查询联系人 void...答案肯定还是使用下标的方法进行更改了!诶这里大家有没有发现我们查询函数的便捷性,所以像这种只要多次使用的功能一定要封装成函数。...这样使用起来就会方便很多 代码演示: //修改联系人 void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("
对序列化后的内容使用PB进行反序列化,解析出联系人信息并打印出来。 联系人包含以下信息:姓名、年龄。...在 .proto ⽂件中,要使⽤ syntax = "proto3"; 来指定文件语法为 proto3,并且必须写在除去注释内容的第⼀行。 如果没有指定,编译器会默认使用proto2语法。...在.proto文件中定义一个消息类型的格式为: message 消息类型名 // 建议使用驼峰命名法 {} 为contacts.proto新增联系人message内容如下: syntax = "proto3...如果非要在.proto文件中使用这些预留标识号,例如将name字段的编号设置为19000,编译时机会报警。...以上三种序列化的方法没有本质上的区别,只是序列化后输出的格式不同,可以供不同的应⽤场景使用。
最后,调用`SLPushBack`函数,将这个联系人的信息添加到通讯录(实际上是一个顺序表)中。 2....在顺序表尾部插入数据(SLPushBack函数): 首先,使用`assert`函数检查传入的顺序表指针`ps`是否为空。如果为空,程序将终止运行。这是一种防止程序出错的方式。...使用 for 循环遍历通讯录中的每一个联系人。...在每次循环中,使用 strcmp 函数比较当前联系人的姓名 pcon->arr[i].name 和要查找的姓名 name。strcmp 函数用于比较两个字符串是否相同。...如果 findIndex 非负,表示找到了匹配的联系人,继续执行下一步。 打印找到的联系人的信息: 首先打印一列标题,包括“姓名”、“性别”、“年龄”、“电话”和“住址”。
秉承没有妹子也得继续学习的态度,本狗将实际代码编写中J使用技巧总结。分享给小伙伴们,希望这些姿势知识 能够成为吸引妹子的引路石。...✅正确示例 使用短路语法兜底,严谨写法// 模拟后端接口返回user为null时const user = null;// 加入短路语法,意思为如果user为空则以{}作为解构对象const {name,...函数内部通过判断target对象是否具有pageXOffset和pageYOffset属性来确定滚动位置的获取方式,如果存在则使用该属性值,否则使用scrollLeft和scrollTop属性。...、数组操作以及一些常用的JS功能片段,总结如下:解构赋值妙用短路语法防止报错:在解构可能为undefined或null的对象时,使用短路语法(|| {})来避免错误。...解构时赋值默认值:在解构时可以为未定义的属性提供默认值。数组小技巧按条件向数组添加数据:根据条件动态地决定是否向数组添加特定元素。获取数组最后一个元素:使用slice(-1)获取数组的最后一个元素。
Person表示联系人结构体,其中包含联系人姓名,性别,年龄,电话,住址。 4.在main()函数里面。...(详细见代码) 后续其余信息项也可以,本文代码没有过多实现。 6.显示联系人 显示联系人的操作比较简单,我们遍历一遍通讯录即可。然后遍历过程中打印联系人的各项信息。...10.清空通讯录 这里操作比较简单,我们只需要逻辑上实现清空操作即可,令size = 0; 这也是为什么一些文件被删除以后我们还能进行恢复,因为物理磁盘上还存贮有,并没有实际删除,除非后续下载东西将其覆盖了...abs->size = 0; cout 已空!"...; case 0://清空通讯录 cout 使用!!!"
领取专属 10元无门槛券
手把手带您无忧上云