大家好呀!今天向大家分享如何用c语言来实现一个简易的通讯录,通讯录的主要功能有:添加 删除 修改 查找 展示以及排序,希望各位佬们能指出文章中不足的地方。
该通讯录的实现与三子棋与扫雷一样,分成了3个模块:
- text.c:整体逻辑的实现
- contact.c:各个功能函数的定义
- contact.h:各个功能函数的声明&&其他声明
1 通讯录整体逻辑的实现
整体思路与三子棋与扫雷差不多,话不多说,直接上代码:
void menu() { printf("**************************************\n"); printf("*******1 add 2 del*********\n"); printf("*******3 modif 4 show********\n"); printf("*******5 sort 6 search******\n"); printf("************* 0 exit******************\n"); } void text() { int input = 0; struct contact ta; InitContact(&ta); do { menu(); printf("请选择:>\n"); scanf("%d", &input); switch (input) { case ADD: AddContact(&ta); break; case DEL: DelContact(&ta); break; case MODIF: ModifContact(&ta); break; case SHOW: ShowContact(&ta); break; case SORT: SortContact(&ta); break; case SEARCH: SearchContact(&ta); break; case EXIXT: printf("退出通讯录\n"); break; default: printf("输入错误,请重新输入\n"); } } while (input); } int main() { text(); return 0; }
2 结构体变量的定义以及初始化
首先我们要声明一个结构体,其中包含了我们想要保存的信息(可以自己设置):
struct inform { char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; char birth[MAX_BIRTH]; };
但是我们可能会想到一个问题,如何表示该结构体中已经存入的有效数据有多少?所以我们还得定义一个变量size,通过某些函数功能的实现(例如增加联系人),size的值也必须要发生改变,我们可以通过传入size的地址来改变它自身,但是还有一个简单的办法:再声明一个结构体,并用该结构体创建一个struct inform的数组以及size,这样就解决了这个问题。
struct contact { struct inform data[MAX]; int size; };
我们可以用struct contact类型的结构体创建一个变量,然后再初始化所有元素都为0.
struct contact ta; InitContact(&ta);
具体初始化的实现可以用memset函数:
void InitContact(struct contact* pc) { memset(pc->data, 0, sizeof(pc->data)); pc->size = 0; }
在整体逻辑的实现上,我们用了很多#define的标识符常量使修改一些数据变得更加容易。为了让代码的可读性更高,在switch语句中运用了枚举常量。为了减少时间以及空间上的开销,所有功能函数中传入的都是结构体的地址。
#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 6 #define MAX_TELE 12 #define MAX_ADDR 15 #define MAX_BIRTH 15 enum ContactChoose { EXIXT, ADD, DEL, MODIF, SHOW, SORT, SEARCH };
2 增加联系人功能的实现
void AddContact(struct contact*pc);
void AddContact(struct contact* pc) { if (pc->size == MAX) { printf("通讯录已满,无法再增加\n"); } else { printf("请输入姓名:>\n"); scanf("%s", pc->data[pc->size].name); printf("请输入性别:>\n"); scanf("%s", pc->data[pc->size].sex); printf("请输入年龄:>\n"); scanf("%d", &(pc->data[pc->size].age)); printf("请输入电话:>\n"); scanf("%s", pc->data[pc->size].tele); printf("请输入地址:>\n"); scanf("%s", pc->data[pc->size].addr); printf("请输入生日:>\n"); scanf("%s", pc->data[pc->size].birth); pc->size++; printf("保存成功\n"); } }
这里面值得注意的细节是:在输入年龄时由于年龄定义的是一个整形,所以要加上&。
3 删除联系人功能的实现
void DelContact(struct contact*pc);
再删除之前,我们是不是还得找到该联系人的姓名。其实我们想想:后面的修改 查找 功能实现的时候是不是也要查找联系人的姓名,为了解决代码的冗余,我i们不妨分装一个函数来完成查找功能:
int FindName(const struct contact* pc,char name[MAX_NAME]) { int i = 0; for (i = 0; i < pc->size; i++) { if (0 == strcmp(pc->data[i].name, name)) return i; } return -1; }
然后就可以实现删除函数了:
void DelContact(struct contact* pc) { char name[MAX_NAME]; printf("请输入要删除人的姓名\n"); scanf("%s", name); int pos = FindName(pc,name); if (-1 == pos) printf("找不到要删除人的姓名\n"); else { for (pos ; pos <pc->size-1 ; pos++) { pc->data[pos] = pc->data[pos + 1]; } pc->size--; printf("删除成功\n"); } }
删除的方法有很多,这里用的是后面元素一个一个向前移动的方法。
4 展示有效联系人功能的实现
void ShowContact(const struct contact*pc);
void ShowContact(const struct contact* pc) { int i = 0; printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日"); for (i = 0; i < pc->size; i++) { printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr, pc->data[i].birth); } }
该函数的功能是将所有有效的联系人的信息都展示出来,为了让结果更加美观,采用了左对齐的方式,每个数据都有特定的长度。
5 排序联系人功能的实现
void SortContact(struct contact*pc);
CmpName(const void* e1, const void* e2) { return strcmp(((struct contact*)e1)->data->name, ((struct contact*)e2)->data->name); } void SortContact(struct contact* pc) { qsort(pc->data, pc->size, sizeof(pc->data[0]), CmpName); printf("排序成功\n"); }
该函数排序用的是姓名作为标准,可以自己更换排序方式。
6 查找联系人功能的实现
void SearchContact(const struct contact*pc);
void SearchContact(const struct contact* pc) { char name[MAX_NAME]; printf("请输入要查找人的姓名\n"); scanf("%s", name); int pos = FindName(pc, name); if (-1 == pos) printf("找不到要查找人的姓名\n"); else { printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日"); printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr, pc->data[pos].birth); printf("查找成功\n"); } }
7 修改联系人功能的实现
void DelContact(struct contact*pc);
void ModifContact(struct contact* pc) { char name[MAX_NAME]; printf("请输入要修改人的姓名\n"); scanf("%s", name); int pos = FindName(pc, name); if (-1 == pos) printf("找不到要修改人的姓名\n"); else { printf("请输入姓名:>\n"); scanf("%s", pc->data[pos].name); printf("请输入性别:>\n"); scanf("%s", pc->data[pos].sex); printf("请输入年龄:>\n"); scanf("%d", &(pc->data[pos].age)); printf("请输入电话:>\n"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>\n"); scanf("%s", pc->data[pos].addr); printf("请输入生日:>\n"); scanf("%s", pc->data[pos].birth); printf("修改成功\n"); } }
8 总代码
text.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void menu() { printf("**************************************\n"); printf("*******1 add 2 del*********\n"); printf("*******3 modif 4 show********\n"); printf("*******5 sort 6 search******\n"); printf("************* 0 exit******************\n"); } void text() { int input = 0; struct contact ta; InitContact(&ta); do { menu(); printf("请选择:>\n"); scanf("%d", &input); switch (input) { case ADD: AddContact(&ta); break; case DEL: DelContact(&ta); break; case MODIF: ModifContact(&ta); break; case SHOW: ShowContact(&ta); break; case SORT: SortContact(&ta); break; case SEARCH: SearchContact(&ta); break; case EXIXT: printf("退出通讯录\n"); break; default: printf("输入错误,请重新输入\n"); } } while (input); } int main() { text(); return 0; }
contact.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void InitContact(struct contact* pc) { memset(pc->data, 0, sizeof(pc->data)); pc->size = 0; } void AddContact(struct contact* pc) { if (pc->size == MAX) { printf("通讯录已满,无法再增加\n"); } else { printf("请输入姓名:>\n"); scanf("%s", pc->data[pc->size].name); printf("请输入性别:>\n"); scanf("%s", pc->data[pc->size].sex); printf("请输入年龄:>\n"); scanf("%d", &(pc->data[pc->size].age)); printf("请输入电话:>\n"); scanf("%s", pc->data[pc->size].tele); printf("请输入地址:>\n"); scanf("%s", pc->data[pc->size].addr); printf("请输入生日:>\n"); scanf("%s", pc->data[pc->size].birth); pc->size++; printf("保存成功\n"); } } void ShowContact(const struct contact* pc) { int i = 0; printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日"); for (i = 0; i < pc->size; i++) { printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr, pc->data[i].birth); } } int FindName(const struct contact* pc,char name[MAX_NAME]) { int i = 0; for (i = 0; i < pc->size; i++) { if (0 == strcmp(pc->data[i].name, name)) return i; } return -1; } void DelContact(struct contact* pc) { char name[MAX_NAME]; printf("请输入要删除人的姓名\n"); scanf("%s", name); int pos = FindName(pc,name); if (-1 == pos) printf("找不到要删除人的姓名\n"); else { for (pos ; pos <pc->size-1 ; pos++) { pc->data[pos] = pc->data[pos + 1]; } pc->size--; printf("删除成功\n"); } } void SearchContact(const struct contact* pc) { char name[MAX_NAME]; printf("请输入要查找人的姓名\n"); scanf("%s", name); int pos = FindName(pc, name); if (-1 == pos) printf("找不到要查找人的姓名\n"); else { printf("%-20s\t %-6s\t %-3s\t %-12s\t %-15s\t %-15s\n", "姓名", "性别", "年龄", "电话", "地址", "生日"); printf("%-20s\t %-6s\t %-3d\t %-12s\t %-15s\t %-15s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr, pc->data[pos].birth); printf("查找成功\n"); } } void ModifContact(struct contact* pc) { char name[MAX_NAME]; printf("请输入要修改人的姓名\n"); scanf("%s", name); int pos = FindName(pc, name); if (-1 == pos) printf("找不到要修改人的姓名\n"); else { printf("请输入姓名:>\n"); scanf("%s", pc->data[pos].name); printf("请输入性别:>\n"); scanf("%s", pc->data[pos].sex); printf("请输入年龄:>\n"); scanf("%d", &(pc->data[pos].age)); printf("请输入电话:>\n"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>\n"); scanf("%s", pc->data[pos].addr); printf("请输入生日:>\n"); scanf("%s", pc->data[pos].birth); printf("修改成功\n"); } } CmpName(const void* e1, const void* e2) { return strcmp(((struct contact*)e1)->data->name, ((struct contact*)e2)->data->name); } void SortContact(struct contact* pc) { qsort(pc->data, pc->size, sizeof(pc->data[0]), CmpName); printf("排序成功\n"); }
contact.h:
#pragma once #define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 6 #define MAX_TELE 12 #define MAX_ADDR 15 #define MAX_BIRTH 15 #include<stdio.h> #include<string.h> struct inform { char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; char birth[MAX_BIRTH]; }; struct contact { struct inform data[MAX]; int size; }; enum ContactChoose { EXIXT, ADD, DEL, MODIF, SHOW, SORT, SEARCH }; void InitContact(struct contact*pc); void AddContact(struct contact*pc); void ShowContact(const struct contact*pc); void DelContact(struct contact*pc); void SearchContact(const struct contact*pc); void ModifContact(struct contact*pc); void SortContact(struct contact*pc);
好了 简易通讯录的实现就到此完结了,如果觉得对你有帮助的话可不可以3连支持一下博主呢?
酸Q