SHOWContact函数(显示)
刚刚我们只是添加成功,可以通过调试来查看是否存放成功,但无法在程序运行台中显示出来,所以我们先来实现显示函数,来将添加成功的联系人显示出来。
void SHOWContact(const Contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空,无需打印\n"); return; } int i = 0; //名字 年龄 性别 电话 地址 //xxx xxx xxx xxx xxx printf("%-20s%-10s%-10s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { //打印每个人的信息 printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
首先,我们只是显示联系人,不希望其发生改变,所以可以在传入指针中用const来修饰指针pc,之后仍然是断然防止传入指针为空,如果sz也就是记录联系人人数等于0,那么就无需打印通讯录,之后我们为了让打印出来的联系人更加直观所以用printf函数来显示出来data成员的各项数据。之后通过for循环,以及使用pc指针找到sz来遍历data成员,并且全部打印出来就可以了。
FindByName(查找)
我们在实现删除联系人函数功能之前,必须先来找到该成员,包括后面的修改联系人,查找并显示联系人,都需要先找到该联系人,所以我们把找到该联系人的功能,单独封装为一个函数来实现。
int FindByName(Contact* pc, char* name) { assert(pc); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name,name)==0) { return i; } } return -1; }
首先,既然要查找该联系人,那么就需要两个参数,一个是con的地址,通过pc来找到,另一个是要找的联系人的名字,定义一个char型的指针变量来接受,首先我们依然先来断言一下防止传入指针pc为空,之后通过for循环,用pc找到sz来遍历data成员来查找到该联系人,如果找到我们怎么判断名字是否相等,就通过strcmp函数,等于0就说明查找到了,这时候返回i,就能记录当前联系人的下标,如果遍历完了没有找到,我们就返回-1。
DElContact函数(删除)
有了查找函数,接下来我们来实现删除函数功能。
void DELContact(Contact* pc) { char name[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通讯录为空,不可删除\n"); return; } printf("请输入你想删除的联系人:"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在,无法删除!\n"); return; } int i = 0; for (i = ret; i < pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除该联系人成功!\n"); }
首先依然是接受con用Contact指针变量pc来接受,定义一个char型的name数组,之后依然是断然防止pc为空,如果通过pc找到的sz为0,那么就无法删除联系人。之后提示打印想要删除的联系人,然后通过scanf函数来输入,之后定义一个ret来接受通过FindByName查找到的下标,如果ret等于-1,说明该联系人不存在,不为0,说明存在,之后我们通过for循环让i等于ret,之后遍历到通过pc找到的sz-1,我们把ret之后的每个data成员往前移动一位,这样就实现了删除。最后通过pc找到的sz–,来记录联系人人数。
SearchContact函数(查找并显示)
我们来实现查找并单独打印的函数功能,这个函数实现起来也是十分简单,接下来我们来看一下
void SearchContact(Contact* pc) { assert(pc); char name[NAME_MAX]; printf("请输入想查找的联系人"); scanf("%s", &name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在!\n"); return; } printf("%-20s%-10s%-10s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); }
依然是和前面函数一样的指针pc,断言,之后定义一个char型的name数组,提示想要查找的联系人,传参给FindByName来查找并赋值给ret,如果ret等于-1,那么该联系人不存在,否则打印即可。
ModifyContact函数(修改)
这个函数实现起来也是十分简单,我们来一起看一下吧。
void ModifyContact(Contact* pc) { assert(pc); char name[NAME_MAX]; printf("请输入想修改的联系人"); scanf("%s", &name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在!\n"); return; } printf("请输入姓名:"); scanf("%s", pc->data[ret].name); printf("请输入年龄:"); scanf("%d", &(pc->data[ret].age)); printf("请输入性别:"); scanf("%s", pc->data[ret].sex); printf("请输入电话号码:"); scanf("%s", pc->data[ret].tele); printf("请输入住址:"); scanf("%s", pc->data[ret].addr); printf("修改联系人成功!\n"); }
首先依然是同样的pc指针,断言,定义char型的name数组,输入修改联系人名字,通过FindByName函数查找到的下标传给ret,如果等于-1,则说明该联系人不存在,否则直接输入data成员的各项数据,存放到data[ret]中去。
SortContact函数(排序)
我们来实现算是最后一个功能,排序功能。
int compare_name(const void* base,const void* src) { return strcmp(((PeoInfo*)base)->name , ((PeoInfo*)src)->name); } int compare_age(const void* base, const void* src) { return (((PeoInfo*)base)->age-((PeoInfo*)src)->age); } void SortContact(Contact* pc) { int ret = 0; printf("1按名字排序,2按年龄排序\n"); scanf("%d", &ret); if (ret == 1) { qsort(pc->data, pc->sz, sizeof(PeoInfo), compare_name); SHOWContact(pc); printf("名字排序成功\n"); } else if (ret == 2) { qsort(pc->data, pc->sz, sizeof(PeoInfo), compare_age); SHOWContact(pc); printf("年龄排序成功\n"); } else { printf("选择错误,返回操作"); } }
排序功能,需要我们自定义比较函数,我们先通过ret来选择按名字排序还是年龄排序,之后再不同的情况中同qsort函数来排序后通过SHOWContact函数来显示排序过后的通讯录,即可。两个自定义比较函数,分别强转为PeoInfo类型指针后指向年龄相减,或者指向名字用strcmp函数比较即可。就实现了两个不同的排序情况。
清空通讯录
最后如果我们想要清空通讯录,直接调用初始化函数即可,这样就把所有的数据清空了
可以通过调试监视窗口,确实是清空了。
详细代码
最后给大家分享鄙人代码
test.c
#include"contact.h" enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, EMPTY }; void menu(); int main() { int input = 0; Contact con ; InitContact(&con); do { menu(); printf("请输入你想选择的操作:"); scanf("%d", &input); switch (input) { case EXIT: printf("退出通讯录成功"); break; 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 EMPTY: InitContact(&con); printf("清空通讯录成功\n"); break; default: printf("输入错误\n"); break; } } while (input); return 0; }
contact.c
#include "contact.h" void menu() { printf("*****************************\n"); printf("*****0.EXIT****1.ADD*********\n"); printf("*****2.DEL*****3.SEARCH******\n"); printf("*****4.MODIFY**5.SHOW********\n"); printf("*****6.SORT****7.EMPTY*******\n"); } void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } 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].tele); printf("请输入住址:"); scanf("%s", pc->data[pc->sz].addr); // pc->sz++; printf("添加联系人成功!\n"); } void SHOWContact(const Contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空,无需打印\n"); return; } int i = 0; //名字 年龄 性别 电话 地址 //xxx xxx xxx xxx xxx printf("%-20s%-10s%-10s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { //打印每个人的信息 printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } int FindByName(Contact* pc, char* name) { assert(pc); 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[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通讯录为空,不可删除\n"); return; } printf("请输入你想删除的联系人:"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在,无法删除!\n"); return; } int i = 0; for (i = ret; i < pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除该联系人成功!\n"); } void SearchContact(Contact* pc) { assert(pc); char name[NAME_MAX]; printf("请输入想查找的联系人"); scanf("%s", &name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在!\n"); return; } printf("%-20s%-10s%-10s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); } void ModifyContact(Contact* pc) { assert(pc); char name[NAME_MAX]; printf("请输入想修改的联系人"); scanf("%s", &name); int ret = FindByName(pc, name); if (ret == -1) { printf("该联系人不存在!\n"); return; } printf("请输入姓名:"); scanf("%s", pc->data[ret].name); printf("请输入年龄:"); scanf("%d", &(pc->data[ret].age)); printf("请输入性别:"); scanf("%s", pc->data[ret].sex); printf("请输入电话号码:"); scanf("%s", pc->data[ret].tele); printf("请输入住址:"); scanf("%s", pc->data[ret].addr); printf("修改联系人成功!\n"); } int compare_name(const void* base,const void* src) { return strcmp(((PeoInfo*)base)->name , ((PeoInfo*)src)->name); } int compare_age(const void* base, const void* src) { return (((PeoInfo*)base)->age-((PeoInfo*)src)->age); } void SortContact(Contact* pc) { int ret = 0; printf("1按名字排序,2按年龄排序\n"); scanf("%d", &ret); if (ret == 1) { qsort(pc->data, pc->sz, sizeof(PeoInfo), compare_name); SHOWContact(pc); printf("名字排序成功\n"); } else if (ret == 2) { qsort(pc->data, pc->sz, sizeof(PeoInfo), compare_age); SHOWContact(pc); printf("年龄排序成功\n"); } else { printf("选择错误,返回操作"); } }
contact.h
#pragma once #include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #define NAME_MAX 20 #define SEX_MAX 10 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 100 typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfo; typedef struct Contact { PeoInfo data[MAX];//存放成员数据 int sz;//记录当前通讯录人数 }Contact; void menu(); void InitContact(Contact* pc); void ADDContact(Contact* pc); void SHOWContact(const Contact* pc); void DELContact(Contact* pc); void SearchContact(Contact* pc); void ModifyContact(Contact* pc); void SortContact(Contact* pc);
当然通讯录还有不完善的地方,以后会修改并带给大家,最后各位看客老爷万福金安。