🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🌸通讯录的需求
通讯录的功能
🐰 通讯录的原码
🌸主函数
🌸头文件
🌸函数实现文件
🌸通讯录的需求
1.人员的姓名
2.人员的年龄
3.人员的性别
4.人员的电话号码
5.人员的地址
实现方法:通讯录初始设置100个人的空间,开辟100个人的空间,创建100个人的结构体数组。我们设置两个结构体,一个保存通讯录的需求,一个保存结构体结构体数组和通讯录的人数。
注意:通讯录初始的存储值是100(结构体数组有100成员),就是说可以存储100个人的信息,有效个数也是从0开始的(pc->sz最开始为0)
通讯录的功能
初始化通讯录:
void InitContact(Contact* pc) {pc->sz=0;memset(pc->data,0,sizeof(pc->data)); }
pc->data结构体首元素的地址,sizeof(pc->data)计算的是整个结构体数组的大小,然后用memeset将整个数组初始化为0,别忘了引用头文件#include
增加联系人:
void AddContact(Contact* pc);
每个联系人都包含姓名,年龄,性别,电话号码,地址,我们需要一一录入,录入成功后,将有效个数(就是联系人个数)增加一,pc->sz增加一
展示联系人的信息:
void ShowContact(Contact* pc);
就是打印出,通讯录里存在的联系人的所有信息,使用的是循环语句。
删除指定人信息
void DelContact(Contact* pc);
就是我们输入我们想要的查找人的名字,如果通讯录里存在这个人,我就删除这个人的信息。这里实现了一个查找姓名的函数,因为在改变联系人信息功能里也需要实现查找这个功能,所以实现一个函数,减少代码的重叠性。
int Find_name(Contact* pc,char name[])
如果在查找函数中,找到这个人的姓名,我们将返回这个人在结构体数组的位置,就是pc->sz。找到了之后,我们会让后面一个人的信息复制到前一个人的空间里,从要删的人位置开始,直到通讯录要删的人位置以后的人都向前复制了。这样我们就删除指定人的信息。
查找指定人的信息
void SearchContact(Contact* pc);
我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后打印这个人的信息。
改变指定人信息
void ModifyContact(Contact* pc);
我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后直接通过他的位置修改这个人的信息。
给通讯录的人信息排序
void SortContact(Contact* pc,int op);
排序我们使用的系统的自带的qsort给通讯录人员信息进行排序,qsort的原型
qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);
qrort函数第一个参数是排序空间的首地址,第二个参数是排序的个数,第三个参数是排序单个元素的大小,第四个元素是排序函数。
我们这里排序有两种选择,一是按照姓名排序,而是按照年龄排序,所以有两个排序函数
int cmp_by_name(const void* e1,const void* e2)//按照姓名排序 {return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name); }int cmp_by_gae(const void* e1,const void* e2)//按照年龄排序 {return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age; }
🌸主函数
#include"test.h" void menu(void) {printf("===========================\n");printf(" 1.添加,2.删除 \n");printf(" 3.查找,4.改动 \n");printf(" 5.展示,6.排序 \n");printf(" 0.退出 \n");printf("===========================\n"); } enum Option {EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT, }; int main() {Contact con;InitContact(&con);int input=0;int op=0;do{menu();printf("请选择\n");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:printf("请选择排序方法\n");printf("=========================\n");printf("1.按名字排序 2.按年龄排序\n");printf("=========================\n");scanf("%d",&op);SortContact(&con,op);break;case EXIT:printf("退出通讯录\n");break;default:printf("输入错误\n");break;}}while(input); }
🌸头文件
#ifndef test_h #define test_h #include
#endif /* test_h */#include #include #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR]; }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,int op); 🌸函数实现文件
#include "test.h" void InitContact(Contact* pc) {pc->sz=0;memset(pc->data,0,sizeof(pc->data)); } void AddContact(Contact* pc) {if(pc->sz==MAX){printf("通讯录已满,无法增加\n");}else{printf("请输入名字\n");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄\n");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别\n");scanf("%s",pc->data[pc->sz].sex);printf("请输入电话号码\n");scanf("%s",pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s",pc->data[pc->sz].addr);}pc->sz++;printf("添加成功\n"); } void ShowContact(Contact* pc) {printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");for(int i=0;i
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);} } int Find_name(Contact* pc,char name[]) {int i;int pos=-1;for( i=0;i sz;i++){if(strcmp(name,pc->data[i].name)==0){pos=i;break;}}return pos; } void DelContact(Contact* pc) {if(pc->sz==0){printf("通讯录为空,无法删除\n");}//删除//1.找到删除人的位置char name[MAX_NAME];int pos=-1;int i;printf("输入删除人的名字;>\n");scanf("%s",name);pos=Find_name(pc,name);if(pos==-1){printf("要删的人不存在\n");}else{for(i=pos;i sz-1;i++){pc->data[i]=pc->data[i+1];}pc->sz--;printf("删除成功\n");} } void SearchContact(Contact* pc) {char name[MAX_NAME];printf("输入查找人的名字;>\n");scanf("%s",name);int pos=-1;pos=Find_name(pc, name);if(pos==-1){printf("查找的人不存在\n");}else{printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");printf("%-10s %-4d %-5s %-12s %-30s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);} } void ModifyContact(Contact* pc) {char name[MAX_NAME];printf("输入修改人的名字;>\n");scanf("%s",name);int pos=-1;pos=Find_name(pc, name);if(pos==-1){printf("修改人信息不存在\n");}else{printf("请输入名字\n");scanf("%s",pc->data[pos].name);printf("请输入年龄\n");scanf("%d",&(pc->data[pos].age));printf("请输入性别\n");scanf("%s",pc->data[pos].sex);printf("请输入电话号码\n");scanf("%s",pc->data[pos].tele);printf("请输入地址\n");scanf("%s",pc->data[pos].addr);printf("修改成功\n");} } int cmp_by_name(const void* e1,const void* e2) {return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name); } int cmp_by_gae(const void* e1,const void* e2) {return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age; } void SortContact(Contact* pc,int op) {if(op==1){qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);printf("排序成功\n");}if(op==2){qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_gae);printf("排序成功\n");} }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸