通讯录的实现(详解)(后附完整源代码)
创始人
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");
}

在这里插入图片描述

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...