本篇博客将为大家带来通讯录的实现!!!
目录
记录一个人的基本信息,并且需要它可以实现增删查改等功能;
可以保存100个人的信息 人的信息:
1.添加联系人信息; 名字
2.删除联系人信息; 年龄
3.查找联系人信息; 性别
4.修改联系人信息; 电话
5.显示联系人信息; 地址
6.排序联系人信息;
0.退出程序
建议:实现之前我们可以分成三个模块
test.c用于专门测试通讯录功能
contact.c用于实现通讯录具体功能
contact.h用于实现接口的声明
- 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");
-
- }
- #include
- 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");
-
- }
- enum
- {
- EXIT,
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SHOW,
- SORT
- };
- int main()
- {
- int input = 0;
- do
- {
- menu();
- printf("请输入:>");
- scanf("%d", &input);
- switch (input)
- {
- case ADD:
- break;
- case DEL:
- break;
- case SEARCH:
- break;
- case MODIFY:
- break;
- case SHOW:
- break;
- case SORT:
- break;
- case EXIT:
- printf("退出通讯录\n");
- break;
- default:
- printf("选择错误,请重新选择\n");
- break;
- }
- } while (input);
- return 0;
- }
- #define NAME_MAX 20
- #define SEX_MAX 5
- #define TELE_MAX 12
- #define ADDR_MAX 30
-
-
-
- //定义人的信息
- typedef struct PeoInfo
- {
- char name[NAME_MAX];
- int age;
- char sex[SEX_MAX];
- char tele[TELE_MAX];
- char addr[ADDR_MAX];
- }PeoInfo;
- #define MAX 100
- typedef struct Contact
- {
- PeoInfo data[MAX];//存放数据
- int sz;//记录的时当前通讯录中存放的人的信息个数
- }Contact;
通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化
- void InitContact(Contact* con)
- {
- assert(con);
- con->sz = 0;
- memset(con->data, 0, sizeof(con->data));
-
- }
现在已经全部初始化为0 如果不初始化将会是随机值
注:实现过程都是在contact.c中的文件实现
- void ADDContact(Contact* con)
- {
- assert(con);
- //判断一下通讯录是否满了
- if (con->sz == MAX)
- {
- printf("通讯录已满,无法添加\n");
- return ;
- }
- printf("请输入联系人名字\n");
- scanf("%s", con->data->name);
- printf("请输入联系人年龄\n");
- scanf("%d", &(con->data->age));
- printf("请输入联系人性别\n");
- scanf("%s", con->data->sex);
- printf("请输入联系人电话\n");
- scanf("%s", con->data->tele);
- printf("请输入联系人地址\n");
- scanf("%s", con->data->addr);
-
- con->sz++;
- printf("添加完成\n");
-
- }
既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么
- void SHOWContact(Contact* con)
- {
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录无内容\n");
- return;
- }
- printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
- int i;
- for (i = 0; i < con->sz; i++)
- {
- printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,
- con->data[i].age,
- con->data[i].sex,
- con->data[i].tele,
- con->data[i].addr);
- }
-
- }
- int Fing_by_name(Contact* con, char* name)
- {
- assert(con);
- int i;
- for (i = 0; i < con->sz; i++)
- {
- if (strcmp(con->data[i].name, name) == 0)
- {
- return i;
-
- }
- }
- return -1;
- }
-
- void DELContact(Contact* con)
- {
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法删除\n");
- return ;
- }
- printf("请输入你想删除联系人的名字:\n");
- scanf("%s", name);
- // 查找通讯录里有没有该名字
- int ret=Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要删除的人不存在\n");
- return ;
- }
- //否则返回他的下标
- //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
- int i;
- for (i = ret; i < con->sz - 1; i++)
- {
- con->data[i] = con->data[i + 1];
- }
- con->sz--;
- printf("删除成功\n");
- }
不懂的可以看里面的注释,这个先要写一个查找函数,在删除
- void SEARCHContact(Contact* con)
- {
-
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法查找\n");
- return;
- }
- printf("请输入你想查找联系人的名字:\n");
- scanf("%s", name);
- int ret = Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
- con->data[ret].age,
- con->data[ret].sex,
- con->data[ret].tele,
- con->data[ret].addr);
- }
思路很简单了 ,先查找出来 再打印出来
- void MODIFYContact(Contact* con)
- {
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法修改\n");
- return;
- }
- printf("请输入你想修改联系人的名字:\n");
- scanf("%s", name);
- int ret = Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要修改的人不存在\n");
- return;
- }
- printf("请输入联系人名字:");
- scanf("%s", con->data[ret].name);
- printf("请输入联系人年龄:");
- scanf("%d", &(con->data[ret].age));
- printf("请输入联系人性别:");
- scanf("%s", con->data[ret].sex);
- printf("请输入联系人电话:");
- scanf("%s", con->data[ret].tele);
- printf("请输入联系人地址:");
- scanf("%s", con->data[ret].addr);
- printf("修改完成\n");
- }
先查找到改信息 在重新输入
- int cmp_by_name(const void* e1, const void* e2)
- {
- return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);
- }
- void SORTContact(Contact* con)
- {
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法排序\n");
- return;
- }
- qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
- printf("排序完成\n");
- }
这里要运用的qosrt函数,不会的可以看我之前的文章有介绍,很好实现的
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include
- #include "contact.h"
- 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");
-
- }
- enum
- {
- EXIT,
- ADD,
- DEL,
- SEARCH,
- MODIFY,
- SHOW,
- SORT
- };
- int main()
- {
- int input = 0;
-
- //创建通讯录
- Contact con;
- //初始化通讯录
- 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:
- SORTContact(&con);
- break;
- case EXIT:
- printf("退出通讯录\n");
- break;
- default:
- printf("选择错误,请重新选择\n");
- break;
- }
- } while (input);
- return 0;
- }
- #include "contact.h"
- void InitContact(Contact* con)
- {
- assert(con);
- con->sz = 0;
- memset(con->data, 0, sizeof(con->data));
-
- }
-
-
- void ADDContact(Contact* con)
- {
- assert(con);
- //判断一下通讯录是否满了
- if (con->sz == MAX)
- {
- printf("通讯录已满,无法添加\n");
- return ;
- }
- printf("请输入联系人名字:");
- scanf("%s", con->data[con->sz].name);
- printf("请输入联系人年龄:");
- scanf("%d", &(con->data[con->sz].age));
- printf("请输入联系人性别:");
- scanf("%s", con->data[con->sz].sex);
- printf("请输入联系人电话:");
- scanf("%s", con->data[con->sz].tele);
- printf("请输入联系人地址:");
- scanf("%s", con->data[con->sz].addr);
-
- con->sz++;
- printf("添加完成\n");
-
- }
-
-
-
- void SHOWContact(Contact* con)
- {
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录无内容\n");
- return;
- }
- printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
- int i;
- for (i = 0; i < con->sz; i++)
- {
- printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name,
- con->data[i].age,
- con->data[i].sex,
- con->data[i].tele,
- con->data[i].addr);
- }
-
- }
-
- int Fing_by_name(Contact* con, char* name)
- {
- assert(con);
- int i;
- for (i = 0; i < con->sz; i++)
- {
- if (strcmp(con->data[i].name, name) == 0)
- {
- return i;
-
- }
- }
- return -1;
- }
-
- void DELContact(Contact* con)
- {
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法删除\n");
- return ;
- }
- printf("请输入你想删除联系人的名字:\n");
- scanf("%s", name);
- // 查找通讯录里有没有该名字
- int ret=Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要删除的人不存在\n");
- return ;
- }
- //否则返回他的下标
- //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
- int i;
- for (i = ret; i < con->sz - 1; i++)
- {
- con->data[i] = con->data[i + 1];
- }
- con->sz--;
- printf("删除成功\n");
- }
-
-
-
- void SEARCHContact(Contact* con)
- {
-
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法查找\n");
- return;
- }
- printf("请输入你想查找联系人的名字:\n");
- scanf("%s", name);
- int ret = Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要查找的人不存在\n");
- return;
- }
- printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
- con->data[ret].age,
- con->data[ret].sex,
- con->data[ret].tele,
- con->data[ret].addr);
- printf("查找完成");
- }
-
-
-
- void MODIFYContact(Contact* con)
- {
- char name[NAME_MAX];
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法修改\n");
- return;
- }
- printf("请输入你想修改联系人的名字:\n");
- scanf("%s", name);
- int ret = Fing_by_name(con, name);
- if (ret == -1)
- {
- printf("要修改的人不存在\n");
- return;
- }
- printf("请输入联系人名字:");
- scanf("%s", con->data[ret].name);
- printf("请输入联系人年龄:");
- scanf("%d", &(con->data[ret].age));
- printf("请输入联系人性别:");
- scanf("%s", con->data[ret].sex);
- printf("请输入联系人电话:");
- scanf("%s", con->data[ret].tele);
- printf("请输入联系人地址:");
- scanf("%s", con->data[ret].addr);
- printf("修改完成\n");
- }
-
- int cmp_by_name(const void* e1, const void* e2)
- {
- return strcmp( ((PeoInfo*)e1)->name , ((PeoInfo*)e2)->name);
- }
- void SORTContact(Contact* con)
- {
- assert(con);
- if (con->sz == 0)
- {
- printf("通讯录为空,无法排序\n");
- return;
- }
- qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
- printf("排序完成\n");
- }
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- #include
- #include
-
- #define NAME_MAX 20
- #define SEX_MAX 5
- #define TELE_MAX 12
- #define ADDR_MAX 30
- #define MAX 100
-
-
-
- //定义人的信息
- typedef struct PeoInfo
- {
- char name[NAME_MAX];
- int age;
- char sex[SEX_MAX];
- char tele[TELE_MAX];
- char addr[ADDR_MAX];
- }PeoInfo;
-
- typedef struct Contact
- {
- PeoInfo data[MAX];//存放数据
- int sz;//记录的时当前通讯录中存放的人的信息个数
- }Contact;
-
-
- //初始化通讯录
- void InitContact(Contact* con);
-
- //添加联系人的信息
- void ADDContact(Contact* con);
-
- //显示通讯录的信息
- void SHOWContact(Contact* con);
-
-
- //删除联系人的信息
- void DELContact(Contact* con);
-
-
- //查找联系人的信息
- void SEARCHContact(Contact* con);
-
-
- //修改联系人的信息
- void MODIFYContact(Contact* con);
-
-
- //排序联系人的信息-按名字
- void SORTContact(Contact* con);
首先非常感谢大家的观看,这只是一个初步的通讯录,它还可以进阶实现
这个通讯录还存在很多缺陷:
1.它不能保存完成,一旦退出就消失了
2.它至少固定的大小,我们只开创了100个联系人,万一少于联系人,这个就浪费了很多的空间
所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。