前言:Hello! 我是@每天都要敲代码!截止到今天我们已经写了几个小项目:改版的猜数字游戏、三子棋、扫雷、计算器;今天就在写一个关于通讯录的小项目,感兴趣的小伙伴也可以去回顾一下我们已经写过的小游戏和小项目!今天就带大家一起写一个通讯录,从静态版本---》动态版本---》文件存储版本;不断的进行优化和完善!
在写通讯录之前我们先理清一下思路:
1.通讯录能够存放1000个人的信息;每个人的信息:名字(name)+年龄(age)+性别(sex)+电话(tel)+地址(addr);
2.具体的功能我们至少需要实现:增(Add)、删(Del)、查(Search)、改(Modify)功能;其它的功能由读者自由发挥!
3.我们写成项目工程的模式,主要保包括三个模式:
🧐1. 大体框架
在实现具体功能之前,我们还是先测试一下大体框架的逻辑是不是行得通!和改版的猜数字游戏、三子棋、扫雷、计算器类似;框架都是使用do...while和switch语句!
❤️逻辑测试:
🧐2.通讯录具体功能设计环节
🤏2.1 创建所需结构体
❤️解析:
(1)首先要创建一个结构体PeoInfo,成员包括:name、sex、age、tele、addr;
(2)之后在创建一个结构体数组data[MAX_SIZE];用数组来存储信息;通过数组的下标sz来访问对应的成员变量,并记录当前有效的数据个数;
(3)还需要一个sz用来记录当前通讯录实际的大小;用来标志实际的有效人数!
🤏2.2 初始化通讯录InitContact
❤️解析:
(1)才开始我们要进行初始化,也可以直接Contact con = {0}的形式,直接全部初始化;
(2)也可以分开初始化,利用结构体的访问形式pc->sz = 0;对于数组,我们利用内存设置函数memset来初始化,以字节为单位一个字节一个字节的初始化!
🤏2.3 添加联系人AddContact
❤️解析:
(1)想要添加新的联系人,首先要看通信录还有没有空间;所以要先进行判满处理;
(2)之后输入个人的信息存储到数组里,包括:name、sex、age、tele、addr;
(3)添加完成后,就让sz++;记录当前通讯录实际有效人数!
🤏2.4 打印联系人PrintContact
❤️解析:
(1)首先先打印一个标题;增加可读性!然后在利用for循环打印实际的个人信息!
(2)前面的数字代表域宽:比如-20就代表域宽是20(长度不够20用空格填充),负号代表左对齐,默认是右对齐的!
(3)\t表示tab键,相当于一个分隔符!
🤏2.5 删除联系人DelContact
❤️解析:
要想删除肯定离不开查找,包括下面的查找、修改都需要查找,我们就不妨封装一个函数;遍历整个数组通过名字来进行查找;找到就返回下标,找不到返回-1;
(1)先判断通讯里面是否为空,为空就不需要操作,直接结束;
(2)我们要查找肯定有一个依据,这里就通过姓名查找;所以我们要输入一个要查找的姓名;通过姓名来定位它的下标;
(3)假如要删除下表为pos的信息;就只需要把pos后的数据往前移动,覆盖掉pos位置的信息就可以了;
(4)删除成功后,就把sz--;说明数组里的有效数据减1!
🤏2.6 查找联系人SearchContact
❤️解析:
(1)还是要根据姓名进行查找,找不到就结束退出;在这里也可以添加一个通讯录是否为空的判断,不添加也没问题;为空说明也是找不到的,返回pos = -1,逻辑是没问题的;
(2)找到了,我们就根据返回的pos下标,打印当前的信息就可以了!
🤏2.7 修改联系人ModifyContact
❤️解析:
(1)还是要根据姓名进行查找,找不到就结束退出;
(2)找到了,根据返回的pos值修改;怎样修改呢?直接重新输入就可以了!
🤏2.8 排序联系人SortByAge
❤️解析:
(1)先进行判空处理,结构体为空;就不需要排序;
(2)用过年龄进行排序,利用冒泡排序算法;注意交换时,是结构体与结构体之前的交换;而不是一个结构里的age与另一个结构体的age进行交换;这样会改变原有一个结构体数据的值属性!
🤏2.9 清空联系人CleanContact
❤️解析:
(1)给出提示,询问是不是确定要清空;输入yes才会被清空,直接把sz置为0,并break跳出循环;如果输入no就取消清空并break跳出循;
(2)如果输入的不是yes/no就会一直让你重新输入!
🧐test.c部分
🧐contact.h部分
🧐contact.c部分