怎么用C语言脚本实现简易通讯录
怎么用C语言脚本实现简易通讯录
这篇文章主要介绍“怎么用C语言脚本实现简易通讯录”,在日常操作中,相信很多人在怎么用C语言脚本实现简易通讯录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言脚本实现简易通讯录”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
目标:通讯录可以存放1000个人信息,人的信息:性别名字年龄电话住址 菜单打印
1.增加联系人
2.删除联系人
3.查找联系人(修改)
4.名字排序联系人
5.展示
6.清空
分析:
首先通讯录存放联系人信息,还需知晓联系人个数,因此是个结构体类型
其次人的信息类型多,因此每个联系人也应为结构体类型
说明:
每个标题下展示的代码顺序:test.c (主函数测试运行) -> contact.h (功能函数声明)-> contact.c (功能函数实现)
菜单打印:
voidmenu(){printf("***************************\n");printf("***1.add2.del***\n");printf("***3.serch(modify)***\n");printf("***4.sort5.show***\n");printf("***0.exit6.clear***\n");printf("***************************\n");}intmain(){intinput=0;do{menu();printf("请选择->");scanf("%d",&input);switch(input){case1://增加信息break;case2://删除break;case3://查找(修改)break;case4://按名字排序break;case5://显示联系人信息break;case6://清空联系人break;case0://退出通讯录break;dafault:break;}}while(input);}
枚举优化:
上述菜单可以用枚举对代码可读性进行优化,改进如下:
enumOprion{Exit,Add,Del,Serch,Sort,Show,Clear};voidmenu(){printf("***************************\n");printf("***1.add2.del***\n");printf("***3.serch(modify)***\n");printf("***4.sort5.show***\n");printf("***0.exit6.clear***\n");printf("***************************\n");}intmain(){intinput=0;do{menu();printf("请选择->");scanf("%d",&input);switch(input){caseAdd://增加信息break;caseDel://删除break;caseSerch://查找(修改)break;caseSort://按名字排序break;caseShow://显示联系人信息break;caseClear://清空联系人break;caseExit://退出通讯录break;dafault:break;}}while(input);}
定义结构体
#defineMax1000#definename_Max20#definesex_Max5#defineaddr_Max30#definephone_Max12//结构体人的信息typedefstructPeoinfo{charname[name_Max];intage;charsex[sex_Max];charaddr[addr_Max];charphone[phone_Max];}Peoinfo;//结构体通讯录的信息typedefstructContact{Peoinfodata[1000];//存放数据intsz;//通讯录中有效信息的个数(里面有几个人)}Contact;
初始化
//完善菜单主函数部分intmain(){intinput=0;Contactcon;//通讯录InitContact(&con);//初始化通讯录do
//初始化通讯录voidInitContact(Contact*pc);//初始化通讯录voidInitContact(Contact*pc){assert(pc);pc->sz=0;memset(pc->data,0,sizeof(pc->data));//将数组初始化为0}
增加信息
caseAdd://增加信息AddContact(&con);break;//增加信息到通讯录voidAddContact(Contact*pc);//增加信息voidAddContact(Contact*pc){assert(pc);if(pc->sz==Max){printf("通讯录满了,无法添加\n");return0;}//输入信息printf("请输入名字:");scanf("%s",pc->data[pc->sz].name);//增加的信息应该在原有效信息位置后,用pc->sz指向对应位置printf("请输入年龄:");scanf("%d",&(pc->data[pc->sz].age));//age是个变量,注意需要取地址printf("请输入性别:");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:");scanf("%s",pc->data[pc->sz].phone);pc->sz++;//元素个数加一printf("添加成功\n");}
这里要注意通讯录已满的情况,并且添加信息时要注意是在原有效信息后得地址开始添加,防止重复。
删除信息
caseDel://删除DeletContact(&con);break;//删除voidDeletContact(Contact*pc);intFindByname(Contact*pc,charname[]){inti=0;for(i=0;i<pc->sz;i++){if(strcmp(pc->data[i].name,name)==0){returni;}}printf("没找到\n");return-1;}//删除信息voidDeletContact(Contact*pc){charname[name_Max];if(pc->sz==0){printf("通讯录为空,无法删除\n");}printf("请输入要删除人的名字:");scanf("%s",name);//实现查找函数intpos=FindByname(pc,name);//若找到返回下标,找不到则返回-1if(pos==-1){printf("无此人\n");}else{//删除--要删除元素后面的元素依次向前覆盖intj=0;for(j=pos;j<pc->sz-1;j++){pc->data[j]=pc->data[j+1];}pc->sz--;printf("删除成功\n");}}
这里要注意一个查找函数,输入名字来查找联系人,找到才能删除。
查找(修改)
caseSerch:printf("请输入要查找人的名字:");scanf("%s",name);FindByname(&con,name);break;//查找intFindByname(constContact*pc,charname[]);intFindByname(Contact*pc,charname[]){inti=0;for(i=0;i<pc->sz;i++){if(strcmp(pc->data[i].name,name)==0){intput=0;printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].phone);//找到后可以将内容展现出来printf("找着了\n请选择是否修改:1.是0.否\n");scanf("%d",&put);if(1==put){Modify(pc->data,i);}returni;}}printf("没找到\n");return-1;}
这里我将第二项删除功能的查找函数进行声明使用,并且将修改函数加入到查找函数中,两个功能联合到一起,但是在使用删除功能的时候会出现重复,这里要注意。
修改函数如下:
//修改voidModify(Contact*pc,inti){intbud=0;do{printf("请选择需要修改的内容\n1.名字2.年龄3.性别4.地址5.电话0.取消\n请输入:");scanf("%d",&bud);switch(bud){charchars[30]={0};case1:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].name,chars);}break;case2:{intnum=0;printf("请输入内容->");scanf("%d",&num);pc->data[i].age=num;}break;case3:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].sex,chars);}break;case4:printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].addr,chars);break;case5:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].phone,chars);}break;dafault:break;}}while(bud);}
修改用到了字符串函数strcpy
名字排序
caseSort:Sortname(&con);break;//名字排序voidSortname(Contact*pc);//name排序intcmp_int(constvoid*e1,constvoid*e2){return(strcmp(((Peoinfo*)e1)->name,((Peoinfo*)e2)->name));}voidSortname(Contact*pc){qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);ShowContact(pc);}
按名字排序这里,我用到了快速排序qsort函数来进行。排序后调用展示函数进行打印,来观察排序效果。
展示信息
caseShow://显示ShowContact(&con);break;//展示信息voidShowContact(constContact*pc);//展示信息voidShowContact(constContact*pc){assert(pc);inti=0;for(i=0;i<pc->sz;i++){printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].phone);//加负号左对齐,加/t统一每个元素间的距离}}
清空联系人
caseClear:ClearContact(&con);break;//清空所有联系人voidClearContact(Contact*pc);//清空所有联系人voidClearContact(Contact*pc){InitContact(pc);}
清空联系人,相当于再进行一遍初始化通讯录。
头文件统一在contact.h里面包含:
#include<stdio.h>#include<string.h>#include<assert.h>#include<stdlib.h>
test.c 和 contact.c 统一引用头文件 contact.h
#include"contact.h"
总程序如下
test.c
#include"contact.h"enumOprion{Exit,Add,Del,Serch,Sort,Show,Clear};voidmenu(){printf("***************************\n");printf("***1.add2.del***\n");printf("***3.serch(modify)***\n");printf("***4.sort5.show***\n");printf("***0.exit6.clear***\n");printf("***************************\n");}intmain(){intinput=0;Contactcon;//通讯录InitContact(&con);//初始化通讯录do{charname[name_Max];menu();printf("请选择->");scanf("%d",&input);switch(input){caseAdd://增加信息AddContact(&con);break;caseDel://删除DeletContact(&con);break;caseSerch:printf("请输入要查找人的名字:");scanf("%s",name);FindByname(&con,name);break;//case4:////修改//Modify(&con);//break;caseSort:Sortname(&con);break;caseShow://显示ShowContact(&con);break;caseClear:ClearContact(&con);break;caseExit:printf("退出通讯录\n");break;dafault:break;}}while(input);}
contact.h
//声明#include<stdio.h>#include<string.h>#include<assert.h>#include<stdlib.h>#defineMax1000#definename_Max20#definesex_Max5#defineaddr_Max30#definephone_Max12//结构体人的信息typedefstructPeoinfo{charname[name_Max];intage;charsex[sex_Max];charaddr[addr_Max];charphone[phone_Max];}Peoinfo;//结构体通讯录的信息typedefstructContact{Peoinfodata[1000];//存放数据intsz;//通讯录中有效信息的个数(里面有几个人)}Contact;//初始化通讯录voidInitContact(Contact*pc);//增加信息到通讯录voidAddContact(Contact*pc);//展示信息voidShowContact(constContact*pc);//删除voidDeletContact(Contact*pc);//查找intFindByname(constContact*pc,charname[]);//名字排序voidSortname(Contact*pc);//修改voidModify(Contact*pc,inti);//清空所有联系人voidClearContact(Contact*pc);
contact.c
#include"contact.h"//初始化通讯录voidInitContact(Contact*pc){assert(pc);pc->sz=0;memset(pc->data,0,sizeof(pc->data));//将数组初始化为0}//增加信息voidAddContact(Contact*pc){assert(pc);if(pc->sz==Max){printf("通讯录满了,无法添加\n");return0;}//输入信息printf("请输入名字:");scanf("%s",pc->data[pc->sz].name);//增加的信息应该在原有效信息位置后,用pc->sz指向对应位置printf("请输入年龄:");scanf("%d",&(pc->data[pc->sz].age));//age是个变量,注意需要取地址printf("请输入性别:");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:");scanf("%s",pc->data[pc->sz].phone);pc->sz++;//元素个数加一printf("添加成功\n");}//展示信息voidShowContact(constContact*pc){assert(pc);inti=0;for(i=0;i<pc->sz;i++){printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].phone);//加负号左对齐,加/t统一每个元素间的距离}}intFindByname(Contact*pc,charname[]){inti=0;for(i=0;i<pc->sz;i++){if(strcmp(pc->data[i].name,name)==0){intput=0;printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].phone);printf("找着了\n请选择是否修改:1.是0.否\n");scanf("%d",&put);if(1==put){Modify(pc->data,i);}returni;}}printf("没找到\n");return-1;}//删除信息voidDeletContact(Contact*pc){charname[name_Max];if(pc->sz==0){printf("通讯录为空,无法删除\n");}printf("请输入要删除人的名字:");scanf("%s",name);//实现查找函数intpos=FindByname(pc,name);//若找到返回下标,找不到则返回-1if(pos==-1){printf("无此人\n");}else{//删除--要删除元素后面的元素依次向前覆盖intj=0;for(j=pos;j<pc->sz-1;j++){pc->data[j]=pc->data[j+1];}pc->sz--;printf("删除成功\n");}}//name排序intcmp_int(constvoid*e1,constvoid*e2){return(strcmp(((Peoinfo*)e1)->name,((Peoinfo*)e2)->name));}voidSortname(Contact*pc){qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);ShowContact(pc);}//修改voidModify(Contact*pc,inti){intbud=0;do{printf("请选择需要修改的内容\n1.名字2.年龄3.性别4.地址5.电话0.取消\n请输入:");scanf("%d",&bud);switch(bud){charchars[30]={0};case1:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].name,chars);}break;case2:{intnum=0;printf("请输入内容->");scanf("%d",&num);pc->data[i].age=num;}break;case3:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].sex,chars);}break;case4:printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].addr,chars);break;case5:{printf("请输入内容->");scanf("%s",chars);strcpy(pc->data[i].phone,chars);}break;dafault:break;}}while(bud);}//清空所有联系人voidClearContact(Contact*pc){InitContact(pc);}
到此,关于“怎么用C语言脚本实现简易通讯录”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!