本篇博客将为大家带来通讯录的实现!!!
目录
通讯录的基本介绍:
通讯录的实现过程:
1.设计通讯录的目录
2.基础菜单的实现:
3.定义人的信息
4.定义通讯录的信息
5.创建通讯录并且初始化
6.添加联系人的信息
7.显示通讯录的信息
8.删除联系人的信息
9.查找联系人的信息
10.修改联系人的信息
11.排序联系人的信息—按名字排序
完整代码展现:
test.c:
contact.c:
contact.h:
结语:
通讯录的基本介绍:
记录一个人的基本信息,并且需要它可以实现增删查改等功能;
可以保存100个人的信息 人的信息:
1.添加联系人信息; 名字
2.删除联系人信息; 年龄
3.查找联系人信息; 性别
4.修改联系人信息; 电话
5.显示联系人信息; 地址
6.排序联系人信息;
0.退出程序
通讯录的实现过程:
建议:实现之前我们可以分成三个模块
test.c用于专门测试通讯录功能
contact.c用于实现通讯录具体功能
contact.h用于实现接口的声明
1.设计通讯录的目录
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");}
2.基础菜单的实现:
#include <stdio.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;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;
}
3.定义人的信息
#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;
4.定义通讯录的信息
#define MAX 100
typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录的时当前通讯录中存放的人的信息个数
}Contact;
5.创建通讯录并且初始化
通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化
void InitContact(Contact* con)
{assert(con);con->sz = 0;memset(con->data, 0, sizeof(con->data));}
现在已经全部初始化为0 如果不初始化将会是随机值
注:实现过程都是在contact.c中的文件实现
6.添加联系人的信息
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");}
7.显示通讯录的信息
既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么
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);}}
8.删除联系人的信息
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");
}
不懂的可以看里面的注释,这个先要写一个查找函数,在删除
9.查找联系人的信息
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);
}
思路很简单了 ,先查找出来 再打印出来
10.修改联系人的信息
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");
}
先查找到改信息 在重新输入
11.排序联系人的信息—按名字排序
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函数,不会的可以看我之前的文章有介绍,很好实现的
完整代码展现:
test.c:
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#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;
}
contact.c:
#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");
}
contact.h:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>#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个联系人,万一少于联系人,这个就浪费了很多的空间
所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。