首先我们需要知道通讯录里应该包含哪些信息呢?姓名,年龄,性别,地址,联系方式等等。我们要想存放这些信息就需要一个结构体来存放不同类型的数据。什么?你还不知道结构体?那么就先来看看这篇文章吧。我的结构体分享
struct PeoInfo { char name[20]; int age; char sex[5]; char addr[20]; char tel[12] };
我们这里给定数组的大小对以后的修改不是很方便,并且这个结构体类型写起来也比较长,代码看起来很冗余,所以我们可以重定义一下。
#define MAX_NAME 20 #define MAX_SEX 5 #define MAX_ADDR 20 #define MAX_TEL 12 #define MAX 100 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char addr[MAX_ADDR]; char tel[MAX_TEL]; }PeoInfo;
这里大家可能会问#define是什么意思呢?在这里我们不需要了解太多,只需要知道只要遇到#define定义的标识符,就会被直接替换为后面定义的数字。
那么我们定义了一个结构体了之后我们就知道了一个人具有的基本属性,但是我们的通讯录也不止一个人,所以我们这里需要再来定义一个数组来存放多个联系人以及通讯录的大小,这个稍后就会用到。
typedef struct Contact { PeoInfo data[MAX]; //先定义100个人的通讯录 int size; }Contact;
好了在完成了这些事前工作后我们就来进入test.c的整体逻辑。
test.c整体逻辑
我们先来做一个简易的菜单,供用户了解我们的通讯录有什么功能。
菜单
void menu() { printf("*******************************************\n"); printf("********** 1.add 2del *****************\n"); printf("********** 3.search 4.modify**************\n"); printf("********** 5.show 6.sort ***********\n"); printf("*************** 0.Exit ******************\n"); }
为了使用方便,我们将这些选项用枚举来处理一下。
enum option { //这里将Exist放在第一位是因为枚举的第一个数据被默认为0,跟我们的菜单相对应 Exit, add, del, search, modify, show, sort };
因为我们的通讯录至少要执行一次,所以这里我们使用do-while循环。并且一开始通讯录里面肯定是空的,所以我们可以在开始的时候对通讯录进行初始化。
int main() { int input = 0; Contact con; //创建一个Contact类型的变量 //初始化通讯录 InitContact(&con); do { menu(); printf("请输入操作数\n"); 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: break; default: printf("输入错误,请重新输入\n"); break; } } while (input); }
然后就是对函数主体的实现
Contact.c(函数主体实现)
首先是对通讯录的初始化:将通讯录的已使用大小改成0,每个联系人的信息也都初始化为0。
通讯录初始化
void InitContact(Contact* ps) { ps->size = 0; memset(ps->data, 0, sizeof(ps->data)); }
添加联系人
在添加联系此人的时候我们需要先判断通讯录是否满了,如果满了就提示错误,退出程序。
void AddContact(Contact* ps) { if (ps->size > MAX) { printf("空间已满,添加失败\n"); return; } printf("请输入姓名:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ps->size].age)); printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入地址:>"); scanf("%s", ps->data[ps->size].addr); printf("请输入电话号码:>"); scanf("%s", ps->data[ps->size].tel); printf("增加成功\n"); ps->size++; //别忘记了联系人的数量+1 }
在添加完成联系人之后,我们可以先完成展示的功能来看看是否添加成功。
展示通讯录
void ShowContact(Contact* ps) { printf(" 姓名 年龄 性别 地址 电话号\n"); for (int i = 0; i < ps->size; i++) { //给定宽度,使得打印出来的时候界面好看一点 printf("%10s%10d%8s%10s%12s\n", ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].addr, ps->data[i].tel ); } }
删除联系人
要想删除指定联系人,我们首先需要找到该联系人,那么这里我们就来写一个函数专门用来查找联系人。
查找联系人
//找到了就返回联系人所在数组的下标,没找到就返回-1 int FindNumber(Contact* ps ,char name[]) { for (int i = 0; i < ps->size; i++) { //字符串比较使用strcmp,如果相同就返回0,不同返回相对的ASCII值的差值 if (strcmp(ps->data[i].name, name) == 0) { return i; } } return -1; }
void DelContact(Contact* ps) { if (ps->size == 0) { printf("通讯录为空,无法删除\n"); return; } printf("请输入需要删除的人的姓名\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps,name); if (ret == -1) { printf("查无此人\n"); return; } else { //这里考虑当删除的联系人是最后一个的时候,就只需要直接size-1 if (ret == ps->size - 1) { ps->size--; return; } //将需要删除的联系人后面的数据都向前移动一个,就实现了删除这个功能 for (int i = ret; i < ps->size-1; i++) { ps->data[i] = ps->data[i + 1]; } } printf("删除成功\n"); ps->size--; } }
查找联系人
这里我们可以直接使用前面的查找联系人这个函数。
//如果找到了就返回该联系人所在数组的下标,没找到就返回-1 int SearchContact(Contact* ps) { printf("请输入需要查找的人的姓名\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps, name); return ret; }
修改联系人
void ModifyContact(Contact* ps) { printf("请输入要修改的人的名字\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps, name); if (ret == -1) return; printf("请输入姓名:>"); scanf("%s", ps->data[ret].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ret].age)); printf("请输入性别:>"); scanf("%s", ps->data[ret].sex); printf("请输入地址:>"); scanf("%s", ps->data[ret].addr); printf("请输入电话号码:>"); scanf("%s", ps->data[ret].tel); }
对通讯录进行排序(以名字排序)
//我们这里可以直接使用qsort来对通讯录进行排序 int cmp(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void sortContact(Contact* ps) { //按名字排序 qsort(ps, ps->size, sizeof(PeoInfo), cmp); }
好了这些就是Contact.c函数的实现了,我们来看看整体代码的展示。
整体代码展示
Contact.h
#define MAX_NAME 20 #define MAX_SEX 5 #define MAX_ADDR 20 #define MAX_TEL 12 #define MAX 100 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char addr[MAX_ADDR]; char tel[MAX_TEL]; }PeoInfo; typedef struct Contact { PeoInfo data[MAX]; int size; }Contact; void AddContact(Contact* ps); void InitContact(Contact* ps); void ShowContact(Contact* ps); void DelContact(Contact* ps); int SearchContact(Contact* ps); void ModifyContact(Contact* ps); void sortContact(Contact* ps);
Contact.c
#include"Contact.h" void InitContact(Contact* ps) { ps->size = 0; memset(ps->data, 0, sizeof(ps->data)); } void AddContact(Contact* ps) { if (ps->size > MAX) { printf("空间已满,添加失败\n"); return; } printf("请输入姓名:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ps->size].age)); printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入地址:>"); scanf("%s", ps->data[ps->size].addr); printf("请输入电话号码:>"); scanf("%s", ps->data[ps->size].tel); printf("增加成功\n"); ps->size++; } void ShowContact(Contact* ps) { printf(" 姓名 年龄 性别 地址 电话号\n"); for (int i = 0; i < ps->size; i++) { printf("%10s%10d%8s%10s%12s\n", ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].addr, ps->data[i].tel ); } } int FindNumber(Contact* ps ,char name[]) { for (int i = 0; i < ps->size; i++) { if (strcmp(ps->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(Contact* ps) { if (ps->size == 0) { printf("通讯录为空,无法删除\n"); return; } printf("请输入需要删除的人的姓名\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps,name); if (ret == -1) { printf("查无此人\n"); return; } else { if (ret == ps->size - 1) { ps->size--; } for (int i = ret; i < ps->size-1; i++) { ps->data[i] = ps->data[i + 1]; } } printf("删除成功\n"); ps->size--; } int SearchContact(Contact* ps) { printf("请输入需要查找的人的姓名\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps, name); return ret; } void ModifyContact(Contact* ps) { printf("请输入要修改的人的名字\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int ret = FindNumber(ps, name); if (ret == -1) return; printf("请输入姓名:>"); scanf("%s", ps->data[ret].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ret].age)); printf("请输入性别:>"); scanf("%s", ps->data[ret].sex); printf("请输入地址:>"); scanf("%s", ps->data[ret].addr); printf("请输入电话号码:>"); scanf("%s", ps->data[ret].tel); } int cmp(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void sortContact(Contact* ps) { //按名字排序 qsort(ps, ps->size, sizeof(PeoInfo), cmp); }
test.c
#include"Contact.h" void menu() { printf("*******************************************\n"); printf("********** 1.add 2del *****************\n"); printf("********** 3.search 4.modify**************\n"); printf("********** 5.show 6.sort ***********\n"); printf("*************** 0.Exit ******************\n"); } enum option { Exit, add, del, search, modify, show, sort }; int main() { int input = 0; Contact con; //初始化通讯录 InitContact(&con); do { menu(); printf("请输入操作数\n"); 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: break; default: printf("输入错误,请重新输入\n"); break; } } while (input); }
结语
好了,那么这就是我今天的通讯录分享了,感谢大家的观看,非常感谢。如果觉得我的文章对你有帮助的话,记得给博主点个赞哦,非现感谢!!!