详解通讯录(静态版、动态增长版、文件存储版)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 详解通讯录(静态版、动态增长版、文件存储版),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言:Hello! 我是@每天都要敲代码!截止到今天我们已经写了几个小项目:改版的猜数字游戏、三子棋、扫雷、计算器;今天就在写一个关于通讯录的小项目,感兴趣的小伙伴也可以去回顾一下我们已经写过的小游戏和小项目!今天就带大家一起写一个通讯录,从静态版本—》动态版本—》文件存储版本;不断的进行优化和完善!

##################################

###          《改版的猜数字游戏》          ###

###          《三字棋游戏的设计》          ###

###          《扫雷游戏的设计》             ###

###          《计算器的设计》                ###

#################################

在写通讯录之前我们先理清一下思路:

1.通讯录能够存放1000个人的信息;每个人的信息:名字(name)+年龄(age)+性别(sex)+电话(tel)+地址(addr);

2.具体的功能我们至少需要实现:增(Add)、删(Del)、查(Search)、改(Modify)功能;其它的功能由读者自由发挥!

3.我们写成项目工程的模式,主要保包括三个模式

40f3a87603cf42ffa88b7f1a65a4b29c.png

目录

🧐1. 大体框架

❤️逻辑测试:

🧐2.通讯录具体功能设计环节

🤏2.1 创建所需结构体

❤️解析:

🤏2.2 初始化通讯录InitContact

❤️解析:

🤏2.3 添加联系人AddContact

❤️解析:

🤏2.4 打印联系人PrintContact

❤️解析: 

🤏2.5 删除联系人DelContact

 ❤️解析: 

🤏2.6 查找联系人SearchContact

 ❤️解析:

🤏2.7 修改联系人ModifyContact

❤️解析:

🤏2.8 排序联系人SortByAge

 ❤️解析:

🤏2.9 清空联系人CleanContact

❤️解析:

🧐test.c部分

🧐contact.h部分 

🧐contact.c部分 

🧐非项目模式代码

🧐动态增长版本

❤️更改部分1:通讯录的创建

❤️更改部分2:初始化部分

❤️更改部分3:增加联系人

❤️更改部分4:清空通讯录

🧐写入文件版本:

❤️更改部分1:当通讯录退出时,把信息写到文件

❤️更改部分2:当通讯初始化的时候,加载文件的信息 


🧐1. 大体框架

在实现具体功能之前,我们还是先测试一下大体框架的逻辑是不是行得通!和改版的猜数字游戏、三子棋、扫雷、计算器类似;框架都是使用do…while和switch语句!

bb7fc7586344432fbdd307868642c190.png

❤️逻辑测试:

0051383e738d4847971957566997f0ad.png

🧐2.通讯录具体功能设计环节

🤏2.1 创建所需结构体

80dbea990cf34fef926eacff3eecf8ca.png

❤️解析:

(1)首先要创建一个结构体PeoInfo,成员包括:name、sex、age、tele、addr;

(2)之后在创建一个结构体数组data[MAX_SIZE];用数组来存储信息;通过数组的下标sz来访问对应的成员变量,并记录当前有效的数据个数;

(3)还需要一个sz用来记录当前通讯录实际的大小;用来标志实际的有效人数!

🤏2.2 初始化通讯录InitContact

74d74ab299c140549d326c0c7f7c85fc.png

❤️解析:

(1)才开始我们要进行初始化,也可以直接Contact con = {0}的形式,直接全部初始化;

(2)也可以分开初始化,利用结构体的访问形式pc->sz = 0;对于数组,我们利用内存设置函数memset来初始化,以字节为单位一个字节一个字节的初始化!

🤏2.3 添加联系人AddContact

0f21b79c08e94ba2a9f691c5987bb38e.png

❤️解析:

(1)想要添加新的联系人,首先要看通信录还有没有空间;所以要先进行判满处理;
(2)之后输入个人的信息存储到数组里,包括:name、sex、age、tele、addr;

(3)添加完成后,就让sz++;记录当前通讯录实际有效人数!

🤏2.4 打印联系人PrintContact

820d8feb7fbc4121a69d5cd15e3cc651.png

❤️解析: 

(1)首先先打印一个标题;增加可读性!然后在利用for循环打印实际的个人信息!

(2)前面的数字代表域宽:比如-20就代表域宽是20(长度不够20用空格填充),负号代表左对齐,默认是右对齐的!

(3)\t表示tab键,相当于一个分隔符! 

🤏2.5 删除联系人DelContact

1e0dbf65dba54b1faaacb613433797b1.png

 ❤️解析: 

要想删除肯定离不开查找,包括下面的查找、修改都需要查找,我们就不妨封装一个函数;遍历整个数组通过名字来进行查找;找到就返回下标,找不到返回-1;

(1)先判断通讯里面是否为空,为空就不需要操作,直接结束;

(2)我们要查找肯定有一个依据,这里就通过姓名查找;所以我们要输入一个要查找的姓名;通过姓名来定位它的下标;

(3)假如要删除下表为pos的信息;就只需要把pos后的数据往前移动,覆盖掉pos位置的信息就可以了;

(4)删除成功后,就把sz–;说明数组里的有效数据减1!

🤏2.6 查找联系人SearchContact

0c5ecdbd08c34703b76f400ab34b98d5.png

 ❤️解析:

(1)还是要根据姓名进行查找,找不到就结束退出;在这里也可以添加一个通讯录是否为空的判断,不添加也没问题;为空说明也是找不到的,返回pos = -1,逻辑是没问题的;

(2)找到了,我们就根据返回的pos下标,打印当前的信息就可以了!

🤏2.7 修改联系人ModifyContact

cc0668de714649b0bf177dea5598ae4a.png

❤️解析:

(1)还是要根据姓名进行查找,找不到就结束退出;

(2)找到了,根据返回的pos值修改;怎样修改呢?直接重新输入就可以了!

🤏2.8 排序联系人SortByAge

698b70af95114a628f434dd3899ee6ba.png

 ❤️解析:

(1)先进行判空处理,结构体为空;就不需要排序;

(2)用过年龄进行排序,利用冒泡排序算法;注意交换时,是结构体与结构体之前的交换;而不是一个结构里的age与另一个结构体的age进行交换;这样会改变原有一个结构体数据的值属性!

🤏2.9 清空联系人CleanContact

113f7f6f9cb949619632e8ea0604f15f.png

❤️解析:

(1)给出提示,询问是不是确定要清空;输入yes才会被清空,直接把sz置为0,并break跳出循环;如果输入no就取消清空并break跳出循;

(2)如果输入的不是yes/no就会一直让你重新输入!

🧐test.c部分

991c7780726848c5a7f3aabdb422f83c.png

🧐contact.h部分 

4feaa0d70f2f4b8ba6a5ed8e15eea742.png

🧐contact.c部分 

d3c292fef9b649819a0d00c35fb0e0b8.png

🧐非项目模式代码

个人觉得还是非项目模式更加的直观易懂,所以把非项目模式也写出来,供大家参考!

3b0fa900bd284a8b937970a1d55b98d1.png

77fbae1b16d74fdea98fa26fbfb06d93.png

🧐动态增长版本

❤️更改部分1:通讯录的创建

9f28d2a1d0d34ac79854e1aab1f066d8.png

❤️更改部分2:初始化部分

41ecacb2eae24b578f1edf4812a2d6cc.png

af936589bedb4c73827b6bce048ef7ab.png

❤️更改部分3:增加联系人

bf632e77addd492fbf4e976b9aac82ad.png

❤️更改部分4:清空通讯录

05ec6d8fc1644ecaa6ff2c772edcb3b0.png

清空销毁通讯录也可以不写在菜单里,直接写到EXIT退出通讯录里面,让它退出直接调用这个清空销毁函数!就算不销毁最终程序结束也会自动销毁!

🧐写入文件版本:

❤️更改部分1:当通讯录退出时,把信息写到文件

我们就封装一个函数SaveContact;把这个函数写到case EXIT里面,我们先把信息存储起来后,在执行销毁并退出!

fccfac668f46415eb92f0260b67790e8.png

❤️更改部分2:当通讯初始化的时候,加载文件的信息 

我们封装一个LoadContact函数,在初始化结束后就开始加载信息;所以把LoadContact函数写到初始化函数InitContact内部的最后面!

8ff3cbd8ad514707b8472c365038c6b9.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/128522.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!