本篇博客将为大家带来通讯录的实现!!!
目录
通讯录的基本介绍:
通讯录的实现过程:
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用于实现接口的声明
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));
}
注:实现过程都是在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个联系人,万一少于联系人,这个就浪费了很多的空间
所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。