还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言课程设计报告——手机通讯录管理系统
一、题目要求模拟手机通讯录管理系统,实现对手机中的通讯录进行管理功能要求如下
(1)查看功能选择此功能时,列出下列三类选择A办公类B个人类C商务类当选中某类时,显示出此类所有数据中的姓名和电话号码
(2)增加功能能录入新数据一个结点包括姓名、电话号码、分类(办公类、个人类、商务类)、电子邮件例如杨春13589664454商务类chuny@
126.com当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号
(3)修改功能选中某个人的姓名时,可对此人的相应数据进行修改
(4)删除功能选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号
二、需求分析根据题目要求,由于通讯录信息是放在文件里的,所以应提供文件的输入、输出等操作;在程序中需要查看、修改通讯录,应提供查找、增加、修改、删除等操作;另外还应提供键盘是选择菜单实现功能选择
三、总体设计根据需求,这个系统分为以下模块查找数据、增加数据、修改数据、删除数据(见图1)
四、详细设计
1.主函数主函数设计得很简洁只是调用了一个主目录的子函数剩下的操作全集中在主目录中[流程图](见图2)2.各功能模块设计
(1)主目录模块[需求分析]通过主目录选择各功能,主要是通过用菜单模式调用各模块函数实现的[流程图](见图3)
(2)增加模块[需求分析]该模块的功能是输入的通讯信息,并将其自动编号添加到文件中,而且在最后可以选择其他内容或者退出[数据结构]通讯录信息是放在文件txl.txt里的每一条通讯信息从文件中读出来后用结构体的形式存放因此我定义了以下结构体数组,并且定义了一个全局变量i来表示数组的下标structperson{intnum;/*编号*/charname
[20];/*姓名*/chartelnum
[12];/*电话号码*/charemail
[30];/*电子邮件*/inttype;/*分类的编号*/chartype_name
[10];/*分类的名字*/}per
[15];inti;/*定义的全局变量*/[流程图](见图4)
(3)查看模块[需求分析]该模块的功能是可以查看各分类以及所有人的通讯信息,并在最后可以选择其他内容或者退出[流程图](见图5)
(4)修改模块[需求分析]该模块的功能是显示所有通讯信息,显示完后,输入要修改的人的姓名,根据姓名查找通讯记录,并提示选择要修改哪部分的信息,是姓名、电话号码、电子邮件、分类还是全部修改,并且输入修改的内容然后显示修改的信息,并将修改后的信息存入文件中最后,还可以选择其他内容或者退出[流程图](见图6)
(5)删除模块[需求分析]该模块的功能是显示显示所有通讯信息,显示完后,输入要删除的人的姓名,根据姓名查找通讯记录并删除删除后,将该信息后的信息重新编号并存入文件最后,还可以选择其他内容或者退出[流程图](见图7)
3.公共函数
(1)读文件函数all_read[说明]该函数用来读取文件txl.txt中的通讯信息并放在结构体数组per
[15]中[程序]voidall_read{voidtype_set2structperson*p2;/*声明函数的调用*/FILE*fp;/*定义文件指针变量*fp*/iffp=fopentxl.txtr==NULL{printfcannotopenthisfile.\n;exit0;}rewindfp;/*使位置指针指向文件开始*/fori=0;i15;i++{fscanffp%d%s%s%s%s\nper[i].numper[i].nameper[i].telnumper[i].emailper[i].type_name;type_set2per[i];ifper[i].num==0break;}/*在文件末尾时停止*/fclosefp;}
(2)分类转换函数1)编号→名字type_set1structperson*p1[说明]该函数是用来将输入的分类编号转换成相应的分类名称并放在结构体变量的type_name成员中其中形参structperson*p1是指向结构体变量的指针,传送结构体变量的地址[程序]voidtype_set1structperson*p1{switchp1-type/*将相应的内容通过指针存到结构体成员中*/{case1:strcpyp1-type_name办公类;break;case2:strcpyp1-type_name个人类;break;case3:strcpyp1-type_name商务类;break;}}2)名字→编号type_set2structperson*p2[说明]该函数是用来将分类名称转换成相应的分类编号并放在结构体变量的type成员中其中形参structperson*p2是指向结构体变量的指针,传送结构体变量的地址[程序]voidtype_set2structperson*p2{ifstrcmpp2-type_name办公类==0p2-type=1;elseifstrcmpp2-type_name个人类==0p2-type=2;elseifstrcmpp2-type_name商务类==0p2-type=3;}/*将相应的编号存到结构体成员中*/
五、总程序#includestdio.h#includestring.hstructperson/*定义结构体person*/{intnum;/*编号*/charname
[20];/*姓名*/chartelnum
[12];/*电话号码*/charemail
[30];/*电子邮件*/inttype;/*分类的编号*/chartype_name
[10];/*分类的名字*/}per
[15];inti;/*定义的全局变量*//********************主目录模块********************/voidmeun{intna;/*定义n表示相应选项的编号,a用来判断n是否超出范围*/voidviewaddmodifydelexit;/*定义的各功能模块的子函数*/do{printf\t\t*********************通讯录目录*********************\n\n;printf\t\t\t\t\t
1.查看\n;printf\t\t\t\t\t
2.增加\n;printf\t\t\t\t\t
3.修改\n;printf\t\t\t\t\t
4.删除\n;printf\t\t\t\t\t
5.退出\n\n;printf\t\t****************************************************\n;printf请选择1-5:;scanf%dn;/*输入n*/ifn1||n5a=1;/*对选择的数字作判断*/elsea=0;}whilea==1;switchn{case1:view;break;/*查看模块*/case2:add;break;/*增加模块*/case3:modify;break;/*修改模块*/case4:del;break;/*删除模块*/case5:exit0;/*退出*/}}/*读文件函数*/voidall_read{voidtype_set2structperson*p2;/*声明函数的调用*/FILE*fp;/*定义文件指针变量*fp*/iffp=fopentxl.txtr==NULL/*打开文件并判断文件能否打开*/{printfcannotopenthisfile.\n;exit0;}rewindfp;/*使位置指针指向文件开始*/fori=0;i15;i++{fscanffp%d%s%s%s%s\nper[i].numper[i].nameper[i].telnumper[i].emailper[i].type_name;type_set2per[i];/*根据结构体成员type_name在成员type中写如相应的信息*/ifper[i].num==0break;/*在文件末尾时停止*/}fclosefp;}/*分类转换函数编号→名字*/voidtype_set1structperson*p1{switchp1-type/*将相应的内容通过指针复制到结构体成员中*/{case1:strcpyp1-type_name办公类;break;case2:strcpyp1-type_name个人类;break;case3:strcpyp1-type_name商务类;break;}}/*分类转换函数名字→编号*/voidtype_set2structperson*p2{ifstrcmpp2-type_name办公类==0p2-type=1;elseifstrcmpp2-type_name个人类==0p2-type=2;elseifstrcmpp2-type_name商务类==0p2-type=3;}/*将相应的编号存到结构体成员中*//********************查看模块********************//**********搜索函数**********/voidsearchintp/*形参p表示要查看的分类编号*/{inti2n3a3;all_read;/*读出文件中的所有信息*/printf编号姓名电话号码电子邮件分类\n;fori2=0;i2i;i2++{ifper[i2].type==p/*当结构体成员type与p相同时打印信息*/printf%2d%-15s%12s%-30s%s\nper[i2].numper[i2].nameper[i2].telnumper[i2].emailper[i2].type_name;}printf\n请问是返回目录1继续查找2还是退出3?请选择;scanf%dn3;/*下一步操作的选择*/do{ifn31||n33a3=1;elsea3=0;}whilea3==1;switchn3{case1:meun;break;case2:view;break;case3:exit0;}}/**********查看所有函数**********/voidall_view{inti3n4a4;printf编号姓名电话号码电子邮件分类\n;fori3=0;i3i;i3++printf%2d%-15s%12s%-30s%s\nper[i3].numper[i3].nameper[i3].telnumper[i3].emailper[i3].type_name;printf\n请问是返回目录1继续查找2还是退出3?请选择;scanf%dn4;do{ifn41||n43a4=1;elsea4=0;}whilea4==1;switchn4{case1:meun;break;case2:view;break;case3:exit0;}}/**********查看函数**********/voidview{inta1n1;do{printf\n\t\t\t***************查看通讯录***************\n\n;printf\t\t\t\t\t
1.办公类\n;printf\t\t\t\t\t
2.个人类\n;printf\t\t\t\t\t
3.商务类\n;printf\t\t\t\t\t
4.全部\n;printf\t\t\t\t\t
5.返回主菜单\n\n;printf\t\t\t****************************************\n;printf请选择1-5:;scanf%dn1;ifn11||n15a1=1;elsea1=0;}whilea1==1;switchn1{case1:searchn1;break;case2:searchn1;break;case3:searchn1;break;case4:all_read;all_view;break;case5:meun;break;}}/********************增加模块********************/voidadd{inti1n2a2b1;structpersonj;FILE*fp1;printf\n\t\t\t***************添加通讯录***************\n\n;do{printf分类
1.办公类
2.个人类
3.商务类:;scanf%dj.type;ifj.type1||j.type3/*判断结构体成员type是否在1-3之间*/{b1=1;printf\n!!!输入的数字超出范围,请重新输入!!!\n;}elseb1=0;}whileb1==1;printf电话号码:;scanf%sj.telnum;printf姓名:;scanf%sj.name;printf电子邮件:;scanf%sj.email;/*按条目输入信息*/all_read;j.num=i+1;/*给信息自动编号*/ifj.num15/*判断通讯录是否已满*/{printf\n通讯录已满,请删除后再添加\n;del;/*要删除后再添加*/}fori1=0;i1i;i1++/*判断输入是否重复*/{ifstrcmpj.nameper[i1].name==0strcmpj.telnumper[i1].telnum==0{printf\n输入重复,请重新输入\n;add;/*重新输入*/}}iffp1=fopentxl.txta==NULL{printfcannotopenthisfile.\n;exit0;}type_set1j;/*根据结构体成员type在成员type_name中写如相应的信息*/fprintffp1%d%s%s%s%s\nj.numj.namej.telnumj.emailj.type_name;fclosefp1;printf\n保存成功!!!^*^\n\n请问是返回目录1继续添加2还是退出3?请选择;scanf%dn2;do{ifn21||n23a2=1;elsea2=0;}whilea2==1;switchn2{case1:meun;break;case2:add;break;case3:exit0;}}/********************修改模块********************/voidmodify{intn5n6a5i4b2;structpersonk;FILE*fp2;printf\n\t\t\t***************修改通讯录***************\n\n;all_read;printf\n\t\t通讯录\n编号姓名电话号码电子邮件分类\n;fori4=0;i4i;i4++printf%2d%-15s%12s%-30s%s\nper[i4].numper[i4].nameper[i4].telnumper[i4].emailper[i4].type_name;/*显示所有通讯录信息*/printf请输入要修改的人的姓名;scanf%sk.name;/*输入要修改的人的姓名*/fori4=0;i415;i4++{ifstrcmpk.nameper[i4].name==0{k=per[i4];break;/*找到通讯录中要修改的人的信息,调用,再打破循环*/}}ifi4==15/*判断循环完毕后是否找到了要修改的人的信息*/{printf\n没有这个人存在,请重新输入名字\n;modify;/*重新输入*/}do{printf请问要修改什么信息?
1.所有的
2.姓名
3.电话号码
4.电子邮件
5.分类[
1.办公类
2.个人类
3.商务类]\n;scanf%dn6;switchn6{case1:printf请输入要修改的信息\n;scanf%sk.name;scanf%sk.telnum;scanf%sk.email;scanf%dk.type;type_set1k;break;case2:printf请输入要修改的信息\n;scanf%sk.name;break;case3:printf请输入要修改的信息\n;scanf%sk.telnum;break;case4:printf请输入要修改的信息\n;scanf%sk.email;break;case5:printf请输入要修改的信息\n;scanf%dk.type;type_set1k;break;}ifn61||n65/*判断输入的编号是否在1-5之间*/{b2=1;printf\n!!!输入的数字超出范围,请重新输入!!!\n;}elseb2=0;}whileb2==1;per[i4]=k;/*将修改后的信息覆盖原有的信息*/iffp2=fopentxl.txtw==NULL{printfcannotopenthisfile.\n;exit0;}fori4=0;i4i;i4++fprintffp2%d%s%s%s%s\nper[i4].numper[i4].nameper[i4].telnumper[i4].emailper[i4].type_name;fclosefp2;printf\n修改后的信息为\n%2d%-15s%12s%-30s%s\nk.numk.namek.telnumk.emailk.type_name;printf\n修改成功!!!o∩_∩o\n;printf\n请问是返回目录1继续修改2还是退出3?请选择;scanf%dn5;do{ifn51||n53a5=1;elsea5=0;}whilea5==1;switchn5{case1:meun;break;case2:modify;break;case3:exit0;}}/********************删除模块********************/voiddel{intjki5n6a6;charname
[20];FILE*fp3;printf\n\t\t\t***************删除通讯录***************\n\n;all_read;printf\n\t\t通讯录\n编号姓名电话号码电子邮件分类\n;fori5=0;i5i;i5++printf%2d%-15s%12s%-30s%s\nper[i5].numper[i5].nameper[i5].telnumper[i5].emailper[i5].type_name;printf请输入要删除的人的姓名;scanf%sname;fori5=0;i515;i5++{ifstrcmpnameper[i5].name==0break;/*找到通讯录中要删除的人的信息后打破循环*/}ifi5==15{printf\n没有这个人存在,请重新输入名字\n;del;/*重新输入*/}forj=i5;j15;j++{ifper[j+1].num==0break;/*当循环值信息末尾,结束循环*/per[j]=per[j+1];/*将删除的人后面的信息向前挪一位*/per[j].num=j+1;/*同时自动改变编号*/}iffp3=fopentxl.txtw==NULL{printfcannotopenthisfile.\n;exit0;}fork=0;kj;k++fprintffp3%d%s%s%s%s\nper[k].numper[k].nameper[k].telnumper[k].emailper[k].type_name;fclosefp3;printf删除成功!!!*^__^*\n;printf\n请问是返回目录1继续删除2还是退出3?请选择;scanf%dn6;do{ifn61||n63a6=1;elsea6=0;}whilea6==1;switchn6{case1:meun;break;case2:del;break;case3:exit0;}}/********************主函数********************/voidmain{meun;}
六、运行结果下面是各个模块运行时的图像
1.主目录模块(见图8)
2.增加模块
(1)成功添加时的运行图像(见图9)
(2)重复添加时的运行图像(见图10)
(3)通讯录已满时的运行图像(见图11)
3.查看模块(见图12)
4.修改模块(见图13)
5.删除模块(见图14)图1系统功能模块图手机通讯录管理系统查找数据增加数据修改数据删除数据图2主函数流程图开始调用主目录模块函数meun显示一系列功能选项根据n的值调用各功能模块函数输入n判断n是否是1-5否是调用查看模块view调用增加模块add调用修改模块modify调用删除模块del退出
[1]
[2]
[3]
[4]
[5]图3主目录模块流程图输入所选分类的编号j.type依次输入电话号码j.telnum、姓名j.name、电子邮件j.email提示存储已满,调用删除函数del,对已存信息进行删除提示重新输入,并再次调用增加函数add调用读文件函数all_read给这一条信息编号j.num以追加的方式打开文件txl.txt调用分类转换函数type_set1,将编号转成对映的名字判断j.type是否是1-3判断j.num是否大于15i1从0到i(从all_read中得到)判断输入的姓名和电话号码是否有重复的在文件末尾写入信息,并关闭文件输入n2,选择下一步判断n2是否是1-3根据n2的值调用各功能模块函数显示功能标题否是提示超出范围,重新输入是否否是图4增加模块流程图根据n3的值调用各功能模块函数判断n3是否是1-3调用搜索函数sreachn1显示一系列查看选项调用all_read读文件输入n1调用all_read读文件调用查看所有函数all_view根据n1的值调用各函数打印所选分类的通讯信息打印所有的通讯信息输入n3,选择下一步输入n4,选择下一步判断n1是否是1-5判断n4是否是1-3根据n4的值调用各功能模块函数退出否是是是否否图5查看模块流程图
[1]、
[2]或
[3]
[4]
[5]显示功能标题否是判断n5是否是1-3i4从0到15判断输入的姓名和文件中的是否有相同的调用all_read读文件打印文件中所有的通讯信息输入要修改的人的姓名以只写的方式打开文件txl.txt提示没有这个人存在,重新输入将这条信息per[i4]存入结构体k,跳出循环,选择要修改信息的编号n6判断n6是否是1-5i4从0到i写入结构体数组per[i4]的所有内容,并关闭文件将k再次存入per[i4]输入要修改的信息提示超出范围,重新输入打印修改后的信息根据n5的值调用各功能模块函数输入n5,选择下一步否是否是图6修改模块流程图显示功能标题否是判断n5是否是1-3i5从0到15判断输入的姓名和文件中的是否有相同的调用all_read读文件打印文件中所有的通讯信息输入要删除的人的姓名以只写的方式打开文件txl.txt提示没有这个人存在,重新输入将结构体per[j+1]中的信息存入结构体per[j],将per[j]的成员num赋值为j+1k从0到j写入结构体数组per[k]的所有内容,并关闭文件跳出循环根据n5的值调用各功能模块函数输入n5,选择下一步是否是j从i5到15判断输入的姓名和文件中的是否有相同的否图7删除模块流程图图8主目录模块运行结果图9成功添加时的运行结果图10重复添加时的运行结果图11通讯录已满时的运行结果图12查看模块运行结果图14删除模块运行结果图13修改模块运行结果。