【c进阶】通讯录的设计思路和代码实现(从低级到满级)

大家好,今天博主来给大家讲解如何写一个简单的通讯录!喜欢的话,请三连支持一下吧!

ヽ(✿゚▽゚)ノ。

目录

     初级版本(静态版本)

一,设计思路

二,各部分代码的实现

     2.1  contact.h

     2.1.1.库文件

     2.1.2.#define定义的标识符 

     2.1.3.类型

     2.1.4.函数的声明

     2.2contact.c中代码的实现

     2.2.1 init(初始化通讯录)

     2.2.2  find_by_name(找到某个联系人)

     2.2.3addcontact(添加联系人)

     2.2.4  delcontact(删除指定联系人)

     2.2.5searchcontact(查找联系人)

     2.2.6  modifycontact(修改联系人的信息)

     2.2.7 printcontact(打印通讯录) 

     2.2.8 sortcontact(给通讯录按名字排序) 

     2.3  test.c

中级版本(动态版本)

    1.升级contact.h

    2.升级contact.c

    2.1修改init(初始化通讯录的函数)

    2.2实现check_sz

    2.3修改addcontact

高级版本(文件版本)

    1.升级contact.c

    1.1LoadContact(将文件中的信息加载到通讯录)

    1.2SaveContact(退出通讯录的时候把信息到保存到文件)

    1.3修改init

    2.升级test.c


初级版本(静态版本)

一,设计思路

计划使用三个文件来完成,分别是: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,到这里,通讯录就升级完毕了。求三连捏。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值