大家好我是小锋,今天我们来实现一个通讯录
准备工作
为了让我们的代码具有条理我们要建立三个文件一个文件用来放头文件一个文件用来放函数的实现,一个文件用来实现通讯录的基本逻辑。
然后我们其他的.c文件要使用头文件时我们要用# include<tongxunlu.h>包含;
接下来我们来讲讲基本逻辑,首先通讯录要完成的功能大致有哪些?
我们是不是要先建立一个界面让人选择这些功能?
选择上面功能我们就实现什么功能我们是不是要用到switch语句来实现,功能选择又不是只选一次,所以我们还要在外面嵌套循环,我们不论如何都要进行选择所以我们应该用do while循环。
这么看主体逻辑是不是有了?
我们的通讯录要存储联系人的各种信息,所以我们要创建一个结构体变量来存储这些信息
我们的通讯录要存储多少个人的信息我们不知道所以我们可以动态开辟内存当内存不够是我们可以开辟内存所以我们再创建一个通讯录结构体变量
接下来我们在main函数中就可以创建一个可以动态开辟内存的通讯录了
接下来我们肯定要初始化通讯录
接下来我们一一实现通讯录的功能
增加联系人
这里主要注意的是内存够不够,
我们写了一个函数来判断内存
显示联系人
这个很容易实现一个循环就搞定了
删除联系人
这里我们首先要判断删除的人存不存在,存在我们才进行删除。
这里删除我们就用后一块空间覆盖前一块空间并且删除之后存储的人变少了,我们记录人数的变量要减一。
修改联系人
与删除差不多先判断有没有这个人再进行修改。
查找联系人
这里我们发现有多个函数都要进行查找操作我们可以把这个功能分装成一个函数
排序联系人
最后的排序我们可以用qsort函数实现。
接下来我们还有退出函数还未实现,如果我们直接退出通讯录中的数据是不是销毁了,所以我们把通讯录的信息写入文件中,这样我们再次打开通讯录时,再从初始化中读取出来
最后我们再将动态开辟的内存销毁
这样一个通讯录就写成了。
源代码如下
tongxunlu.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<errno.h>
#define NAME 20
#define PHONE 13
#define WHTER 20
#define MAN 5
#define MAX 100
# define MRRL 3
# define MRKR 2
//联系人的信息
typedef struct people {
char mingzi[NAME];
int nianling;
char dianhua[PHONE];
char dizhi[WHTER];
char xingbie[MAN];
}people;
//静态通讯录
//typedef struct tongxunlu {
// people date[MAX];
// int yicun;
//}tongxunlu;
//动态通讯录
typedef struct tongxunlu {
people* date;
int yicun;//存储联系人个数
int RL;//容量
}tongxunlu;
//初始化通讯录
void chushihua(tongxunlu* lgf);
//增加联系人
void Zjia(tongxunlu* lgf);
//显示联系人
void Xshi(const tongxunlu* lgf);
//删除联系人
void Schu(tongxunlu* lgf);
//修改联系人
void Xgai(tongxunlu* lgf);
//查找联系人
void Czhao(const tongxunlu* lgf);
//排序联系人
void Pxu(tongxunlu* lgf);
//释放内存
void Sneicun(tongxunlu* lgf);
//文件保存
void wenjian(tongxunlu* lgf);
tongxunlu.c
# include"wenjian.h"
//扩容
void pand(tongxunlu* lgf) {
if (lgf->yicun == lgf->RL) {
printf("容量不足——扩容\n");
people* ps = (people*)realloc(lgf->date, (lgf->RL + MRKR) * sizeof(people));
if (ps == NULL) {
printf("扩容失败:%s\n", strerror(errno));
return;
}
lgf->date = ps;
lgf->RL += MRKR;
printf("扩容成功,当前容量为%d\n", lgf->RL);
}
}
//查找对象
int chazhao(tongxunlu* lgf, char* add) {
int i = 0;
for (i = 0; i < lgf->yicun; i++) {
int n = strcmp(lgf->date[i].mingzi, add);
if (n == 0) {
return i;
}
}
return -1;
}
//初始化通讯录
//void chushihua(tongxunlu* lgf) {
// lgf->yicun = 0;
// memset(lgf->date, 0, sizeof(lgf->date));
//}
//动态通讯录初始化
void chushihua(tongxunlu* lgf) {
lgf->date = (people*)malloc(MRRL * sizeof(people));
if (lgf->date == NULL) {
printf("开辟内存失败:%s\n", strerror(errno));
return;
}
memset(lgf->date, 0, MRRL * sizeof(people));
lgf->RL = MRRL;
lgf->yicun = 0;
//读取文件
//打开文件
FILE* pa = fopen("tongxunlu.txt", "rb");
if (pa == NULL) {
perror("fopen");
return ;
}
people mon;
//读文件
while (fread(&mon, sizeof(people), 1, pa)) {
pand(lgf);
lgf->date[lgf->yicun] = mon;
lgf->yicun++;
}
fclose(pa);
pa = NULL;
}
//静态版本
//增加联系人
//void Zjia(tongxunlu* lgf) {
// //判断通讯录是否满人
// if (lgf->yicun == 100) {
// printf("通讯录已满,无法添加\n");
// return;
// }
// //输入联系人
// printf("请输入名字\n");
// scanf("%s", &(lgf->date[lgf->yicun].mingzi));
// printf("请输入年龄\n");
// scanf("%d", &(lgf->date[lgf->yicun].nianling));
// printf("请输入电话\n");
// scanf("%s", &(lgf->date[lgf->yicun].dianhua));
// printf("请输入性别\n");
// scanf("%s", &(lgf->date[lgf->yicun].xingbie));
// printf("请输入地址\n");
// scanf("%s", &(lgf->date[lgf->yicun].dizhi));
// //
// lgf->yicun++;
// printf("添加成功\n");
//}
//动态开辟版本
void Zjia(tongxunlu* lgf) {
//判断通讯录是否满人
pand(lgf);
//输入联系人
printf("请输入名字\n");
scanf("%s", &(lgf->date[lgf->yicun].mingzi));
printf("请输入年龄\n");
scanf("%d", &(lgf->date[lgf->yicun].nianling));
printf("请输入电话\n");
scanf("%s", &(lgf->date[lgf->yicun].dianhua));
printf("请输入性别\n");
scanf("%s", &(lgf->date[lgf->yicun].xingbie));
printf("请输入地址\n");
scanf("%s", &(lgf->date[lgf->yicun].dizhi));
//
lgf->yicun++;
printf("添加成功\n");
}
//显示联系人
void Xshi(const tongxunlu* lgf) {
printf("%-10s %-5s %-10s %-5s %-10s\n", "名字", "年龄", "电话", "性别", "地址");
//输出联系人
for (int i = 0; i < lgf->yicun; i++) {
printf("%-10s %-5d %-10s %-5s %-10s\n",
lgf->date[i].mingzi,//名字
lgf->date[i].nianling,//年龄
lgf->date[i].dianhua,//电话
lgf->date[i].xingbie,//性别
lgf->date[i].dizhi);//地址
}
}
//删除联系人
void Schu(tongxunlu* lgf) {
//输入删除对象
char* add[MAX];
printf("请输入要删除人的名字\n");
scanf("%s", &add);
//查找删除对象
int n = chazhao(lgf, add);
if (n == -1) {
printf("你要删除的人不存在\n");
}
else {
for (int j = n; j < lgf->yicun - 1; j++) {
lgf->date[j] = lgf->date[j + 1];
}
lgf->yicun--;
printf("删除完成\n");
}
}
//修改联系人
void Xgai(tongxunlu* lgf) {
char add[MAX];
//输入修改对象名字
printf("输入修改对象名字\n");
scanf("%s", &add);
//查找对象
int n = chazhao(lgf, add);
if (n == -1) {
printf("修改对象不存在\n");
}
else {
//输入修改信息
printf("请输入名字\n");
scanf("%s", &(lgf->date[n].mingzi));
printf("请输入年龄\n");
scanf("%d", &(lgf->date[n].nianling));
printf("请输入电话\n");
scanf("%s", &(lgf->date[n].dianhua));
printf("请输入性别\n");
scanf("%s", &(lgf->date[n].xingbie));
printf("请输入地址\n");
scanf("%s", &(lgf->date[n].dizhi));
printf("修改成功\n");
}
}
//查找联系人
void Czhao(const tongxunlu* lgf) {
char* add[MAX];
//输入查找对象
printf("请输入查找对象名字\n");
scanf("%s", add);
int n = chazhao(lgf, add);
if (n == -1) {
printf("查找对象不存在\n");
}
else {
printf("%-10s %-5s %-10s %-5s %-10s\n", "名字", "年龄", "电话", "性别", "地址");
printf("%-10s %-5d %-10s %-5s %-10s\n",
lgf->date[n].mingzi,//名字
lgf->date[n].nianling,//年龄
lgf->date[n].dianhua,//电话
lgf->date[n].xingbie,//性别
lgf->date[n].dizhi);//地址
printf("查找完成\n");
}
}
//比较函数
int my_bijiao(const people* arr, const people* add) {
return strcmp(arr, add);
}
//排序联系人
void Pxu(tongxunlu* lgf) {
qsort(lgf->date, lgf->yicun, sizeof(lgf->date[0]), my_bijiao);
printf("排序完成\n");
Xshi(lgf);
}
//释放内存
void Sneicun(tongxunlu* lgf) {
free(lgf->date);
lgf->date = NULL;
lgf->RL = 0;
lgf->yicun = 0;
printf("释放内存\n");
}
//文件保存
void wenjian(tongxunlu* lgf) {
//打开文件
FILE* ps = fopen("tongxunlu.txt", "wb");
if (ps == NULL) {
perror("fopen");
return;
}
//写文件
fwrite(lgf->date, sizeof(people), lgf->yicun, ps);
//关闭文件
fclose(ps);
ps = NULL;
printf("保存成功\n");
}
test.c
# include "wenjian.h"
void fm() {
printf("————————————————————————\n");
printf("1,增加联系人\n");
printf("2,删除联系人\n");
printf("3,修改联系人\n");
printf("4,显示联系人\n");
printf("5,排序联系人\n");
printf("6,查找联系人\n");
printf("0,退出通讯录\n");
printf("————————————————————————\n");
}
enum add {
tuichu,
zhenjia,
sanchu,
xiugai,
xianshi,
paixu,
chazhao,
};
int main() {
int n = 0;
tongxunlu lgf;
//初始化通讯录
chushihua(&lgf);
do {
fm();
printf("请选择——》");
scanf_s("%d", &n);
switch (n) {
case zhenjia:
Zjia(&lgf);
break;
case sanchu:
Schu(&lgf);
break;
case xiugai:
Xgai(&lgf);
break;
case xianshi:
Xshi(&lgf);
break;
case paixu:
Pxu(&lgf);
break;
case chazhao:
Czhao(&lgf);
break;
case tuichu:
wenjian(&lgf);
Sneicun(&lgf);
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
}
} while (n);
return 0;
}
以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。