(3) 展示通讯录
这个函数的功能就是:显示所有联系人的信息。
void ShowContact(Contact *pc);
void ShowContact(const Contact* pc) { int i = 0; //姓名 年龄 性别 电话 地址 //zhangsan 20 男 123456 北京 //打印标题 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 for(i = 0; i < pc->sz; i++) { printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
标题对齐:
右对齐
printf("%10s %4s %5s %12s %30s\n", "姓名", "年龄", "性别", "电话", "地址");
左对齐
printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
演示效果:
"FindByName函数"
以下的DelContact,SearchContact,ModifyContact都会用到这个函数
输入姓名,假设与pc指向的那个通讯录data遍历去找,找到了就返回0,找不到返回-1,并在调用该FindByName函数的函数打印查找失败信息
static int FindByName(pContact pc, char name[]) { int i = 0; //姓名 年龄 性别 电话 地址 //zhansan 20 男 123456 北京 //打印标题 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄","性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; }
(4)删除指定联系人
void DelContact(Contact* pc);
若通讯录没有联系人信息,则需要判断是否为空,无法删除
步骤:
1.找到要删除的人 - 位置(下标)
pos是调用findname函数,通过name找到了对应的联系人,返回这个联系人在数组中的下标
2.删除 - 删除pos位置上的数据
删除的时候,把找到的元素删除,接着所有元素往前移动
pc->sz-1的原因:
void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->data == 0) { printf("通讯录为空,无法删除\n"); return; }//删除 //1.找到要删除的人 - 位置(下标) printf("输入要删除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } int i = 0; //2.删除 - 删除pos位置上的数据 for(i=pos;i<pc->sz-1;i++) { pc->data[i] = pc->data[i + 1];//数组元素往前移动 } pc->sz--;//下标的大小自减1 printf("删除成功\n"); }
演示:
通讯录中无指定联系人:
(5)查找通讯录
这个函数的功能是查找一个联系人的信息,输入字符串,若与data结构体中的name数组元素一致,则返回成功并打印信息,否则返回查找失败的信息提示。
void SearchContact(Contact *pc);
void SearchContact(const Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找的人的名字:>"); scanf("%s", name); //查找 int pos = FindByName(pc,name); if (pos == -1) { printf("要查找的人不存在\n"); return; } //打印 printf("%-10s %-4s %-5s %-12 %-30s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-10s %-4d %-5s %-12 %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }
演示:
(6)修改通讯录
修改通讯录,输入从已添加的所有联系人信息中姓名一致的,然后就可以修改数组此下标位置的所有信息.反之输入的名字是已添加联系人信息中没有的,则返回失败信息。
void ModifyContact(Contact *pc);
void ModifyContact(pContact pc)//这里我也定义了typedef struct Contact* pContact pc类型 { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } 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 SortContact(Contact* pc);//排序通讯录元素
按名字排序通讯录:
int cmp_by_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name); printf("排序成功\n"); }
演示:
按年龄排序通讯录:
int cmp_by_age(const void* a, const void* b) { return (*(PeoInfo*)a).age - (*(PeoInfo*)b).age; } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_age); printf("排序成功\n"); }
演示: