版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言实现通讯录功能的流程与代码用C语言制作一个拥有添加,删除,查找,修改,排序,清空,打印功能的通讯录
用分模块的方法来实现这个通讯录,函数的声明,类型的声明放在一个.h文件中,函数的实现放在一个.c文件中,在主文件中来调用函数。
首先创建一个test.c文件用来测试并且实现通讯录的功能
通讯录需要显示一个菜单来让用户具体选择哪个功能,那么在test.c文件中就需要打印出来一个菜单,如下代码:
#includestdio.h
voidmenu()
printf("***********************************\n");
printf("******1.add2.del******\n");
printf("******3.search4.modify******\n");
printf("******5.sort6.empty******\n");
printf("******7.print0.exit******\n");
printf("***********************************\n");
intmain()
//通讯录:1.add2.del3.search4,modify5.sort6.empty7.print0.exit
menu();
}while(0);
return0;
}
接着就要让用户选择输入某个数组来使用通讯录的功能,这时就可以用一个switch开关来实现了,如下代码:
intinput=0;
menu();
printf("请选择功能
scanf("%d",input);
switch(input)
case1:
break;
case2:
break;
case3:
break;
case4:
break;
case5:
break;
case6:
break;
case7:
break;
case0:
break;
default:
printf("请重新输入\n");
break;
}while(input);
在while循环的条件判断部分直接写input,这样选择输入0的时候就直接跳出循环了,输入其他数字可以继续使用通讯录的功能。
case后面跟着的都是数字,有时候调试代码的时候比较容易忘记这个数字表示的是什么意思,所以这个时候可以用创建一个枚举类型来定义对应的枚举常量。
创建一个contact.h文件来放类型的定义,函数的声明。
然后把枚举类型在里面进行声明
enuminput
Exit,
add,
sub,
search,
modify,
sort,
empty,
};
之后要在主文件中调用这个头文件
#include"contact.h"
同时可以把#includestdio.h这些库函数的引用都放到contact.h这个文件当中,这样要引用新的库函数时只需要在contact.h这个文件中添加就可以了。
这样switch开关中的代码就可以改成这样了:
switch(input)
caseadd:
break;
casesub:
break;
casesearch:
break;
casemodify:
break;
casesort:
break;
caseempty:
break;
caseprint:
break;
caseExit:
break;
}
然后开始用函数去实现每一个函数的功能,首先是添加功能,在添加之前,还得需要一个空的通讯录,来存放添加进去的通讯人的数据,而通讯人的数据有姓名,年龄,性别,电话号码,地址这些数据,都是一些不同类型的值,这时可以声明一个结构体类型来包含这些成员
好,切到contact.h文件来声明一个结构体类型:
typedefstructPeople
charname[20];
intage;
charsex[5];
charphone[20];
charaddress[30];
}People;
同时还对这个类型重命名了一下,方便后续使用这个结构体类型,这是需要考虑到通讯录存放数据多少的问题,如果address里面存放的内容放不下了,这是就需要对数组的大小进行更改,那这时就要先找到这个结构体类型才能更改了,如果代码写的比较多的话就会比较乱,所以可以用#define定义的标识符常量来定义这些值,以后要改的话就只需要找到#define就可以了
如下代码:
#defineNameMax20
#defineSexMax5
#definePhoneMax20
#defineAddressMax30
typedefstructPeople
charname[NameMax];
intage;
charsex[SexMax];
charphone[PhoneMax];
charaddress[AddressMax];
}People;
因为这里是不同类型的值的定义,所以用#define来定义而不用枚举类型来定义,因为枚举类型是用来列举相同类型的值的,比如前面的通讯录功能都是属于通讯录的功能一类的值
下一步,通讯录不只存放一个人的数据,所以需要用这个结构体类型来创建一个数组,假设这个通讯录可以存放1000个人的数据,同时还能记录其中已存放了多少个人
那么可以在主函数中这么写:
intmain()
//通讯录:1.add2.del3.search4,modify5.sort6.empty7.print0.exit
Peoplecontact[1000];
intnum;
对于这个通讯录和这个通讯人的数量,这两个变量可以两者之间是由联系的,那么此时就可以再声明一个结构体类型来包含这两个成员。
切到contact.h文件:
typedefstructContact
Peoplepeople[1000];
intnum;
}Contact;
声明好这个通讯录类型之后,需要在主文件中用这个类型创建一个变量,同时对变量的内容进行初始化
intmain()
//通讯录:1.add2.del3.search4,modify5.sort6.empty7.print0.exit
Contactcontact;
InitialContact(contact);
切到contact.h文件声明函数:
//函数的声明
//通讯录初始化
voidInitialContact(Contact*pc);
此时创建一个contact.c文件来实现函数的内容:
切到contact.c文件:
#include"contact.h"
voidInitialContact(Contact*pc)
memset(pc,0,sizeof(*pc));
}
要记得引这个contact.h头文件
在对通讯录的内容进行完初始化之后,可以开始往里面添加通讯人的信息了,再声明一个函数:
test.c:
caseadd:
printf("添加通讯人\n");
AddPeople(contact);
break;
contact.h:
//添加通讯人
voidAddPeople(Contact*pc);
contact.c:
voidAddPeople(Contact*pc)
if(pc-num==1000)
printf("通讯录已满\n");
return;
printf("请输入姓名
scanf("%s",pc-people[pc-num].name);
printf("请输入年龄
scanf("%d",pc-people[pc-num].age);
printf("请输入性别
scanf("%s",pc-people[pc-num].sex);
printf("请输入电话
scanf("%s",pc-people[pc-num].phone);
printf("请输入地址
scanf("%s",pc-people[pc-num].address);
pc-num++;
}
输入完成之后,要记得让通讯人数量+1
接下来可以尝试显示一下通讯录中的通讯人信息了
contact.h:
//显示通讯人信息
voidPrintContact(constContact*pc);
contact.c:
voidPrintContact(constContact*pc)
printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年龄","性别","电话","地址");
inti=0;
for(i=0;ipc-i++)
printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[i].name,pc-people[i].age,pc-people[i].sex,pc-people[i].phone,pc-people[i].address);
}
在前面打印个通讯人列表修饰一下
test.c:
caseprint:
printf("显示通讯人信息\n");
PrintContact(contact);
break;
接下来,开始实现通讯录的删除功能:
可以通过让用户输入某个人的名字来删除这个人在通讯录中的信息,删除功能的实现分为两步,第一步,是需要找到这个人,第二步,删除这个人在通讯录中的信息
contact.h:
//删除通讯人信息
voidSubPeople(Contact*pc);
contact.c:
intFindByName(Contact*pc,constchar*name)
//遍历每一个contact结构体中people数组成员中的已存放数据的每一个结构体
inti=0;
for(i=0;isizeof(pc-num);i++)
if(strcmp(pc-people[i].name,name)==0)
returni;//找到了返回对应结构体的下标
return-1;//找不到就返回-1
voidSubPeople(Contact*pc)
if(pc-num==0)//先判断通讯录中有无存储信息
printf("通讯录已清空\n");
return;
//1.找到
printf("请输入要删除的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要删除的人\n");
return;//让函数直接返回
//2.删除
//从找到的那个下标位置开始,后面的数组元素(通讯人结构体)依次往前赋值
intj=0;
for(j=ret;jpc-num-1;j++)
pc-people[j]=pc-people[j+1];
printf("删除成功\n");
pc-num--;//通讯人数量-1
}
test.c:
casesub:
SubPeople(contact);
break;
每完成一个功能,都要去尝试运行一下,看有没有bug,否则最后才去找bug可能会比较麻烦。
在删除功能中,用到了一个自己写的FindByName函数,然后在接下来的通讯录查找功能实现中,同样也要依赖这个函数,不仅如此,在通讯录修改功能中,也要用到这个函数,而这个函数的实现是为了删除、查找和修改功能而声明的,所以可以不用写在contact.h头文件中进行声明。
下面,来开始实现查找功能:
contact.h:
//查找通讯人
voidSearchPeople(constContact*pc);
contact.c:
voidSearchPeople(constContact*pc)
//查找
printf("请输入要查找的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要查找的人\n");
return;//让函数直接返回
//显示
printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年龄","性别","电话","地址");
printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[ret].name,pc-people[ret].age,pc-people[ret].sex,pc-people[ret].phone,pc-people[ret].address);
}
test.c:
casesearch:
SearchPeople(contact);
break;
查找功能已经实现了,接下来就要实现修改功能了,先通过通讯人的姓名找到需要修改的结构体对应的下标,然后重新对这个结构体进行赋值就可以了
contact.h:
//修改通讯人信息
voidModifyPeople(Contact*pc);
contact.c:
voidModifyPeople(Contact*pc)
//查找
printf("请输入要修改的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要修改的人\n");
return;//让函数直接返回
//修改
printf("请输入要修改的姓名
scanf("%s",pc-people[ret].name);
printf("请输入要修改的年龄
scanf("%d",pc-people[ret].age);
printf("请输入要修改的性别
scanf("%s",pc-people[ret].sex);
printf("请输入要修改的电话
scanf("%s",pc-people[ret].phone);
printf("请输入要修改的地址
scanf("%s",pc-people[ret].address);
}
test.c:
casemodify:
ModifyPeople(contact);
break;
接下来可以开始实习通讯录的排序功能了,这里就按照年龄来进行一个排序,用到qsort这个函数,其中cmp函数需要自己去写
contact.h:
//排序
voidSortByAge(Contact*pc);
contact.c:
intcmp(constvoid*e1,constvoid*e2)
Contact*p1=(Contact*)e1;
Contact*p2=(Contact*)e2;
if(p1-people[0].agep2-people[1].age)
return1;
elseif(p1-people[0].agep2-people[1].age)
return-1;
else
return0;
voidSortByAge(Contact*pc)
if(pc-num==0)
printf("通讯录已清空\n");
return;
intnum=pc-
intwidth=sizeof(pc-people[0]);
qsort(pc-people,num,width,cmp);
}
test.c:
casesort:
printf("按照年龄排序\n");
SortByAge(contact);
PrintContact(contact);
break;
到这里通讯录的功能就只剩下清空了,可以用到一开始的初始化函数InitialContact
test.c:
caseempty:
printf("清空通讯录\n");
InitialContact(contact);
break;
现在通讯录的功能已经全部实现了
可是这个通讯录的功能还是有点不太好,就是通讯录默认的大小就是存放1000个人的数据,那么能不能创建一个可以随着添加人数的增加而变大的通讯录呢?鉴于最近学习了动态内存管理,所以对通讯录的功能做出了一点改进
对结构体类型的修改:
contact.h
typedefstructContact
People*people;
intnum;
intcapacity;//通讯录的容量
}Contact;
contact.c:
对InitialContact函数的修改:
voidInitialContact(Contact*pc)
pc-people=(People*)calloc(3,sizeof(People));
if(pc-people==NULL)
perror("calloc");
return;
pc-num=0;
pc-capacity=3;
}
对AddPeople函数的修改:
voidAddPeople(Contact*pc)
if(pc-num==pc-capacity)
pc-people=realloc(pc-people,(pc-capacity+2)*sizeof(People));
if(pc-people==NULL)
perror("realloc");
return;
pc-capacity+=2;
printf("请输入姓名
scanf("%s",pc-people[pc-num].name);
printf("请输入年龄
scanf("%d",pc-people[pc-num].age);
printf("请输入性别
scanf("%s",pc-people[pc-num].sex);
printf("请输入电话
scanf("%s",pc-people[pc-num].phone);
printf("请输入地址
scanf("%s",pc-people[pc-num].address);
pc-num++;
}
对排序函数中cmp函数的修改:
intcmp(constvoid*e1,constvoid*e2)
People*p1=(People*)e1;
People*p2=(People*)e2;
if(p1-agep2-age)
return1;
elseif(p1-agep2-age)
return-1;
else
return0;
}
test.c:
部分修改:
caseempty:
printf("清空通讯录\n");
FreeContact(contact);
break;
caseExit:
FreeContact(contact);
break;
如下是完整的代码:
contact.h:
#includestdio.h
#includestring.h
#includestdlib.h
#includectype.h
//类型的声明
#defineNameMax20
#defineSexMax5
#definePhoneMax20
#defineAddressMax30
enuminput
Exit,
add,
sub,
search,
modify,
sort,
empty,
typedefstructPeople
charname[NameMax];
intage;
charsex[SexMax];
charphone[PhoneMax];
charaddress[AddressMax];
}People;
typedefstructContact
People*people;
intnum;
intcapacity;//通讯录的容量
}Contact;
//函数的声明
//通讯录初始化
voidInitialContact(Contact*pc);
//添加通讯人
voidAddPeople(Contact*pc);
//显示通讯人信息
voidPrintContact(constContact*pc);
//删除通讯人信息
voidSubPeople(Contact*pc);
//查找通讯人
voidSearchPeople(constContact*pc);
//修改通讯人信息
voidModifyPeople(Contact*pc);
voidSortByAge(Contact*pc);
//销毁通讯录
voidFreeContact(Contact*pc);
contact.c:
#include"contact.h"
voidInitialContact(Contact*pc)
pc-people=(People*)calloc(3,sizeof(People));
if(pc-people==NULL)
perror("calloc");
return;
pc-num=0;
pc-capacity=3;
voidAddPeople(Contact*pc)
if(pc-num==pc-capacity)
pc-people=realloc(pc-people,(pc-capacity+2)*sizeof(People));
if(pc-people==NULL)
perror("realloc");
return;
pc-capacity+=2;
printf("请输入姓名
scanf("%s",pc-people[pc-num].name);
printf("请输入年龄
scanf("%d",pc-people[pc-num].age);
printf("请输入性别
scanf("%s",pc-people[pc-num].sex);
printf("请输入电话
scanf("%s",pc-people[pc-num].phone);
printf("请输入地址
scanf("%s",pc-people[pc-num].address);
pc-num++;
voidPrintContact(constContact*pc)
printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年龄","性别","电话","地址");
inti=0;
for(i=0;ipc-i++)
printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[i].name,pc-people[i].age,pc-people[i].sex,pc-people[i].phone,pc-people[i].address);
intFindByName(Contact*pc,constchar*name)
//遍历每一个contact结构体中people数组成员中的已存放数据的每一个结构体
inti=0;
for(i=0;isizeof(pc-num);i++)
if(strcmp(pc-people[i].name,name)==0)
returni;//找到了返回对应结构体的下标
return-1;//找不到就返回-1
voidSubPeople(Contact*pc)
if(pc-num==0)//先判断通讯录中有无存储信息
printf("通讯录已清空\n");
return;
//1.找到
printf("请输入要删除的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要删除的人\n");
return;//让函数直接返回
//2.删除
//从找到的那个下标位置开始,后面的数组元素(通讯人结构体)依次往前赋值
intj=0;
for(j=ret;jpc-num-1;j++)
pc-people[j]=pc-people[j+1];
printf("删除成功\n");
pc-num--;//通讯人数量-1
voidSearchPeople(constContact*pc)
//查找
printf("请输入要查找的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要查找的人\n");
return;//让函数直接返回
//显示
printf("%-20s%-20s%-20s%-20s%-20s\n","姓名","年龄","性别","电话","地址");
printf("%-20s%-20d%-20s%-20s%-20s\n",pc-people[ret].name,pc-people[ret].age,pc-people[ret].sex,pc-people[ret].phone,pc-people[ret].address);
voidModifyPeople(Contact*pc)
//查找
printf("请输入要修改的人的姓名;
charname[NameMax];
scanf("%s",name);
intret=FindByName(pc,name);//用以接收放回的数组下标
if(ret==-1)
printf("找不到要修改的人\n");
return;//让函数直接返回
//修改
printf("请输入要修改的姓名
scanf("%s",pc-people[ret].name);
printf("请输入要修改的年龄
scanf("%d",pc-people[ret].age);
printf("请输入要修改的性别
scanf("%s",pc-people[ret].sex);
printf("请输入要修改的电话
scanf("%s",pc-people[ret].phone);
printf("请输入要修改的地址
scanf("%s",pc-people[ret].address);
intcmp(constvoid*e1,constvoid*e2)
People*p1=(People*)e1;
People*p2=(People*)e2;
if(p1-agep2-age)
return1;
elseif(p1-agep2-age)
return-1;
else
return0;
voidSortByAge(C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 注册会计师战略中ESG战略实施的管理体系
- 2026年企业借款合同法律效力认定标准
- 2026重庆市璧山区人民医院上半年编外人才招聘41人备考题库及参考答案详解(考试直接用)
- 2026广东广州市白云区人民政府松洲街道办事处第一次招聘项目人员9人备考题库含答案详解(b卷)
- 2026河南黄金叶投资管理有限公司所属企业大学生招聘18人备考题库(含答案详解)
- 2026广西崇左天等县市场监督管理局招聘编外工作人员1人备考题库带答案详解(满分必刷)
- 2026山东青岛海关缉私局警务辅助人员招聘10人备考题库及参考答案详解(综合题)
- 2026中盐东兴盐化股份有限公司招聘17人备考题库带答案详解(培优)
- 2026春季浙商银行校园招聘备考题库附参考答案详解(综合卷)
- 2026四川内江市隆昌市普润镇人民政府招聘1人备考题库附答案详解(基础题)
- 钢坯斜坡辊道施工方案
- 2026年南京机电职业技术学院单招职业技能考试必刷测试卷附答案
- 湖北省襄阳市第四中学2025-2026学年高三上学期英语测试(六)(含答案含听力原文无音频)
- 毛尖茶的营销方案
- DB45-T 2721-2023 珍贵树种移植技术规程
- 门面装修备案申请书
- 注射用亚胺培南西司他丁钠氯化钠注射液-临床用药解读
- 2025年江西省高考思想政治试卷真题(含标准答案)
- 咨询费居间协议合同范本
- 《流体力学》课件(共十三章)
- 2025年广东省深圳市各区综合网格员招聘考试(综合素质测试)复习题及答案
评论
0/150
提交评论