C语言实现静态通讯录
创始人
2024-05-11 00:11:15
0

专栏:C语言
每日一句:这几年可能会有点累,但要相信你的人生不可能就止于此地了,你要有你的梦想,所以你要努力,只有坚持这阵子,才不会辛苦一辈子,努力会让自己过得很好,

静态通讯录

  • 前言
  • 一、通讯录的框架
  • 二、初始化联系人ContactInit
  • 三、添加联系人ContactAdd
  • 四、删除联系人ContactDel
  • 五、展示联系人ContactShow
  • 六、查找联系人ContactFind
  • 七、修改联系人ContactModify
  • 八、给联系人排序ContactSort
  • 总结


前言

对于通讯录相信大家都不陌生,但是通讯录怎么实现的你知道吗?
下面为大家讲解一下通讯录是如何实现的

每写一个函数,便测试一个函数,一次把全部函数写完的话,出现bug不好调。

在这里插入图片描述


一、通讯录的框架

实现通讯录,应该先把通讯录的框架制作出来,那么制作框架也很简单,只需要用到do while循环,和switch语句,在前面实现猜数字,三子棋,扫雷小游戏的时候,也是这样做的。
通讯录可以存姓名,电话,地址,性别,年龄等,这么多东西要在一起实现,单用一个数组可不行,要用结构体!结构体内可以包含这些东西,方便后续的操作。

#define MAX_SIZE 1000
#define MAX_NAME 5
#define MAX_TELE 100
#define MAX_SEX 5
#define MAX_ADDRESS 50typedef struct Contact
{char name[MAX_NAME];//姓名int age;//年龄char sex[MAX_SEX];//性别char tele[MAX_TELE];//电话char address[MAX_ADDRESS];//地址
}Cont;typedef struct C
{Cont data[MAX_SIZE];int size;//已存联系人的个数
}Contact;

用宏是为了方便更改大小。

int main()
{int input = 0;do{switch (input){default:break;}} while (input);return 0;
}

实现了框架之后,要想,通讯录有什么功能,并把这些功能一一实现,在这里,可以先写一个菜单,然后把功能出现在菜单上。

void menu()
{printf("************************************\n");printf("******  1. 添加    2. 删除    ******\n");printf("******  3. 查找    4. 修改    ******\n");printf("******  5. 展示    6. 排序    ******\n");printf("******  7.退出                ******\n");printf("************************************\n");
}

增删查改,排序,展示,就是通讯录的全部功能。然后在利用switch语句,把这些功能实现。

void menu()
{printf("************************************\n");printf("******  1. 添加    2. 删除    ******\n");printf("******  3. 查找    4. 修改    ******\n");printf("******  5. 展示    6. 排序    ******\n");printf("******  7.退出                ******\n");printf("************************************\n");
}int main()
{int input = 0;Contact con;//定义结构体do{menu();printf("请输入选项:");scanf("%d", &input);switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactFind(&con);break;case 4:ContactModify(&con);break;case 5:ContactShow(&con);break;case 6:ContactSort(&con);break;case 7:printf("退出\n");break;default:printf("输入错误,请重新出入\n");break;}} while (input != 7);return 0;
}

这样通讯录的框架就已经成功实现了。

二、初始化联系人ContactInit

要先把结构体进行初始化,有一点值得注意Contact con; ContactInit(&con);这里要传地址,不带&符号的话,不会改变结构体,因为形参的改变对实参没有影响,通过地址去访问,就能达到改变实参的目的初始化,要把联系人的数量初始化为0。

void ContactInit(Contact* ps)//初始化
{ps->size = 0;memset(ps->data, 0, sizeof ps->data);
}

注:传参传的是地址,要用指针接收

这样就完成通讯录初始化了。

三、添加联系人ContactAdd

要想实现增加联系人很简单,只需要输出联系人,并在通讯录的尾部添加上去即可,当然,也可以写一个头部添加,尾部添加,随机添加的函数,在这里,只介绍尾部添加。
当通讯录满的时候,就无法在添加联系人,为了避免越界访问,要单独写一个判断,如果满足判断,直接返回即可。

void ContactAdd(Contact* ps)//添加联系人
{assert(ps);if (ps->size == MAX_SIZE){printf("内存已满,无法添加\n");return;}//增加一个人的信息printf("请输入名字:>");scanf("%s", ps->data[ps->size].name);printf("请输入年龄:>");scanf("%d", &(ps->data[ps->size].age));printf("请输入性别:>");scanf("%s", ps->data[ps->size].sex);printf("请输入地址:>");scanf("%s", ps->data[ps->size].address);printf("请输入电话:>");scanf("%s", ps->data[ps->size].tele);ps->size++;
}

在这里插入图片描述

四、删除联系人ContactDel

删除联系人,就要先找到联系人。可以以姓名查找,也可以以电话号查找,在这里,只实现了以电话号查找。
可以写一个用于通过姓名查找的函数,在输入要查找的姓名之后,便开始查找,找到之后,返回该联系人的下标,若没找到,返回-1,在进行找到和没找到条件的判断,若找到:把后面的联系人依次往前面移动一位,再把联系人的数量-1.就可以达到删除联系人的目的。若没找到:直接返回即可

int FindByName(Contact* ps,const char *str)//通过姓名查找
{int pos = 0;while (pos < ps->size){if (strcmp(ps->data[pos].name, str) == 0){return pos;}pos++;}return -1;
}void ContactDel(Contact* ps)//删除联系人
{assert(ps);printf("请输入要删除的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("信息错误,列表无该联系人\n");return;}else{for (int i = ret; i < ps->size - 1; i++){ps->data[i] = ps->data[i + 1];}}ps->size--;return;
}

在这里插入图片描述

五、展示联系人ContactShow

光有删除和添加的操作,没有回显到屏幕上,鬼知道是删除成功了还是添加成功了,所以,要写一个打印函数,能看到,才知道是否成功。
展示是一个非常简单的操作,我们记录的有联系人的个数。一个循环即可搞定。

void ContactShow(Contact* ps)//展示联系人
{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < ps->size; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].tele,ps->data[i].address);}
}

在这里插入图片描述

六、查找联系人ContactFind

前面我们不是已经写出了一个通过姓名查找的函数吗?通过这个函数,我们就可以实现查找联系人的功能。

int FindByName(Contact* ps,const char *str)
{int pos = 0;while (pos < ps->size){if (strcmp(ps->data[pos].name, str) == 0){return pos;}pos++;}return -1;
}void ContactFind(Contact* ps)//查找联系人
{assert(ps);printf("请输入要查找的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("查无此人\n");return;}printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[ret].name,ps->data[ret].age,ps->data[ret].sex,ps->data[ret].tele,ps->data[ret].address);return ;
}

在这里插入图片描述

七、修改联系人ContactModify

修改联系人还得用到之前的查找函数,在找到联系人之后才能完成修改,找到联系人之后返回该联系人的下标,然后通过输入联系人的信息,把该位置的联系人覆盖掉即可。

int FindByName(Contact* ps,const char *str)
{int pos = 0;while (pos < ps->size){if (strcmp(ps->data[pos].name, str) == 0){return pos;}pos++;}return -1;
}void ContactModify(Contact* ps)//修改联系人
{assert(ps);printf("请输入要修改的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("查无此人,无法修改\n");return;}printf("请输入名字:>");scanf("%s", ps->data[ret].name);printf("请输入年龄:>");scanf("%d", &(ps->data[ret].age));printf("请输入性别:>");scanf("%s", ps->data[ret].sex);printf("请输入地址:>");scanf("%s", ps->data[ret].address);printf("请输入电话:>");scanf("%s", ps->data[ret].tele);printf("修改成功\n");return;
}

在这里插入图片描述
修改完成

八、给联系人排序ContactSort

排序联系人很简单,前面讲到过qsort函数,可以排序,还有快速排序,归并排序等排序,在这里用的是qsort函数并以姓名排序。

int CmpByName(const void* a,const void* b)
{return strcmp(((Contact*)a)->data->name, ((Contact*)b)->data->name);
}void ContactSort(Contact* ps)//给联系人排序
{assert(ps);qsort(ps->data[0].name, ps->size, sizeof ps->data[0], CmpByName);printf("排序成功\n");return;
}

未排序前
![在这里插入图片描述](https://img-blog.csdnimg.cn/b8650fc7f6f248ee9456e2b7cd0bd8c4.png

排序后
在这里插入图片描述

总结

.h文件

#include 
#include 
#include 
#include #define MAX_SIZE 1000
#define MAX_NAME 5
#define MAX_TELE 100
#define MAX_SEX 5
#define MAX_ADDRESS 50typedef struct Contact
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char address[MAX_ADDRESS];
}Cont;typedef struct C
{Cont data[MAX_SIZE];int size;
}Contact;void ContactInit(Contact* ps);//初始化void ContactAdd(Contact* ps);//添加联系人void ContactDel(Contact* ps);//删除联系人void ContactShow(Contact* ps);//展示联系人void ContactFind(Contact* ps);//查找联系人void ContactSort(Contact* ps);//给联系人排序void ContactModify(Contact* ps);//修改联系人

.c文件

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void ContactInit(Contact* ps)//初始化
{ps->size = 0;memset(ps->data, 0, sizeof ps->data);
}void ContactAdd(Contact* ps)//添加联系人
{assert(ps);if (ps->size == MAX_SIZE){printf("内存已满,无法添加\n");return;}//增加一个人的信息printf("请输入名字:>");scanf("%s", ps->data[ps->size].name);printf("请输入年龄:>");scanf("%d", &(ps->data[ps->size].age));printf("请输入性别:>");scanf("%s", ps->data[ps->size].sex);printf("请输入地址:>");scanf("%s", ps->data[ps->size].address);printf("请输入电话:>");scanf("%s", ps->data[ps->size].tele);ps->size++;
}int FindByName(Contact* ps,const char *str)
{int pos = 0;while (pos < ps->size){if (strcmp(ps->data[pos].name, str) == 0){return pos;}pos++;}return -1;
}void ContactFind(Contact* ps)//查找联系人
{assert(ps);printf("请输入要查找的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("查无此人\n");return;}printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[ret].name,ps->data[ret].age,ps->data[ret].sex,ps->data[ret].tele,ps->data[ret].address);return ;
}void ContactDel(Contact* ps)//删除联系人
{assert(ps);printf("请输入要删除的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("信息错误,列表无该联系人\n");return;}else{for (int i = ret; i < ps->size - 1; i++){ps->data[i] = ps->data[i + 1];}}ps->size--;return;
}void ContactShow(Contact* ps)//展示联系人
{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < ps->size; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].tele,ps->data[i].address);}
}int CmpByName(const void* a,const void* b)
{return strcmp(((Contact*)a)->data->name, ((Contact*)b)->data->name);
}
//return strcmp(((S*)a)->name, ((S*)b)->name);
void ContactSort(Contact* ps)//给联系人排序
{assert(ps);qsort(ps->data[0].name, ps->size, sizeof ps->data[0], CmpByName);printf("排序成功\n");return;
}void ContactModify(Contact* ps)//修改联系人
{assert(ps);printf("请输入要修改的联系人的姓名:");char na[MAX_NAME];scanf("%s", na);int ret = FindByName(ps, na);if (ret == -1){printf("查无此人,无法修改\n");return;}printf("请输入名字:>");scanf("%s", ps->data[ret].name);printf("请输入年龄:>");scanf("%d", &(ps->data[ret].age));printf("请输入性别:>");scanf("%s", ps->data[ret].sex);printf("请输入地址:>");scanf("%s", ps->data[ret].address);printf("请输入电话:>");scanf("%s", ps->data[ret].tele);printf("修改成功\n");return;
}

.c文件

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{printf("************************************\n");printf("******  1. 添加    2. 删除    ******\n");printf("******  3. 查找    4. 修改    ******\n");printf("******  5. 展示    6. 排序    ******\n");printf("******  7.退出                ******\n");printf("************************************\n");
}int main()
{int input = 0;Contact con;ContactInit(&con);do{menu();printf("请输入选项:");scanf("%d", &input);switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactFind(&con);break;case 4:ContactModify(&con);break;case 5:ContactShow(&con);break;case 6:ContactSort(&con);break;case 7:printf("退出\n");break;default:printf("输入错误,请重新出入\n");break;}} while (input != 7);return 0;
}

以上是通讯录的实现,希望对大家有所帮助。

相关内容

热门资讯

论坛一周年庆典晚会主持词 论坛一周年庆典晚会主持词  主持词是由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集...
最新研讨会主持词 最新研讨会主持词(通用11篇)  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在现在...
重阳节的主持词 重阳节的主持词  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在人们越来越多的参与各...
记者节活动主持词 记者节活动主持词(精选7篇)  主持词没有固定的格式,他的最大特点就是富有个性。在现今人们越来越重视...
高校运动会开幕式精彩致辞 高校运动会开幕式精彩致辞  在平平淡淡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有思...
幼儿园六一文艺演出主持词 幼儿园六一文艺演出主持词  20xx年六一文艺演出主持词  尊敬的各位领导、各位老师、亲爱的同学们:...
团拜会主持词 -主持词 团拜会主持词 -主持词大家下午好!腊梅催春至,瑞雪兆丰年!此时窗外虽然大雪纷飞、寒意袭人,但这里却热...
最新三八妇女节活动的主持词 最新三八妇女节活动的主持词(精选10篇)  主持词的写作需要将主题贯穿于所有节目之中。在现在的社会生...
小学师德报告会的主持词 小学师德报告会的主持词各位领导,各位老师:  大家下午好!采撷着金秋十月的累累硕果,收藏着金秋十月的...
《像小强一样儿活着》的经典台... 《像小强一样儿活着》的经典台词  《像小强一样活着》改编自同名网络小说,是难得的本土电影。曾有影评家...
汇演主持词 汇演主持词  主持词要根据活动对象的不同去设置不同的主持词。在人们积极参与各种活动的今天,主持人在各...
联欢会主持词结束语 联欢会主持词结束语(通用6篇)  晚会开得就是否成功圆满与主持人的讲话有很大关系。下面小编整理的联欢...
幼儿园毕业晚会主持词 幼儿园毕业晚会主持词  主持人在台上表演的灵魂就表现在主持词中。时代不断在进步,司仪等是很多场合都需...
美剧经典台词 美剧精选经典台词  在快速变化和不断变革的今天,能够利用到台词的场合越来越多,台词是一种特殊的,也是...
朗诵会主持词 关于朗诵会主持词4篇  主持词要根据活动对象的不同去设置不同的主持词。在当下这个社会中,很多场合都需...
记者节晚会主持词 记者节晚会主持词  主持词是主持人在台上表演的灵魂之所在。随着社会一步步向前发展,主持词的实用频率越...
婚礼父亲致辞 婚礼父亲致辞(精选15篇)  在平凡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有“礼...
校园红歌赛的主持词 校园红歌赛的主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在现今人们越来越重视活动氛...
开业主持词开场白 开业主持词开场白  根据活动对象的不同,需要设置不同的主持词。在当今社会生活中,活动集会越来越多,主...
关于唱歌比赛主持词   主持词是指主持人在主持节目的过程中进行节目串联的串联词,一般由开场白、中间部分与结束语组成。以下...