前面的文章中我们介绍了好几种小游戏,比如猜数字、井字棋、扫雷等等,这些都是我们实实在在通过自己的努力学习收获而来的,也是我们向非计算机专业同学“炫技”的好帮手。但是,这些东西,好像无法拿到一些家长面前和他们分享我们的成功和喜悦,因为部分家长可能会不太认可这些小玩意儿,所以,今天带着大家实现一个有用的、拿的出手的小程序——手机通讯录,希望大家能够从中有所收获,更希望你的付出和努力能够得到家长的认可和鼓励。
目录
1.手机通讯录的大致功能
虽然随着社会的进步和科技的发展,传统的电话通讯逐渐被微信、QQ等新型通讯软件替代,但电话通讯目前仍是我们手机不可缺少的必备功能。而对于这种手机必备功能,相信大家对于其功能都不会陌生,至于我们今天要实现的手机通讯录简易版。
它有以下有些功能:
①添加联系人
②删除联系人
③打印通讯录
④查找联系人
⑤修改联系人
⑥分类联系人
⑦保存联系人信息至文件
上述是今天简易实现的手机通讯录的全部功能,接下来让我们一步一步看如何实现吧!
2.手机通讯录的实现思路
还记得我在猜数字游戏的实现中说过的一句话吗?没错,我们在写编程题或者小游戏代码时,最重要的就是理清实现思路——主体是什么?为了实现目的要创建哪些函数?函数的功能都是什么?只有当我们心中有了一个大体的框架,知道该做些什么时,我们才能更高效地编写代码,完成程序设计。
手机通讯录的算法实现如下:
1.提供菜单并提示用户选择要进行的功能;
2.完成对应选项的功能;
3.再次提供菜单询问;
根据上面的简易思路,我们可以先写出大体的框架的代码,具体如下:
void menu()
{
printf("************************************\n");
printf("*******1.add 2.del*********\n");
printf("*******3.search 4.modify******\n");
printf("*******5.show 6.sort********\n");
printf("*******0.exit *******\n");
printf("************************************\n");
}
int main()
{
int input=0;
//创建通讯录
struct Contact con;//con就是通讯录,里边包含:data指针,size和capacity
//初始化通讯录
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case ADD://枚举常量使代码更具可读性
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
break;
case EXIT:
//销毁通讯录-释放动态开辟的内存
printf("请确认当前联系人信息已经保存,是否继续退出?\n1.YES 2.NO\n");
int select = 0;
scanf("%d", &select);
if (select == 2)
{
input = 1;
break;
}
else
{
DestroyContast(&con);
printf("退出通讯录\n");
break;
}
case SAVE:
SaveContact(&con);
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}
上面的代码完成了通讯录的最基本功能——提供菜单,但是对于每一项具体功能没有给出实现代码,只是起了个名字放在哪里——我称之为空壳函数,那接下来我们就逐步实现这些函数即可。
3.手机通讯录各个部分的实现
3.1联系人变量的建立
对于每一位联系人,我们肯定要存储其很多相关信息,比如姓名、性别、年龄、电话、地址等等信息,而在已知C语言提供的数据类型中没有能够满足这样需求的,所以,我们就不难想到要定义结构体类型来存放联系人信息。
结构体类型定义代码如下图所示:
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
相信聪明的你能够轻易看出这里我们的联系人包含了姓名、年龄、性别、电话、地址这五项基本信息,当然大家也可以根据需求自行添加别的信息。
3.2通讯录的建立
既然是通讯录,我们肯定要存放很多联系人的信息,那么我们应该建立多大的数组呢?建立的太大,我们可能用不到,反而过多占用系统资源;建立的太少,又可能不够我们使用。为了避免上面两种情况的出现,我们这里建议使用动态开辟内存,这样就可以根据所需开辟空间,提高资源利用率。
代码如下所示:
typedef struct Contact
{
struct PeoInfo *data;//存放1000个信息struct PeoInfo data[1000]
int size;//记录当前已有个数
int capacity;//当前通讯录的最大容量
}Contact;
上面定义的结构体类型变量就是一个通讯录了,所以我们只需要定义一个结构体变量就是建立一个通讯录了。
3.3通讯录的初始化
这里并没有太多讲究,只是大家要记住要动态开辟空间。
初始化函数InitContact的代码如下:
void InitContact(struct Contact* ps)
{
ps->data=(struct PeoInfo*)malloc(DEFAULT_SZ*sizeof(struct PeoInfo));
if(ps->data==NULL)
{
return;//无法成功申请,就退出
}
ps->size=0;//设置通讯录最初有0个元素
ps->capacity=DEFAULT_SZ;//这里相当于初始时能存放的联系人个数
}
当然我这里初始化开辟的空间比较小,只能存放三个联系人,大家可以酌情增加初始大小。
3.4通讯录的增容
有些小伙伴可能会疑惑为什么通讯录要增容,这是干什么的?其实,在我们提供的菜单中是没有这一项功能,它是实际上是我们进行添加联系人的一个前置操作——增加通讯录容量。因为我们是动态开辟的空间,所以,在添加联系人的过程中&#