前言
大家好,有好久没有带大家一起搞实战的编程了,今天就给大家带来一个简单的通讯录小系统
1.通讯录的功能和模板介绍
既然我们要制作这个小系统,首先是了解这个小系统的功能,那一个通讯录具体有什么功能呢,接下来我就给大家具体介绍一下
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
添加联系人信息
删除指定联系人信息
查找指定联系人信息
修改指定联系人信息
显示所有联系人信息
清空所有联系人
以名字排序所有联系人
这里我们用三个文件来实现通讯录
text.c——测试通讯录
contact.h——函数的声明
contact.c——通讯录的实现
2.前期准备
2.1 菜单的制作和游戏基本逻辑的实现
这里我们先制作一个小菜单,来记录通讯录的功能,方便用户的选择,代码如下
void menu() { printf("*************************************\n"); printf("*********1.add 2.del ***********\n"); printf("******** 3.search 4.modify *********\n"); printf("******** 5.show 6.sort ********\n"); printf("********* 0.exit **************\n"); printf("*************************************\n"); }
实现菜单后,接下来就是游戏选择逻辑的实现了
int main() { int input = 0; //创建通讯录 Contact con; //初始化通讯录 InitContact(&con); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SerchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
这里用户选择后会进入不同的模块,以实现对应功能的实现。
2.2 通讯录结构的实现
对于通讯录结构,包含了各个类型的元素,所以这里我们采用结构体的方式,来实现通讯录结构。代码如下
//人的信息 typedef struct peoinof { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char addr[ADDR_MAX]; char tele[TELE_MAX]; }peoinfo; typedef struct Contact { peoinfo data[MAX];//存放人的信息 int sz;//存放已经存放信息人的个数 }Contact;
还有就是为了防止人存储信息的范围过大以更好对代码进行更改,这里我们采取宏定义的方式,代码如下:
#define MAX 1000//通讯录最大容量 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12
3.实现通讯录功能
在前期这些准备工作的实现后,接下来我们就正式来到我们对通讯录的功能开发的过程了。首先就是初始化通讯录。
3.1 初始化通讯录
void InitContact(Contact *pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data));//虽然数组传参传的是数组首地址,但由于这里传的时结构体的地址,所以是 // 可以通过该访问到整个数组的 }
此外,需要在contact.h的头文件中声明该函数,以便不同源文件进行访问
这里,我们把人的信息和已经存储的人的数量全部初始化为0,以便后期更好的进行相应的操作
3.2 添加联系人
对于联系人的添加,是一个通讯录系统实现必不可少的部分
void AddContact(Contact* pc) { assert(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].addr); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); pc->sz++; }
这里我们对通讯录的内存进行判断,看其是否达到最大容量,如果到达,就退出函数,否则就对新增联系人进行有关信息的输入
实现后也许要在contaxt.h头文件中对函数进行声明
运行如下:
3.3 打印联系人信息的实现
这里我们先实现打印函数以判断我们添加联系人是否成功,代码如下
void ShowContact(const Contact* pc) { assert(pc); int i = 0; printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话"); for (i = 0; i < pc->sz; i++) { printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } }
这里为了使数据更加的直观,我们先在数据第一行进行一个说明的打印,后续进行内容打印,对于打印这里还有些需要说明的:打印格式前加的数字代表这该类型的数据能打印的个数,正数表示左对齐,负数表示右对齐。
实现后放入头文件
运行如下:
3.4 删除联系人的实现
既然有添加联系人函数,自然也有删除联系人的操作,而对于删除操作,我们可以根据联系人的任何信息进行查询,然后进行删除,此处使用名字,而这里我们需要封装一个根据联系人姓名查找联系人在静态数组的位置的函数
int Find_by_name(const Contact* pc,const char* name) { assert(pc && name); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; }
这里我们规定找到该联系人就返回该联系人的下标,否则就返回-1
接下来看删除联系人的函数
void DelContact(Contact* pc) { char name[NAME_MAX] = { 0 }; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } printf("请输入要删除人的名字:>"); scanf("%s", name); int ret=Find_by_name(pc,name); if (ret == -1) { printf("查找的人不存在"); return; } //删除 int i = 0; for (i = ret; i < pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }
首先先看代码逻辑,这里我们先判断通讯录是否为空,为空即无法删除,我们直接退出函数即可,然后对对应联系人进行查找,查找无果退出函数,查询成功后我们采用用后续元素覆盖前面元素的方式,对相应联系人进行删除操作,代码结束后,在头文件声明
运行展示:
这里我们看到张三联系人删除成功。