详解通讯录(静态版本、动态版本、文件版本)

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

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

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

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

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

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

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

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

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

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

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

详解通讯录(静态版本、动态版本、文件版本)_第1张图片

目录

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语句!

详解通讯录(静态版本、动态版本、文件版本)_第2张图片

❤️逻辑测试:

详解通讯录(静态版本、动态版本、文件版本)_第3张图片

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

2.1 创建所需结构体

详解通讯录(静态版本、动态版本、文件版本)_第4张图片

❤️解析:

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

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

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

2.2 初始化通讯录InitContact

详解通讯录(静态版本、动态版本、文件版本)_第5张图片

❤️解析:

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

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

2.3 添加联系人AddContact

详解通讯录(静态版本、动态版本、文件版本)_第6张图片

❤️解析:

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

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

2.4 打印联系人PrintContact

详解通讯录(静态版本、动态版本、文件版本)_第7张图片

❤️解析: 

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

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

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

2.5 删除联系人DelContact

详解通讯录(静态版本、动态版本、文件版本)_第8张图片

 ❤️解析: 

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

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

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

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

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

2.6 查找联系人SearchContact

详解通讯录(静态版本、动态版本、文件版本)_第9张图片

 ❤️解析:

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

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

2.7 修改联系人ModifyContact

详解通讯录(静态版本、动态版本、文件版本)_第10张图片

❤️解析:

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

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

2.8 排序联系人SortByAge

详解通讯录(静态版本、动态版本、文件版本)_第11张图片

 ❤️解析:

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

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

2.9 清空联系人CleanContact

详解通讯录(静态版本、动态版本、文件版本)_第12张图片

❤️解析:

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

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

test.c部分

详解通讯录(静态版本、动态版本、文件版本)_第13张图片

contact.h部分 

详解通讯录(静态版本、动态版本、文件版本)_第14张图片

contact.c部分 

非项目模式代码

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

详解通讯录(静态版本、动态版本、文件版本)_第15张图片

动态增长版本

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

详解通讯录(静态版本、动态版本、文件版本)_第16张图片

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

41ecacb2eae24b578f1edf4812a2d6cc.png

详解通讯录(静态版本、动态版本、文件版本)_第17张图片

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

详解通讯录(静态版本、动态版本、文件版本)_第18张图片

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

详解通讯录(静态版本、动态版本、文件版本)_第19张图片

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

写入文件版本:

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

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

详解通讯录(静态版本、动态版本、文件版本)_第20张图片

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

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

详解通讯录(静态版本、动态版本、文件版本)_第21张图片

你可能感兴趣的:(c语言)