大家好,今天博主来给大家讲解如何写一个简单的通讯录!喜欢的话,请三连支持一下吧!
ヽ(✿゚▽゚)ノ。
目录
1.2SaveContact(退出通讯录的时候把信息到保存到文件)
初级版本(静态版本)
一,设计思路
计划使用三个文件来完成,分别是:contact.h(头文件包含) contact.c(代码实现) test.c(测试功能)
我要求此通讯录要拥有七个基本功能,分别为:0.exit(退出) 1,add(增加) 2,del(删除)
3,search(查找) 4,modify(修改) 5,print(打印) 6.sort(排序)
如下,便是test();——测试函数的基本架构。
为了提高可读性,可以使用枚举类型来改进。
这样读者一看便会明白对应部分的功能。
每一个联系人需要多种类型的信息来描述,所以需要定义一个结构体类型。又因为,一个通讯录需要记录很多的联系人,所以需要一个结构体数组来存储,和一个变量来记录联系人的个数。
这样便完成了最基本的框架。
二,各部分代码的实现
2.1 contact.h
此头文件里面应该包含我们需要用到的所有库文件,类型的声明和一些函数的声明
如下,
2.1.1.库文件
2.1.2.#define定义的标识符
使用#define定义标识符的好处是:
1.在修改信息的时候,只需要修改一处,不用多次修改。
2.在想要修改信息的时候,只需要到头文件中,寻找要修改的信息,而不是在许多的代码中笨重的寻找。
2.1.3.类型
con结构体中的sz专门用于实时记录联系人的总人数。
2.1.4.函数的声明
2.2contact.c中代码的实现
2.2.1 init(初始化通讯录)
初始状态下联系人数量为0,即p->sz=0;
使用memset将数组初始化为0,这里通过结构体指针拿到的 people 是数组名,而不是地址。
2.2.2 find_by_name(找到某个联系人)
输入联系人的名字之后遍历结构体数组,如果找到,返回下标i。如果没找到,返回-1。
在设计思路中,并没有提到要实现此函数,但是
封装此函数有利于后面其他函数的实现,请往下看。
2.2.3addcontact(添加联系人)
添加成功后,联系人的数量会增加一,所以sz也要自增一。
2.2.4 delcontact(删除指定联系人)
这里便用到了上文查找联系人的函数。
如果找到,从此位置开始向前覆盖,并且让总人数减一,就相当于删除了指定联系人。
2.2.5searchcontact(查找联系人)
输入联系人的名字,查找到之后打印他的信息。
2.2.6 modifycontact(修改联系人的信息)
如果没有找到指定的联系人便直接return,
如果找到便进行修改。
2.2.7 printcontact(打印通讯录)
2.2.8 sortcontact(给通讯录按名字排序)
使用冒泡排序,利用strcmp函数的返回值来给联系人排序。
2.3 test.c
以上工作全部做完,便是设计测试模块,如下
中级版本(动态版本)
初级版本必须由使用者自己设置通讯录的大小,使用起来特别僵硬
可不可以根据需求升级为动态增长的版本呢?我们依旧分为三个文件来进行修改。
1.升级contact.h
如果要求能够动态调整,就不能使用结构体数组:
1.因为如若不是变长数组的话,数组在一般情况下是定长的。
2.动态开辟出的内存的地址必须返回给一个可修改的左值,然而数组的首地址是个常量,无法去修改。
另外,需要设置一个最大容量(sum),这样当sz到达最大容量的时候,再进行扩容。
所以 ,contact.h 修改为:
除此之外还需要定义一个函数来进行检查联系人数量和增容:
2.升级contact.c
2.1修改init(初始化通讯录的函数)
将最大容量设置为初始容量PEOPLE_MAX,之后使用calloc开辟空间并且初始化通讯录为全0,
用它
来接受开辟的内存的地址。
2.2实现check_sz
如果检测到sz达到了最大容量,就让最大容量加2。
2.3修改addcontact
只需要在addcontact中加入check_sz即可。
test.c没有什么需要改的
高级版本(文件版本)
前两个版本都存在一个共同的问题:程序一旦结束,所有联系人的信息都会被清空.
那么接下来使用文件将输入的联系人信息进行保存。
我们要做到:
1. 添加一个函数,在退出通讯录的时候把信息到保存到文件中
2. 添加一个函数,在通讯录打开的时候,可以把文件中的信息加载到通讯录中
1.升级contact.c
1.1LoadContact(将文件中的信息加载到通讯录)
1.2SaveContact(退出通讯录的时候把信息到保存到文件)
1.3修改init
2.升级test.c
———————————————————————————————————————————
OK,到这里,通讯录就升级完毕了。求三连捏。