实现通讯录(C语言)
创始人
2024-05-12 13:38:25
0

功能实现

实现步骤:

创建通讯录

初始化通讯录

打印菜单

实现选择功能

实现添加功能 

实现删除功能

实现查找功能

实现修改功能

实现清空功能

实现排序功能

实现查询所有联系人信息功能

通讯录总代码

创建通讯录

1、创建成员信息结构体

我们用结构体来封装一个联系人的信息,信息包括:姓名、性别、年龄、电话号,而这个结构体成员也就要包含: 姓名、性别、年龄、电话号四种变量,姓名,性别,电话号 都用字符串封装,年龄,用整型封装

2、创建封装成员信息和个数的结构体

为了可以存放更多联系人,我们创建一个成员信息结构体数组,成员信息结构体数组,为了统计存入联系人的数量,我们创建一个整型变量,将结构体数组跟整型变量,封装在一个结构体中,以方便后续使用!,再创建一个结构体变量,以便后续通过变量访问通讯录

代码如下:

#define NAME_MAX 11
#define EAX_MAX 3
#define PHONE_MAX 12
#define MAX 1000//创建通讯录内容
typedef struct SS 
{char name[NAME_MAX];//名字char eax[EAX_MAX];//性别int age;//年龄char phone[PHONE_MAX];//电话
}SS;typedef struct contict 
{SS data[1000];//存放联系人信息int sz;//存放联系人的个数
}contict;//创建结构体变量
contict con;//通过变量后续访问通讯录

初始化通讯录

创建好通讯录之后

我们对它进行初始化操作,将其信息全部初始化为0,我们用一个函数来实现

代码如下:

//参数是结构体变量con的地址//初始化通讯录
void init_contict(contict* pc)
{assert(pc);//用memset函数初始化memset(pc->data, 0, sizeof(pc->data));pc->sz = 0;
}

打印菜单

创建一个简易菜单,供用户选择,用一个函数来封装菜单

代码如下:

//菜单
void nuem(void)
{printf("********************************\n");printf("****** 1、add    2、del   ******\n");printf("****** 3、sel    4、change *****\n");printf("****** 5、clear  6、sort   *****\n");printf("****** 7、show   0、exit   *****\n");printf("********************************\n");
}

实现选择功能

对于功能的选择,我们用do while里面嵌套switch来实现,选择里面的函数功能我们往下慢慢一一实现,具体看代码 一目了然

代码如下:

int main()
{int input = 0;do {//菜单nuem();printf("请选择-> ");scanf("%d", &input);switch (input){case 1:add_contict(&con);//添加信息break;case 2:del_contict(&con);//删除信息break;case 3:sel_contict(&con);//查询指定联系人信息break;case 4:change_contict(&con);//修改指定联系人信息break;case 5:clear_contict(&con);//清空联系人信息break;case 6:sort_contict(&con);//排序联系人信息break;case 7:show_contict(&con);//查询所有数据break;case 0:printf("退出成功\n");break;default:printf("选择项不存在,重新选择\n");break;}} while (input);return 0;
}

实现添加功能 

添加功能就是在通讯录里面添加联系人的信息,就是在我们所创建的结构体数组里面输入数据,每输入一个人的信息,我们都让整型变量sz +1,sz就是用来表示联系人的个数,同时sz也可以当做结构体数组的下标,我们用一个函数来实现添加功能

代码如下:

//添加一个联系人信息让sz++一次
//1、增加信息
void add_contict(contict* pc)
{assert(pc);printf("请输入姓名-> ");scanf("%s", pc->data[pc->sz].name);printf("请输入性别-> ");scanf("%s", pc->data[pc->sz].eax);printf("请输入年龄-> ");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话-> ");scanf("%s", pc->data[pc->sz].phone);pc->sz++;
}

实现删除功能

删除一个联系人的信息,要删除此联系人,我们得先找到该联系人的位置,给定字符数组,输入一个名字,然后遍历结构体数组,将输入的名字跟存入的所有联系人的名字进行比较,通过其名字,找到该联系人在结构体数组中的位置找到下标,然后从这个下标位置开始,让她后面的信息往前移动,并且让其元素个数sz-1,用一个函数来实现此功能

移动方法图解:

 

因为后续还会判断联系人是否存在,所以我们用一个函数来封装,判断该联系人名字是否存在于结构体数组中,这一功能!

代码如下:

//判断联系人是否存在
int ment(char* name,contict* pc)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;
}//2、删除信息
void del_contict(contict* pc)
{char name[NAME_MAX];printf("请输入要删除人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("联系人不存在\n");return;}//删除联系人int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}

实现查找功能

要查找指定联系人的信息,跟删除一样的原理,创建一个字符数组,输入一个名字,遍历结构体数组,判断该联系人是否存在,找到与输入名字相同名字的联系人,并将这个联系人的信息打印出来

代码如下:

//判断联系人是否存在
int ment(char* name,contict* pc)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;
}//3、查询指定联系人信息
void sel_contict(contict* pc) 
{assert(pc);char name[NAME_MAX];printf("请输入要查询人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("查无此人\n");return;}//查询联系人printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name,pc->data[pos].eax,pc->data[pos].age,pc->data[pos].phone);
}

实现修改功能

跟查找联系人的思路一样,创建一个字符数组,输入要修改联系人的名字,并遍历结构体数组,判断该名字的联系人是否存在,若存在 对该联系人的信息重新输入值,就修改成功

代码如下:

//判断联系人是否存在
int ment(char* name,contict* pc)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;
}//4、修改指定联系人信息
void change_contict(contict* pc) 
{assert(pc);char name[NAME_MAX];printf("请输入要查询人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("此人不存在\n");return;}//修改printf("请输入姓名-> ");scanf("%s", pc->data[pos].name);printf("请输入性别-> ");scanf("%s", pc->data[pos].eax);printf("请输入年龄-> ");scanf("%d", &(pc->data[pos].age));printf("请输入电话-> ");scanf("%s", pc->data[pos].phone);printf("修改成功\n");
}

实现清空功能

清空就是将所有的联系人信息都清空,其实将所有的联系人都清空,我们只要重新初始化一下封装联系人信息的数组跟记录联系人个数的整型变量就行了,我们上面已经创建了初始化函数,只要在调用一次这个函数就行,在清空函数内部调用初始化函数即可

代码如下:

//初始化通讯录
void init_contict(contict* pc)
{assert(pc);//用memset函数初始化memset(pc->data, 0, sizeof(pc->data));pc->sz = 0;
}//5、清空联系人信息
void clear_contict(contict* pc)
{assert(pc);init_contict(pc);printf("清空成功\n");
}

实现排序功能

要排序联系人的信息,其实本质上就是排序结构体,结构体可以按照他的成员变量来排序,我们在这给用户提供两种排序方式,1、用姓名排序,2、用年龄排序,可以升序,也可以降序,这个是你自己选择的,用姓名排序就是比较两个名字字符串的大小,用年龄排序就是比较两个整型数的大小,这里的排序,我们使用 qsort函数来排序,(注:若是看不懂这一块,点我主页,指针进阶文章里面有目录,有详细的qsort函数的介绍),用一个函数来封装排序功能

代码如下:


//按照姓名排序
int con_name(void* e1, void* e2)
{//升序排序return strcmp(((contict*)e1)->data->name , ((contict*)e2)->data->name);//降序排序//return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name);
}//按照年龄排序
int con_age(void* e1, void* e2)
{//升序排序return ((contict*)e1)->data->age - ((contict*)e2)->data->age;//降序排序//return ((contict*)e2)->data->age - ((contict*)e1)->data->age;}//6、排序联系人信息
void sort_contict(contict* pc)
{int n = 0;do {printf("*************************\n");printf("***** 1、按姓名排序  ****\n");printf("***** 2、按年龄排序  ****\n");printf("***** 0、退出不排序  ****\n");printf("*************************\n");printf("请选择排序方式->  ");scanf("%d", &n);switch (n){case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);printf("按照姓名排序成功\n");goto name;break;case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age);printf("按照年龄排序成功\n");goto age;break;case 0:printf("退出成功\n");break;default:printf("选择排序方式不存在,重新选择\n");break;}} while (n);
name:return;
age:return;
}

实现查询所有联系人信息功能

查询所有联系人,就是将结构体数组里面存放的所有联系人的信息打印出来,至于具体有多少位联系人信息,其实就是sz位,一开始我们就用sz来记录联系人的个数,遍历这个结构体数组将每个元素的值都打印出来即可,我们用函数封装这一功能

代码如下:


//7、查询所有信息
void show_contict(contict* pc) 
{if (pc->sz == 0){printf("联系人列表为空\n");return;}printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name,pc->data[i].eax,pc->data[i].age,pc->data[i].phone);}
}

通讯录总代码

一个简易版通讯录总代码实现:

#include 
#include 
#include 
#include #define NAME_MAX 11
#define EAX_MAX 3
#define PHONE_MAX 12
#define MAX 1000//创建通讯录内容
typedef struct SS
{char name[NAME_MAX];//名字char eax[EAX_MAX];//性别int age;//年龄char phone[PHONE_MAX];//电话
}SS;typedef struct contict
{SS data[1000];//存放联系人信息int sz;//存放联系人的个数
}contict;//创建结构体变量
contict con;//通过变量后续访问通讯录//菜单
void nuem(void)
{printf("********************************\n");printf("****** 1、add    2、del   ******\n");printf("****** 3、sel    4、change *****\n");printf("****** 5、clear  6、sort   *****\n");printf("****** 7、show   0、exit   *****\n");printf("********************************\n");
}//初始化通讯录
void init_contict(contict* pc)
{assert(pc);//用memset函数初始化memset(pc->data, 0, sizeof(pc->data));pc->sz = 0;
}//判断联系人是否存在
int ment(char* name, contict* pc)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;
}//1、增加信息
void add_contict(contict* pc)
{assert(pc);printf("请输入姓名-> ");scanf("%s", pc->data[pc->sz].name);printf("请输入性别-> ");scanf("%s", pc->data[pc->sz].eax);printf("请输入年龄-> ");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话-> ");scanf("%s", pc->data[pc->sz].phone);pc->sz++;
}//2、删除信息
void del_contict(contict* pc)
{char name[NAME_MAX];printf("请输入要删除人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("联系人不存在\n");return;}//删除联系人int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}//3、查询指定联系人信息
void sel_contict(contict* pc)
{assert(pc);char name[NAME_MAX];printf("请输入要查询人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("查无此人\n");return;}//查询联系人printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name,pc->data[pos].eax,pc->data[pos].age,pc->data[pos].phone);
}//4、修改指定联系人信息
void change_contict(contict* pc)
{assert(pc);char name[NAME_MAX];printf("请输入要修改人的姓名-> ");scanf("%s", name);//判断联系人是否存在int pos = ment(name, pc);if (pos == -1){printf("此人不存在\n");return;}//修改printf("请输入姓名-> ");scanf("%s", pc->data[pos].name);printf("请输入性别-> ");scanf("%s", pc->data[pos].eax);printf("请输入年龄-> ");scanf("%d", &(pc->data[pos].age));printf("请输入电话-> ");scanf("%s", pc->data[pos].phone);printf("修改成功\n");
}//5、清空联系人信息
void clear_contict(contict* pc)
{assert(pc);init_contict(pc);printf("清空成功\n");
}//按照姓名排序
int con_name(void* e1, void* e2)
{//升序排序return strcmp(((contict*)e1)->data->name, ((contict*)e2)->data->name);//降序排序//return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name);
}//按照年龄排序
int con_age(void* e1, void* e2)
{//升序排序return ((contict*)e1)->data->age - ((contict*)e2)->data->age;//降序排序//return ((contict*)e2)->data->age - ((contict*)e1)->data->age;}//6、排序联系人信息
void sort_contict(contict* pc)
{int n = 0;do {printf("*************************\n");printf("***** 1、按姓名排序  ****\n");printf("***** 2、按年龄排序  ****\n");printf("***** 0、退出不排序  ****\n");printf("*************************\n");printf("请选择排序方式->  ");scanf("%d", &n);switch (n){case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);printf("按照姓名排序成功\n");goto name;break;case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age);printf("按照年龄排序成功\n");goto age;break;case 0:printf("退出成功\n");break;default:printf("选择排序方式不存在,重新选择\n");break;}} while (n);
name:return;
age:return;
}//7、查询所有信息
void show_contict(contict* pc)
{if (pc->sz == 0){printf("联系人列表为空\n");return;}printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name,pc->data[i].eax,pc->data[i].age,pc->data[i].phone);}
}void test_contict(void)
{//初始化通讯录init_contict(&con);int input = 0;do{//菜单nuem();printf("请选择-> ");scanf("%d", &input);switch (input){case 1:add_contict(&con);//添加信息break;case 2:del_contict(&con);//删除信息break;case 3:sel_contict(&con);//查询指定联系人信息break;case 4:change_contict(&con);//修改指定联系人信息break;case 5:clear_contict(&con);//清空联系人信息break;case 6:sort_contict(&con);//排序联系人信息break;case 7:show_contict(&con);//查询所有数据break;case 0:printf("退出成功\n");break;default:printf("选择项不存在,重新选择\n");break;}} while (input);
}int main()
{//测试通讯录test_contict();return 0;
}

 

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  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 ...