1、基本要求
通讯录中能够存放1000个人的信息,包括(名字+年龄+性别+电话+地址)
功能包括:
增加人的信息
删除指定人的信息
修改指定人信息
查找指定人信息
排序通讯录信息
注意:此代码需要用到三个文件完成,作用如下:
test.c文件:测试通讯录的模块
contact.h文件:类型定义,函数声明
contact.c文件:函数实现
2、通讯录各功能分析
(1)菜单实现
- test.c文件:
#include"contact.h" void menu() { printf("*******************************************\n"); printf("******* 1. add 2. del *********\n"); printf("******* 3. search 4. modify *********\n"); printf("******* 5. sort 6. print *********\n"); printf("******* 0. exit *********\n"); printf("*******************************************\n"); }
- 此时test.c整体代码:
#include"contact.h" void menu() { printf("*******************************************\n"); printf("******* 1. add 2. del *********\n"); printf("******* 3. search 4. modify *********\n"); printf("******* 5. sort 6. print *********\n"); printf("******* 0. exit *********\n"); printf("*******************************************\n"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT }; 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 SORT: //排序 break; case PRINT: //打印 break; case EXIT: //退出 break; default: break; } } while (input); return 0; }
- 注意:
当菜单打印出来时,需要选择数字进行对应的功能实现,为了方便编码人员清楚对应的数字具体是啥功能,所以上述采用了枚举类型enum关键字
(2)初始化功能
在初始化通讯录之前,得先创建一个通讯录:
- contact.h 文件:
#pragma once #include<stdio.h> #define MAX_NAME 20 #define MAI_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000 //存放每一个联系人的信息内容 typedef struct PeoInfo { char name[MAX_NAME]; char sex[MAI_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //创建通讯录 typedef struct Contact { PeoInfo data[MAX]; //存放添加进来人的信息 int sz; //记录当前通讯录中有效信息的个数 }Contact;
创建好通讯录后,接下来进行初始化
- contact.c 文件:
void InitContact(Contact* pc) { pc->sz = 0; //memset(); 内存设置 memset(pc->data, 0, sizeof(pc->data)); }
- contact.h 文件:
void InitContact(Contact* pc);
- test.c 文件:
(3)添加联系人并打印
- contact.h 文件
void AddContact(Contact* pc);
- contact.c 文件
void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%s", &pc->data[pc->sz].age); printf("请输入性别:>"); scanf("%s", &pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr);; pc->sz++; printf("增加成功\n"); }
在添加联系人后,不知道是否添加成功,所以我们需要将其打印出来看看
- contact.h 文件
void PrintContact(const Contact* pc);
- contact.c 文件
//打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } }
- 运行效果如下:
(4)删除指定联系人
- 在我们删除掉指定联系人之前,首先得查找是否存在这个要删除的人
//1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; }
- 接下来具体实现FindByName函数的过程:
//查找要删除的联系人 static int FindByName(Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; //找不到 }
- 找到这个要删除的人后,接下来就是执行删除操作了,总代码如下:
- contact.c 文件
//删除联系人信息 void DelContact(Contact* pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无需删除\n"); return; } printf("请输入要删除人的名字:>"); scanf("%s", name); //1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } //2、删除 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }
- 测验结果如下:
(5)查找指定联系人并打印
- contact.h 文件:
void SearchContact(Contact* pc);
- contact.c 文件:
//查找指定联系人 void SearchContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } else { int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } }
- 运行结果如下:
(6)修改指定人信息
- contact.h 文件:
void ModifyContact(Contact* pc);
- contact.c 文件:
//修改指定联系人 void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } else { printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &pc->data[pos].age); printf("请输入性别:>"); scanf("%s", &pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } }
- 运行结果如下:
(7)打印全部信息
- 其实此段代码前面已经出现过,再回顾下:
//打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } }
(8)排序通讯录信息
- contact.c 文件
//通过姓名排序 int CmpByName(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } //通过年龄排序 int CmpByAge(const void* e1, const void* e2) { return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age; } //排序通讯录中联系人的先后顺序 void SortContact(Contact* ps) { int input = 0; printf("1、姓名\t2、年龄\n"); printf("请选择你要排序的方式:>"); scanf("%d", &input); switch (input) { case 1: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByName);//排序 printf("排序成功\n"); break; case 2: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByAge);//排序 printf("排序成功\n"); break; default: printf("请输入有效数字\n"); } }
3、整体代码
- contact.h 文件:
#pragma once #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_NAME 20 #define MAI_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000 //存放每个人的信息 typedef struct PeoInfo { char name[MAX_NAME]; char sex[MAI_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //创建通讯录 typedef struct Contact { PeoInfo data[MAX]; //存放添加进来人的信息 int sz; //记录当前通讯录中有效信息的个数 }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc); //打印联系人信息 void PrintContact(const Contact* pc); //删除联系人信息 void DelContact(Contact* pc); //查找指定联系人 void SearchContact(Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //排序联系人 void SortContact(Contact* ps);
- contact.c 文件:
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" //初始化通讯录 void InitContact(Contact* pc) { pc->sz = 0; //memset(); 内存设置 memset(pc->data, 0, sizeof(pc->data)); } //添加联系人 void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &pc->data[pc->sz].age); printf("请输入性别:>"); scanf("%s", &pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加成功\n"); } //打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } } //查找要删除的联系人 static int FindByName(Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; //找不到 } //删除联系人信息 void DelContact(Contact* pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无需删除\n"); return; } printf("请输入要删除人的名字:>"); scanf("%s", name); //1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } //2、删除 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } //查找指定联系人 void SearchContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } else { int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } //修改指定联系人 void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } else { printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &pc->data[pos].age); printf("请输入性别:>"); scanf("%s", &pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } } //通过姓名排序 int CmpByName(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } //通过年龄排序 int CmpByAge(const void* e1, const void* e2) { return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age; } //排序通讯录中联系人的先后顺序 void SortContact(Contact* ps) { int input = 0; printf("1、姓名\t2、年龄\n"); printf("请选择你要排序的方式:>"); scanf("%d", &input); switch (input) { case 1: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByName);//排序 printf("排序成功\n"); break; case 2: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByAge);//排序 printf("排序成功\n"); break; default: printf("请输入有效数字\n"); } }
- test.c 文件:
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void menu() { printf("*******************************************\n"); printf("******* 1. add 2. del *********\n"); printf("******* 3. search 4. modify *********\n"); printf("******* 5. sort 6. print *********\n"); printf("******* 0. exit *********\n"); printf("*******************************************\n"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT }; 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 SORT: //排序 SortContact(&con); break; case PRINT: //打印 PrintContact(&con); break; case EXIT: //退出 printf("退出通讯录\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }