通讯录的实现(详解)(后附完整源代码)
创始人
2024-05-10 18:36:24
0

通讯录的实现

  • 一.所需要的功能
  • 二.大致菜单
  • 三.创建通讯录
  • 四.增加联系人
  • 五.显示联系人
  • 六.查找联系人
  • 七.删除联系人
  • 八.修改联系人
  • 九.按名字排序

在这里插入图片描述

一.所需要的功能

对于通讯录来说,我们需要它实现以下几个功能。

1.人的信息:姓名+年龄+性别+电话+地址。
2.可以存放100个人的信息。
功能:
1>增加联系人。
2>删除联系人。
3>查找指定联系人信息。
4>修改指定联系人信息。
5>显示所有联系人信息。

接下来分为三个模块,test.c->用来测试通讯录;contact.c->通讯录主体部分;contact.h->用于函数的声明。

二.大致菜单

#include"contact.h"void menu()
{printf("********************************\n");printf("****** 1.增加      2.删除 ******\n");printf("****** 3.查找      4.修改 ******\n");printf("****** 5.展示      6.排序 ******\n");printf("*******0.退出             ******\n");printf("********************************\n");}
int main()
{int input = 0;do{menu();scanf("%d", &input);switch (input){case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;	case 0:printf("退出通讯录。\n");break;default:printf("输入无效,请重新输入。\n");break;}} while (input);return 0;
}

这一块很简单,就不再多说。菜单是属于测试部分,所以我将它放入test.c文件里。

三.创建通讯录

对于一个人,肯定有多方面的因数,所以将其封装在一个结构体内。这里使用到typedef,如果不太熟悉可以看看这篇博客typedef的使用

在这里插入图片描述

接下来,再封装一个结构体里面存放100个人的信息和当前人的个数。

在这里插入图片描述

接着在主函数里使用该结构体创建通讯录。然后进行初始化。

在这里插入图片描述

初始化函数在contact.h里声明。

在这里插入图片描述

在contact.c里实现,需要使用到memset,如果不太明白可以看看这篇博客memset如何使用

在这里插入图片描述

四.增加联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里面实现。
在这里插入图片描述

五.显示联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。这里使用到\t,向后隔开8个字节,用于分隔。同时例如%-20s是右边隔开20个字节,也就是进行左对齐。

在这里插入图片描述

在这里插入图片描述

六.查找联系人

我们发现无论是查找,删除还是修改都需要先找到这个人。所以我们干脆将寻找封装成一个函数来使用。我们通过名字来查找(需要使用strcmp,如果不熟悉可以看看这篇博客strcmp的使用)

在这里插入图片描述

完成后正式进行查找。

在这里插入图片描述

老规矩,现在contact.h里进行声明。ps:前面的find不用声明是因为find只在contact.c里使用。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

七.删除联系人

这里采用一种最简单的方法,就是从后往前依次覆盖。首先找到该名字的位置,然后依次将后面的往前挪。

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

八.修改联系人

在这里插入图片描述

老规矩在contact.h里进行声明。

在这里插入图片描述

在contact.c里实现。修改其实就是重新录入,找到位置,重新写一遍就好了。

在这里插入图片描述

九.按名字排序

下面排序需要使用到qsort函数。如果不太熟悉可以看看这篇博客qsort函数

在这里插入图片描述

老规矩在contact.h里声明。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

好了,以上就是通讯录的实现功能啦,下面是源代码。

test.c

#include"contact.h"
void menu()
{printf("********************************\n");printf("****** 1.增加      2.删除 ******\n");printf("****** 3.查找      4.修改 ******\n");printf("****** 5.展示      6.排序 ******\n");printf("*******0.退出             ******\n");printf("********************************\n");}
int main()
{int input = 0;//创建通讯录Contact con;//该结构体包含100个人的信息和已填充人的个数//初始化通讯录InitContact(&con);//结构体传参do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:Dlete(&con);break;case 3:Search(&con);break;case 4:Modify(&con);break;case 5:ShowContact(&con);break;case 6:Order(&con);break;case 0:printf("退出通讯录。\n");break;default:printf("输入无效,请重新输入。\n");break;}} while (input);return 0;
}

contact.h

#include
#include
#include//人的信息
typedef struct PeoInfo
{char name[20];int age;char sex[5];char addr[30];char tele[12];
}PeoInfo;typedef struct Contact
{PeoInfo data[100];//存放人的信息int sz;//当前已经放的信息个数
}Contact;//同理,这里也进行了重命名//声明初始化函数
void InitContact(Contact* pc);//声明增加联系人函数
void AddContact(Contact*pc);//声明显示联系人函数
void ShowContact(const Contact*pc);//声明查找函数
void Search(const Contact*pc);//查找依然不会改变,所以加上const//声明删除函数
void Dlete(Contact*pc);//声明修改函数
void Modify(Contact*pc);//声明排序函数
void Order(Contact*pc);

contact.c

#include"contact.h"//初始化函数的实现
void InitContact(Contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}//增加联系人
void AddContact(Contact* pc)
{assert(pc);//一个好的习惯判断是否为空指针(当然不加也没影响)if (pc->sz == 100){printf("通讯录已满,无法添加。\n");return;}//开始添加信息printf("请输入名字:");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[pc->sz].sex);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);printf("请输入电话:");scanf("%s", pc->data[pc->sz].tele);pc->sz++;//别忘了添加完一个人后向后走一步}//显示联系人
void ShowContact(const Contact* pc)//因为显示不会改变元素,所以最好加上const
{assert(pc);printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");//提示for (int i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}//找到特定联系人的位置
int FindByName(const Contact* pc, char name[])//两个参数,一个是通讯录里存的名字,一个是你要查找的名字
{for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;//找到返回下标}}return -1;//没找到,返回-1
}//查找
void Search(const Contact* pc)
{assert(pc);char name[20] = { 0 };printf("请输入要查找的名字:");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("查无此人。\n");return;}//找到了,打印信息printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);
}//删除
void Dlete(Contact* pc)
{assert(pc);char name[20] = { 0 };printf("请输入要删除的名字:");scanf("%s", name);int dle = FindByName(pc, name);//找到位置if (dle == -1){printf("查无此人。\n");return;}for (int i = dle; i < pc->sz-1; i++)//从后往前覆盖,同时-1避免越界{pc->data[i] = pc->data[i + 1];}pc->sz--;//删除完成后别忘了个数-1printf("删除成功\n");
}//修改
void Modify(Contact* pc)
{assert(pc);char name[20] = { 0 };printf("请输入要修改的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (-1 == ret){printf("查无此人\n");return;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[ret].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("修改成功\n");
}//排序
int cmp(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Order(Contact* pc)
{assert(pc);qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp);printf("排序成功\n");
}

在这里插入图片描述

相关内容

热门资讯

晋祠导游词 晋祠导游词  作为一名专门为游客提供帮助的导游,通常需要准备好一份导游词,导游词具有极强的实用性,涉...
昆明大观楼导游词 昆明大观楼导游词  作为一名专门为游客提供帮助的导游,常常要写一份好的导游词,导游词是导游员在游览时...
许昌西湖公园的导游词 许昌西湖公园的导游词  今天,我带领大家来游览位于许昌市中心的西湖公园,希望我们能一起渡过一段快乐的...
刘公岛导游词 刘公岛导游词范文(精选5篇)  作为一名乐于助人的导游,总归要编写导游词,导游词是导游员同游客交流思...
九龙洞风景区导游词贵州导游词 九龙洞风景区导游词贵州导游词  作为一名默默奉献的导游,时常需要编写导游词,导游词一般是根据实际的游...
云南澜沧江导游词 云南澜沧江导游词  澜沧江是湄公河上游在中国境内河段的名称,藏语拉楚,意思为“獐子河”。它也是中国西...
新疆概况旅游导游词 新疆概况旅游导游词范文(精选3篇)  作为一名尽职尽责的导游,有必要进行细致的导游词准备工作,借助导...
颐和园的导游词资料 关于颐和园的导游词资料  导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客...
北京导游词 北京导游词(合集15篇)  作为一名优秀的旅游从业人员,时常要开展导游词准备工作,一篇完整的导游词,...
泰山景点介绍导游词 泰山景点介绍导游词(通用5篇)  作为一位不辞辛劳的导游,通常需要准备好一份导游词,导游词可以加深游...
校园导游词 校园导游词  作为一名专门引导游客、助人为乐的导游,就难以避免地要准备导游词,导游词一般是根据实际的...
韩国景点导游词 韩国景点导游词  大家好!  首先,欢迎大家到韩国首尔来旅游,下面就由我给大家介绍一下这个具有东方神...
介绍洛阳的导游词 介绍洛阳的导游词  洛阳位于河南,在那里有许多的特色文化,那么关于介绍洛阳的导游词都有哪些呢?下面是...
桂林聚龙潭导游词 桂林聚龙潭导游词  作为一位无私奉献的导游,时常需要用到导游词,导游词不是以一代百、千篇一律的,它必...
炳灵寺石窟导游词 炳灵寺石窟导游词  作为一名尽职尽责的导游,常常要根据讲解需要编写导游词,导游词是导游人员引导游客观...
西安大雁塔导游词 西安大雁塔导游词500字  游客朋友们:  大家好!  欢迎大家到西安大雁塔观光旅游!  大雁塔位于...
马鞍山森林公园讲解词 马鞍山森林公园讲解词  森林公园的导游词篇一:马鞍山森林公园导游词  大家好!欢迎来到马鞍山森林公园...
武汉导游词 武汉导游词范文(精选8篇)  作为一无名无私奉献的导游,时常需要用到导游词,导游词是导游员进行实地口...
大慈岩导游词 大慈岩导游词五篇  篇一:大慈岩导游词  大慈岩概况 在前面大家可以往右看一下。我们会看到在山腰上有...
五爷庙和杨五郎的关系导游词 五爷庙和杨五郎的关系导游词  一提起五台山,就知道它是五台山香火最旺,许愿最灵的寺庙。万佛阁是五爷庙...