C语言实现通讯录
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人
0.退出通讯录
通讯录实现
前言
程序的实现需要进行分布进行,下面我们来一起进行通讯录的实现
把通讯录进行一步一步拆分,再进行代码的实现
正文开始
一、通讯录菜单的实现
程序与用户的交互,需要一个菜单来进行引导,所以我们第一步先实现菜单
需要把菜单的功能列举出来让用户可以进行下一步操作
void mean()//菜单的实现
{
printf("*****************************************************************\n");
printf("********* 1.add 2.del ***********\n");
printf("********* 3.seek 4.mod ***********\n");
printf("********* 5.show 6.empty ***********\n");
printf("********* 7.sort 0.exit ***********\n");
printf("*****************************************************************\n");
}
二、main函数实现
第二步我们对主函数进行实现
int main()
{
//初始化通讯录
ab content; //定义结构体变量content
Iniab(&content); //初始化通讯录,这里传参选择传地址过去
int input = 0;
do
{
mean();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录\n");
break;
case ADD:
addcontent(&content); //增加联系人函数
break;
case DEL:
delcontent(&content); //删除联系人函数
break;
case SEEK:
seekcontent(&content); //寻找联系人函数
break;
case MOD:
modcontent(&content); //修改联系人函数
break;
case SHOW:
showcontent(&content); //展示联系人函数
break;
case EMPTY:
emptycontent(&content); //清空联系人信息
break;
case SORT:
sortcontent(&content); //排序联系人信息
break;
}
} while (input);
return 0;
}
将所有需要实现的情况都放在main,方便自己可以逻辑清晰的编写代码
扫描二维码关注公众号,回复:
14495036 查看本文章

三、枚举选项
一开始我们就用数字来编辑了菜单的选项,在这里需要用到枚举来实现菜单的选项,与主函数中的case进行对应
enum mean
{
EXIT,//0
ADD,//1
DEL,//2
SEEK,//3
MOD,//4
SHOW,//5
EMPTY,//6
SORT//7
};
运用枚举是为了让代码逻辑更加简洁易懂,提高代码的可维护性
四、定义通讯录内容以及联系人内容
这里运用结构体来定义通讯录内容和联系人内容
typedef struct message
{
char name[MAN_NAME];
char sex[MAN_SEX];
int age;
char number[MAX_NUMBER];
char address[MAX_ADDRESS];
}meaaage;
typedef struct PEOINF
{
meaaage adta[MAX]; //定义数组来存储1000个人的信息
int sz; //定义变量来记录通讯录中有效信息个数
}ab;
五、对全局变量进行声明
我们需要对通讯录内的数据做一定的限制,这里需要对全局变量做一些声明
#define MAN_NAME 15 //定义名字数组中字符元素个数
#define MAN_SEX 5 //定义性别数组中字符元素个数
#define MAX_NUMBER 30 //定义号码数组中字符元素个数
#define MAX_ADDRESS 30 //定义地址数组中字符元素个数
#define MAX 1000 //定义数组中元素个数
六、通讯录功能的实现
我们已经拥有一个简易的通讯录了,现在需要对前文列举的功能进行一一实现
1.初始化通讯录
首先我们需要实现通讯录的保存功能,我们需要实现通讯录的初始化功能
//初始化通讯录函数
void Iniab(ab* content)
{
content->sz = 0;
memset(content->adta, 0, sizeof(content->adta));
return;
}
2.实现新增联系人(1.add)
//增加联系人函数
void addcontent(ab* content)
{
assert(content);
//在增加联系人之前要判断通讯录是否满了
if (content->sz == MAX) //通讯录满了
{
printf("通讯录满了\n");
return;
}
//通讯录没满
printf("请输入联系人姓名->");
scanf("%s", content->adta[content->sz].name);
printf("请输入联系人性别->");
scanf("%s",content->adta[content->sz].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[content->sz].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[content->sz].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[content->sz].address);
printf("增加联系人成功\n");
content->sz++;
return;
}
3.实现删除联系人(2.del)
//删除联系人函数
void delcontent(ab* content)
{
char name[MAN_NAME] = {
0};
assert(content);
printf("请输入要删除的联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//在删除联系人之前先判断是否有该要删除的联系人
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
int i = 0;
for (i = pos; i < content->sz; i++)
{
content->adta[i] = content->adta[i + 1];
}
content->sz--;
printf("删除指定联系人成功\n");
}
return;
}
4.实现查找联系人(3.seek)
4.1.编写一个查找函数
为了使代码的可读性更高,功能更加齐全,我们需要编写一个通过姓名可以查找的功能
//查找名字函数
int Findbyname(ab* content, char name[])
{
int i = 0;
for (i = 0; i < content->sz; i++)
{
if (strcmp(name, content->adta[i].name) == 0)
{
return i;
}
}
return -1;
}
4.2实现查找联系人
//查联系人信息函数
void information(ab* content, char name[])
{
printf("请输入联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//判断是否有该联系人
if (pos == -1)
{
printf("没有找到该联系人\n");
}
else
{
//查找到相应联系人,将联系人的信息展示出来
int i = pos;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
}
5.实现修改联系人(4.mod)
//修改联系人信息函数
void modcontent(ab* content)
{
assert(content);
char name[MAN_NAME] = {
0 };
printf("请输入要修改信息的联系人姓名->");
scanf("%s", name);
//int i
int pos = Findbyname(content, name); //查找名字函数
printf("请输入修改后的信息\n");
printf("请输入联系人姓名->");
scanf("%s", content->adta[pos].name);
printf("请输入联系人性别->");
scanf("%s", content->adta[pos].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[pos].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[pos].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[pos].address);
printf("修改信息联系人成功\n");
}
6.实现展示联系人(5.show)
//展示联系人函数
void showcontent(ab* content)
{
//姓名、性别、年龄、电话、住址
assert(content);
int i = 0;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-5s\t%-5d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
7.实现清空联系人(6.empty)
//清空联系人函数
void emptycontent(ab* content)
{
assert(content);
char input = 0;
printf("请确认是否要清空通讯录(Y/N)->");
while ((getchar()) != '\n')
{
;
}
if ((input = getchar()) == 'Y')
Iniab(content); //初始化函数——将通讯录全部初始化
return;
}
8.实现排序联系人信息(7.sort)
//排序联系人信息函数
void sortcontent(ab* content)
{
assert(content);
//用qsort函数快速实现排序
qsort(content->adta,content->sz,sizeof(content->adta[0]),int_cmp_name);
int i = 0;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
9.代码总览
到这里简易通讯录1.0已经全部完成了,下面就是程序的源代码
9.1 function.h
#define MAN_NAME 15 //定义名字数组中字符元素个数
#define MAN_SEX 5 //定义性别数组中字符元素个数
#define MAX_NUMBER 30 //定义号码数组中字符元素个数
#define MAX_ADDRESS 30 //定义地址数组中字符元素个数
#define MAX 1000 //定义数组中元素个数
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
typedef struct message
{
char name[MAN_NAME];
char sex[MAN_SEX];
int age;
char number[MAX_NUMBER];
char address[MAX_ADDRESS];
}meaaage;
typedef struct PEOINF
{
meaaage adta[MAX]; //定义数组来存储1000个人的信息
int sz; //定义变量来记录通讯录中有效信息个数
}ab;
//初始化通讯录
void Iniab(ab* content); //初始化通讯录函数声明
//增加联系人信息
void addcontent(ab* content); //增加联系人函数声明
//删除联系人信息
void delcontent(ab* content); //删除联系人函数声明
//寻找联系人信息
void seekcontent(ab* content); //寻找联系人函数声明
//修改联系人信息
void modcontent(ab* content); //修改联系人函数声明
//展示联系人信息
void showcontent(ab* content); //展示联系人函数声明
//清空联系人信息
void emptycontent(ab* content); //清空联系人函数声明
//排序联系人信息
void sortcontent(ab* content); //排序联系人信息函数声明
9.2 main.c
#include "function.h"
//实现通讯录:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//1.添加联系人信息
//2.删除指定联系人信息
//3.查找指定联系人信息
//4.修改指定联系人信息
//5.显示所有联系人信息
//6.清空所有联系人
//7.以名字排序所有联系人
enum mean
{
EXIT,//0
ADD,//1
DEL,//2
SEEK,//3
MOD,//4
SHOW,//5
EMPTY,//6
SORT//7
};
void mean()//菜单的实现
{
printf("*****************************************************************\n");
printf("********* 1.add 2.del ***********\n");
printf("********* 3.seek 4.mod ***********\n");
printf("********* 5.show 6.empty ***********\n");
printf("********* 7.sort 0.exit ***********\n");
printf("*****************************************************************\n");
}
int main()
{
//初始化通讯录
ab content; //定义结构体变量content
Iniab(&content); //初始化通讯录,这里传参选择传地址过去
int input = 0;
do
{
mean();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录\n");
break;
case ADD:
addcontent(&content); //增加联系人函数
break;
case DEL:
delcontent(&content); //删除联系人函数
break;
case SEEK:
seekcontent(&content); //寻找联系人函数
break;
case MOD:
modcontent(&content); //修改联系人函数
break;
case SHOW:
showcontent(&content); //展示联系人函数
break;
case EMPTY:
emptycontent(&content); //清空联系人信息
break;
case SORT:
sortcontent(&content); //排序联系人信息
break;
}
} while (input);
return 0;
}
9.3 function.c
#include "function.h"
//查找名字函数
int Findbyname(ab* content, char name[])
{
int i = 0;
for (i = 0; i < content->sz; i++)
{
if (strcmp(name, content->adta[i].name) == 0)
{
return i;
}
}
return -1;
}
//查联系人信息函数
void information(ab* content, char name[])
{
printf("请输入联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//判断是否有该联系人
if (pos == -1)
{
printf("没有找到该联系人\n");
}
else
{
//查找到相应联系人,将联系人的信息展示出来
int i = pos;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
}
int_cmp_name(const void* p1, const void* p2) //字符比较函数
{
return strcmp(((meaaage*)p1)->name, ((meaaage*)p2)->name);
}
//初始化通讯录函数
void Iniab(ab* content)
{
content->sz = 0;
memset(content->adta, 0, sizeof(content->adta));
return;
}
//增加联系人函数
void addcontent(ab* content)
{
assert(content);
//在增加联系人之前要判断通讯录是否满了
if (content->sz == MAX) //通讯录满了
{
printf("通讯录满了\n");
return;
}
//通讯录没满
printf("请输入联系人姓名->");
scanf("%s", content->adta[content->sz].name);
printf("请输入联系人性别->");
scanf("%s",content->adta[content->sz].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[content->sz].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[content->sz].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[content->sz].address);
printf("增加联系人成功\n");
content->sz++;
return;
}
//删除联系人函数
void delcontent(ab* content)
{
char name[MAN_NAME] = {
0};
assert(content);
printf("请输入要删除的联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//在删除联系人之前先判断是否有该要删除的联系人
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
int i = 0;
for (i = pos; i < content->sz; i++)
{
content->adta[i] = content->adta[i + 1];
}
content->sz--;
printf("删除指定联系人成功\n");
}
return;
}
//寻找联系人函数
void seekcontent(ab* content)
{
assert(content);
char name[MAN_NAME] = {
0 };
information(content, name); //查联系人信息函数
return;
}
//修改联系人信息函数
void modcontent(ab* content)
{
assert(content);
char name[MAN_NAME] = {
0 };
printf("请输入要修改信息的联系人姓名->");
scanf("%s", name);
//int i
int pos = Findbyname(content, name); //查找名字函数
printf("请输入修改后的信息\n");
printf("请输入联系人姓名->");
scanf("%s", content->adta[pos].name);
printf("请输入联系人性别->");
scanf("%s", content->adta[pos].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[pos].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[pos].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[pos].address);
printf("修改信息联系人成功\n");
}
//展示联系人函数
void showcontent(ab* content)
{
//姓名、性别、年龄、电话、住址
assert(content);
int i = 0;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
//清空联系人函数
void emptycontent(ab* content)
{
assert(content);
char input = 0;
printf("请确认是否要清空通讯录(Y/N)->");
while ((getchar()) != '\n')
{
;
}
if ((input = getchar()) == 'Y')
Iniab(content); //初始化函数——将通讯录全部初始化
return;
}
//排序联系人信息函数
void sortcontent(ab* content)
{
assert(content);
//用qsort函数快速实现排序
qsort(content->adta,content->sz,sizeof(content->adta[0]),int_cmp_name);
int i = 0;
printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
这是一个简易版本的通讯录,后期还会更新2.0版本的通讯录