六、查找联系人并打印(Search)
依然需要用到上述的查找某位联系人是否存在的函数
传参:
SearchContact(&con);
(1)先查找
void SearchContact(contact* pc) { assert(pc); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); }
(2)后打印
联系人存在就打印该联系人的信息
void SearchContact(contact* pc) { assert(pc); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); if (ret == -1) { printf("联系人不存在,查找失败\n"); return; } printf("查找成功:\n"); printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址"); printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr); }
七、修改联系人(modify)
想要修改某位联系人的信息,首先确定该联系人是否存在
传参:
ModifyContact(&con);
(1)查找联系人
void ModifyContact(contact* pc) { assert(pc); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); if (ret == -1) { printf("联系人不存在,修改失败\n"); return; } }
(2)修改联系人信息
void ModifyContact(contact* pc) { assert(pc); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); if (ret == -1) { printf("联系人不存在,修改失败\n"); return; } printf("联系人存在:"); printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr); printf("请修改姓名>:"); scanf("%s", pc->data[ret].name); printf("请修改性别>:"); scanf("%s", pc->data[ret].sex); printf("请修改年龄>:"); scanf("%d", &(pc->data[ret].age)); printf("请修改电话>:"); scanf("%s", pc->data[ret].tele); printf("请修改住址>:"); scanf("%s", pc->data[ret].addr); printf("\n修改成功"); }
八、联系人排序
对联系人排序,使用库函数中的排序函数qsort,我们只需要完成比较函数即可。
排序可以按照名字的字典顺序或者年龄等,我们这里介绍名字和年龄的排序。
(1)按照名字排序
传参:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);
第四个为函数指针,指向的比较函数需要我们自己完成
名字的比较函数:
//名字排序 int qsort_cmp_name(const void* e1,const void* e2) { return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name); }
(1) 名字的字典顺序,其实就算字符串的比较。
(2)字符串比较需要用函数strcmp,头文件#include<string.h>
(2)按照年龄排序
传参:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);
年龄的比较函数:
//年龄排序 int qsort_cmp_age(const void* e1,const void* e2) { return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age; }
(3)完整排序函数
void menu2() { printf("*************************\n"); printf("**** 1.名字 2.年龄 ****\n"); printf("*************************\n"); } //联系人排序 void SortContact(contact* pc) { int input2; menu2(); printf("请选择排序方式:"); scanf("%d",&input2); switch (input2) { case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break; case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break; defualt:printf("选择错误\n"); break; } }
每进入一次该函数,只能排序一次,不需要设置循环
九、菜单的实现
(1)主函数部分
enum Option { EXIT,//退出 ADD,//增加 DEL,//删除联系人 SEARCH,//查找联系人 MODIFY,//修改指定联系人 SHOW,//打印联系人 SORT,//分类 }; int main() { contact con; InitContact(&con); int input; 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 SHOW:ShowContact(&con); break; case SORT:SortContact(&con); break; case EXIT:printf("你已选择退出程序\n"); break; default:printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
【代码思路】
(1)do…while循环配合switch选择语句完成菜单的构造。可以供用户多次选择,直至退出
(2)在选择语句中
(2)菜单函数
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"); }
所谓的菜单,就算打印出来让我们看。具体的选项还是得由主函数部分实现。
十、完整通讯录代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #define NAME_MAX 20 #define SEX_MAX 6 #define TELE_MAX 20 #define ADDR_MAX 20 #define MAX 100 typedef struct PeoInfo { char name[NAME_MAX];//姓名 char sex[SEX_MAX];//性别 int age;//年龄 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }PeoInfo; typedef struct contact { PeoInfo data[MAX];//通讯录 int sz;//记录通讯录的个数 }contact; //函数的声明 //初始化 void InitContact(contact* pc); //添加用户信息 void AddContact(contact* pc); //打印通讯录 void ShowContact(contact* pc); //删除联系人 void DelContact(contact* pc); //查找某个联系人 void SearchContact(contact* pc); //修改联系人 void ModifyContact(contact* pc); //联系人排序 void SortContact(contact* pc); //函数功能的实现 void InitContact(contact* pc) { assert(pc); memset(pc->data,0,sizeof(pc->data)); pc->sz = 0; } void ShowContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } printf("%-10s %-5s %-10s %-15s %-10s\n","名字","性别","年龄","电话","住址"); int i = 0; for (i=0;i<pc->sz;i++) { printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } printf("\n"); } void AddContact(contact* pc) { assert(pc); int adds; back: if (pc->sz == MAX) { printf("通讯录已满,存入信息失败\n"); return; } printf("请输入姓名>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别>:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄>:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话>:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址>:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("信息添加成功\n"); printf("是否继续添加联系人信息1/0:"); scanf("%d",&adds); if (adds == 1) goto back; else { return; } } //查看某个联系人是否存在 static int FindContact(contact* pc,char name[]) { assert(pc); int i = 0; for (i=0;i<pc->sz;i++) { if (strcmp(name, pc->data[i].name) == 0) return i; } return -1; } //删除联系人 void DelContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空,删除失败\n"); return; } printf("请输入你要删除的联系人:"); char name[NAME_MAX]; scanf("%s",name); int ret = FindContact(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); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); if (ret == -1) { printf("联系人不存在,查找失败\n"); return; } printf("查找成功:\n"); printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址"); printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr); } //修改联系人 void ModifyContact(contact* pc) { assert(pc); printf("请输入你要查找联系人的名字:"); char name[NAME_MAX]; scanf("%s", name); int ret = FindContact(pc, name); if (ret == -1) { printf("联系人不存在,修改失败\n"); return; } printf("联系人存在:"); printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr); printf("请修改姓名>:"); scanf("%s", pc->data[ret].name); printf("请修改性别>:"); scanf("%s", pc->data[ret].sex); printf("请修改年龄>:"); scanf("%d", &(pc->data[ret].age)); printf("请修改电话>:"); scanf("%s", pc->data[ret].tele); printf("请修改住址>:"); scanf("%s", pc->data[ret].addr); printf("\n修改成功"); } //分类菜单 void menu2() { printf("*************************\n"); printf("**** 1.名字 2.年龄 ****\n"); printf("*************************\n"); } //名字排序 int qsort_cmp_name(const void* e1,const void* e2) { return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name); } //年龄排序 int qsort_cmp_age(const void* e1,const void* e2) { return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age; } //联系人排序 void SortContact(contact* pc) { int input2; menu2(); printf("请选择排序方式:"); scanf("%d",&input2); switch (input2) { case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break; case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break; defualt:printf("选择错误\n"); break; } } //主函数及菜单 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"); } enum Option { EXIT,//退出 ADD,//增加 DEL,//删除联系人 SEARCH,//查找联系人 MODIFY,//修改指定联系人 SHOW,//打印联系人 SORT,//分类 }; int main() { contact con; InitContact(&con); int input; 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 SHOW:ShowContact(&con); break; case SORT:SortContact(&con); break; case EXIT:printf("你已选择退出程序\n"); break; default:printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
至此,通讯录的实现完成。