前言: 上篇我们通过结构体的构建来创造通讯录的联系人内容以及封装100个联系人,并实现了通讯录的增删查改等基本功能,这篇我们要进行改造的内容就是将固定的100个联系人容量改为不定长,有几个联系人就进行扩容...1.进阶通讯录特点: ①基本的增删查改功能; ②通讯录的空间是不固定的,大小是可以调整的 ③默认能放3个人的信息,如果不够就每次增加2个人的信息 2.实现步骤: (1)定义一个结构体来存储联系人的基本信息例如...int sz;//用来记录存放联系人个数 int capacity;//记录通讯录当前的最大容量 }Contact; (3)初始化通讯录; void InitContact(Contact* pc...(5)基本功能函数 可以通过http://t.csdnimg.cn/gIo96百行代码实现简单通讯录来查看哦;这里将增加联系人函数与删除联系人函数单独拿出来,因为有改进的地方 ①增加联系人函数 int...;//记录通讯录当前的最大容量 }Contact; //函数声明 void InitContact(Contact* pc);//初始化 void AddContact(Contact* pc);//
.append(this.address); return sb.toString(); } } 创建核心业务类 package top.thecat; import java.util.ArrayList...; import java.util.List; /** * 核心业务类 */ public class Operate { private List list;...}else { System.out.println("输入有误,请重新输入"); } } 测试验证类中得验证方法...System.out.println("通讯录管理系统已恢复初始化状态,请继续操作!")...for (int i=0;i<this.list.size();i++){ (this.list.get(i)).setId(i+1); } } 项目演示 java
toString() { return "Contact [name=" + name + ", phone=" + phone + "]"; } } package tongxun; import java.util.HashMap...; import java.util.Iterator; import java.util.Map; import java.util.Set; public class ConTactService...Integer k=it.next(); System.out.println("Num:"+k+"---"+contacts.get(k)); } } } package tongxun; import java.util.Iterator...; import java.util.Map; import java.util.Set; public class Test { public static void main(String[]
思路 思路:通讯录: 1、人的信息:姓名+年龄+性别+地址+电话 2、通讯录中可以存放100个人的信息 3:功能: 1》增加联系人 2》删除指定联系人 3》查找指定联系人的信息 4》修改指定联系人的信息...("***********************************");//6排序 printf("***********************************"); } 5、创建通讯录...Contact con; 6、初始化通讯录 //初始化通讯录 InitContact(&con); 初始化函数 void InitContact(Contact* pc)//初始化 { pc...} 7、用do-while循环 main函数中代码 int main() { //创建通讯录 Contact con;//也可直接在这里等于0,就是不够灵活 //初始化通讯录 InitContact...break; case 6: SortContact(&con);//排序(用年龄,名字都行) break; case 0: printf("退出通讯录\n");
【通讯录项目 (3 / 3)】基于顺序表的通讯录实现——通讯录项目实现 前言 前两章我们已经知道顺序表的功能并完成了功能实现,下面我们将实现通讯录的以下功能: 1 项目预备工作 1.1 多文件处理...代码中“前置声明”是为了避免后续引用出现问题。我们通过“typedef”进行重命名,方便后续书写代码。 2 功能实现 上面将我们的准备工作进行完毕,下面开始实现功能。我们基于顺序表在进行操作。...2.1 初始化通讯录 “初始化”只需要简单的引用顺序表的初始化即可。...2.4 展示通讯录 展示通讯录的功能是对顺序表展示的扩展。...下面我们开始完善界面内容,来把通讯录的功能进行整合。
一、本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通讯录...获取通讯录密钥的目的: 通过企业ID(CorpId)和 通讯录密钥可以获取通讯录相关接口的使用凭证(AccessToken)。有了AccessToken,就可以使用通讯录相关接口了。...2.2对象的序列化的目的 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。...以下代码为文本消息的json字符串,将text属性类型设为Text,Text类中包含content属性。...2.1 工具类之微信参数封装类——WeiXinParamesUtil.java 此类封装了微信的相关参数,如企业id、应用凭证、通讯录凭证等。封装起来更易维护,实现一处修改多处改变。
如果你没有看过通讯录初级,请先移步到那。 在前面我们写了一个静态的通讯录,通讯录的大小都是固定的,同时每次启动通讯录都需要重新输入数据。这用起来肯定是不人性化的。...进阶通讯录与原版的不同点就在于,通讯录的大小是会随着数据的添加而增大的,也就是动态内存管理,以及会对通讯录的数据进行存储,一旦通讯录被关闭数据就会自动存放在相应的文件。...同时在下一次打开通讯录时,会自动将文件中的数据导入通讯录中。...3.通讯录的销毁 因为通讯录的空间是动态内存开辟的,所以再最后是需要还给存储系统的,我们需要释放空间。 至于什么时候释放,当用户退出程序时释放空间。...利用fread将文件中的二进制数据导入通讯录,我们先创立一个临时的变量来存放数据,然后在把这个数据转移给通讯录。
//typedef struct Contact //{ // PeoInfo data[MAX];//存放数据 // int sz;//记录的是当前通讯录中存放的人的信息数 //}Contact;...//动态通讯录版本 typedef struct Contact { PeoInfo* data;//存放数据 int sz;//记录的是当前通讯录中存放的人的信息数 int capacity;...//记录的是当前通讯录的容量 }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc...sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact->calloc"); return; } //加载文件中的信息到通讯录...; break; case SHOW: ShowContact(&con); break; case SORT: break; case EXIT: //保存通讯录中的数据到文件中
下面先来讲添加联系人函数的逻辑实现,这个是基于顺序表中的插入函数(头插,尾插,指定位置插)来进行描写的,不过比那个要复杂很多,此时我们需要创建一个通讯录变量,来对这个变量的内容通过scanf语句来进行输入...此时为了让之后文章语句以及代码变得更容易可读,小编将原顺序表设置好的内容更名为通讯录了(这里也运用到typedef关键字,可以看出它应用的广泛),所以通讯录中是存放着结构体类型的数组,有效个数,总空间个数...之后我们要进行删除联系人的操作,此时我们在进行操作之前,要先确保通讯录是不为空的,也就是通讯录中是有元素存在的,此时我们需要用到assert断言(此断言小编在之前的文章提到过),来判断结构体数组是否为空...,所以我们要使用前置声明(因为此时顺序表的头文件并没有包含在通讯录的头文件中,大家千万不要文件进行嵌套(就是两个头文件相互包含对方,这样是万万不可的,代码会出错的)),下面直接上初始化的代码: void...,小编之前已经写了不少的菜单页了,之后我们就要开始选择这些内容了,此时我们可以先输入一个数,然后用小编之前写过的分支语句文章中的,我们的老朋友switch语句,这个语句是来判断我们输入的数的,此时为了我们能一直保持在通讯录页面
基于顺序表的通讯录实现——顺序表介绍 文章目录 基于顺序表的通讯录实现——顺序表介绍 1.1 数据结构 1.1.1什么是数据? 1.1.2什么是结构? 概念 :数据结构是计算机存储、组织数据的⽅式。...当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。...同理,程序中如果不对数据进⾏管理,可能会导致数据丢失、操作数据困难、野指针等情况。通过数据结构,能够有效将数据组织和管理在⼀起。按照我们的⽅式任意对数据进⾏增删改查等操作。...假定数组有10个空间,已经使⽤了5个,向数组中插⼊数据步骤: 求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是否要判断数组是否满了,满了还能继续插⼊吗)?...线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。
-- 通讯录 --> ...{ this.isLoad = true; this.getContactsList(); }, mounted() {}, methods: { //获取通讯录列表...padding: 30rpx 0; text-align: center; } } } 4.自我总结 1.这个页面的构成是头部(搜索)、中间列表部分(通讯录列表展示...我记得在第一次做的时候,整个页面都会拉动,因为我把头部组件和中间的写在一坨上了,正确的就是以上的写法。
学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。...typedef struct SeqList Contact;//改通讯录的名字,没有包含顺序表的头文件,所以需要写出完整的名字 void ContactInit(Contact*con); //通讯录的销毁...(Contact*con); //通讯录的查找 void ContactFind(Contact*con); //通讯录的展示 void ContactShow(Contact*con); typedef...); printf("请输入要添加的联系人住址:\n”); scanf("%s",info.addr); //往通讯录中添加数据 SLPushBack(con,info);/.../尾插,顺序表中已有方法的复用 } //通讯录删除联系人 int FindByName(Contact*con,char name[]) { for(int i=0;isize;i+
C语言通讯录功能的实现 一、项目需求: 我们需要一个通讯录,可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。...并且在通讯录中要求实现下述功能: 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 以名字排序所有联系人 二、模块化代码 在代码编辑中,为了避免代码过于冗长...一个人的通讯录信息结构体已经已经建立好了。现在我们需要一个结构体数组,来存放1000个人的信息,同时出于功能的需求,我们还要知道通讯录已经存储了多少个人的信息,所以我们再建立一个通讯录本结构体。...enum { Exit, Add, Del, Search, Modify, Show, Sort, }; 写在contact.h头文件中 那么循环可以更改为上述名字。...,所以不需要在头文件中声明也是可以的。
基于顺序表的通讯录实现——顺序表功能实现 顺序表功能实现 基于顺序表的通讯录实现——顺序表功能实现 1 初始化与销毁 1.1 初始化 1.2 销毁 2 头部插入与删除 2.1 头部插入 2.1.1检查容量...经过上一篇文章我们对顺序表有了一个初步的认识,下面我们将通过C语言实现顺序表的功能,包括: 增加数据 删除数据 查找数据 修改数据 可以把顺序表看作一种特殊的数组,我们下面将要进行的操作是基于...i++) { ps->a[i] = ps->a[i + 1]; // a[size-2]=a[size-1] (模拟最后一次操作) } ps->size--; } 头部删除非常简单,将顺序表中的数据从第二个依次向前覆盖即可...6 结束语 顺序表的功能我们已经实现,我们使用的是最简单的顺序表,所以整个过程看起来没有困难。在下一篇文章中我们将进行通讯录的实现。...在通讯录里,顺序表的类型不在是简单的" int ",而是结构体类型。 下面给出通讯录的基本功能供大家参考预习。
目录 思路 代码实现 完整代码(可自取) 思路 在前面的文章中,已经讲解了动态版本的通讯录的实现,但是动态通讯录存在一个致命缺陷,就是它不能自动保存数据,而前面一篇文章中学到了数据持久化的方法之一:即把数据存放在磁盘文件上...假如我们在退出的时候,通过文件操作,把我们所写的数据存在磁盘文件里,然后我们再进行下一次的使用的时候,在初始化阶段就从磁盘中读取这些数据,这不就实现了。...从文件中读取信息(初始化阶段完成) //读通讯录文件信息 //size_t fread(void* ptr, size_t size, size_t count, FILE* stream) void...) { //失败则打印错误报告 perror("Storage_Contact::fopen"); return; } int i = 0; //将sz个数据都写入到文件中 for...struct contact con; //初始化通讯录(读之前通讯录的信息) Init_contact(&con); do { menu(); printf("请选择:->");
1.前言 整理学习”Android动画效果集合开源APP(BaseAnimation)程序源码“中的通讯录效果。...>笔记20 | 学习整理开源APP(BaseAnimation)程序源码“中的通讯录效果(一) ---- 3.2 通讯录界面ListView的数据填充 加载联系人的方法容易理解,排序》加载》处理 >笔记...21 | 学习整理开源APP(BaseAnimation)程序源码“中的通讯录效果(二) ---- 3.3 联系人的搜索 搜索部分难点是拿出搜索的内容,首先自定义了ClearEditText,给出了一个...textchange的监听,然后进行匹配>筛选>排序>加载到联系人列表中。...public void afterTextChanged(Editable s) { } }); /** * 根据输入框中的值来过滤数据并更新
1.前言 整理学习”Android动画效果集合开源APP(BaseAnimation)程序源码“中的通讯录效果。...---- 3.目录 3.1 A-Z的字母索引 3.2 联系人界面ListView的数据填充 3.3 联系人的搜索 3.1 A-Z的字母索引 ?...通过自定义一个View界面,绘制一个A-Z竖向排列的布局,通过触摸事件监听,根据触摸的区域和字母高度的计算出position,再向联系人Listview提供一个方向输出position值!...*b数组的长度就等于点击b中的个数....firstChar == section) { return i; } } return -1; } ---- 3.2 通讯录界面
对于Scanner的进一步理解还是在LeetCode的一道算法题上,题目大意是输入一组分式加法构成的字符串,要求输出分式相加的结果。首先是输入”-2/3+2/3-4/5″,接着求其和。...首先第一步需要解析字符串为所需的数据,我使用了split()的方式,有位大哥就使用了`scanner.useDelimiter(pattern)`方法,直接将数据解析到了Scaner对象中。...# Scanner的工作方式 Scanner的分隔符模式将输入分割到令牌(token,就是临时存储区域),默认情况下以**空格**分割。然后可以使用各种next方法将得到的令牌转换成不同类型的值。...`pattern的模式`,并返回一个新的Scanner对象。...**总结:使用Scanner+正则的组合可以简化很多字符串的处理,而无需使用大量的代码分割字符串和数值转换。
if语句if语句是Java语言中的一种条件语句,用于在程序运行时基于给定的条件选择要执行的语句块。...如果条件为true,那么将执行if代码块中的语句;否则,将执行else代码块中的语句。...除了基本的if语句,Java还提供了一些变体,可以更灵活地控制代码的执行流程。下面是其中一些常见的变体:if-else-if语句在需要根据多个条件进行选择的情况下,可以使用if-else-if语句。...如果所有条件都不满足,那么将执行else代码块中的语句。...三目运算符Java还提供了一种特殊的条件语句,称为三目运算符(或者叫条件运算符)。它的基本语法结构如下:result = condition ?
一个例子 Object类是所有类的父类,如果你去查看java.lang.Object类的源码,你会发现里面有个finalize方法,这个方法没有默认实现,需要子类根据实际情况重写这个方法,但是如果不恰当使用...类里也有一个引用队列,这个引用队列是JVM和垃圾回收器打交道的唯一途径,当垃圾回收器需要回收该对象时,会把该对象放到引用队列中,这样java.lang.ref.Finalizer类就可以从队列中取出该对象...$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 这个线程唯一的职责就是不断的从...java.lang.ref.Finalizer.ReferenceQueue队列中取对象,当一个对象进入到队列中,finalizer线程就执行对象的finalize方法并且把对象从队列中删除,因此在下一次...histo:live 8700|head -n 10命令强制触发一次GC,结果和前面的分析一致,Finalizer对象都放到引用队列中,并依次调用了对象的finalize方法,内存中java.lang.ref.Finalizer
领取专属 10元无门槛券
手把手带您无忧上云