版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言课程设计题目:通讯录管理系统设计者:院系:数理学院专业:信息与计算科学班号:123111学号:1000586指导教师:吴湘宁6题目规定通讯录管理系统是具有数据插入、更新、删除、显示和查询功能的电话簿管理程序。(1)数据包括姓名、工作单位、电话号码和E-MAIL地址等。(2)可对记录中的姓名和电话号码进行更新。(3)可增长和删除记录。(4)可显示所有的保留的记录。(5)可按姓名或电话号码进行查询。需求分析信息记录要寄存到文献中,要实现文献的输入、输出功能;实现数据的添加、删除、更新和显示,要提供输入、删除、更新和显示功能;要实现按人名或电话号码进行查询,因而要提供查找功能;应当提供键盘式选择菜单以实现功能选择。采用模块化,由上到下的设计措施,通过数字选择菜单功能,上级菜单可进入下级菜单,下级菜单可返回上级菜单。总体设计根据上面得需求分析,系统有菜单项选择择、数据输入、数据查找、数据更新、数据的存储等功能。可以将系统设计分为四大模块,即显示、查找、更新(包括增长和删除)和退出,如图1所示。其中,重要功能是显示、查询和更新三个模块。通讯录管理系统显示通讯录管理系统显示查询更新退出图1系统功能模块图详细设计4.1主函数主函数设计比较简洁,只提供输入、功能处理和输出部分得函数调用。其中各功能模块采用菜单方式选择。此外,菜单部分也可以写出函数。详细流程图如图2所示。图2主函数流程图图2主函数流程图显示一系列功能选项开始输入n,判断n与否是1~4根据n的值调用各功能模块函数结束【程序】main(){ intn,w; do { puts("***************通讯录管理系统***************\n"); puts("********************菜单********************\n"); puts("1.显示通讯录\n"); puts("2.查找\n"); puts("3.更新\n"); puts("4.退出\n"); puts("********************************************\n"); printf("选择功能(1-4):"); scanf("%d",&n); if(n<1||n>4) { w=1; getchar(); } else{w=0;} }while(w==1); switch(n)/*选择功能*/ { case1:list();break;/*列出通讯录*/ case2:find();break;/*查找*/ case3:choose();break;/*更新通讯录*/ case4:printf("谢谢使用!\n\n");/*退出*/ }}4.2各功能模块设计★数据构造通讯录的数据信息:姓名、工作单位、电话号码、E-MAIL均采用字符型数组,用构造体的形式,把各信息作为构造的组员。构造体变量可以是指针类型,构造体的类型如下:structpersons{ charname[100]; charaddress[100]; charnumber[100]; charemail[100];}per[N];/*N为通讯录总人数*/注:per[N]中的N为记录的总个数,程序中用宏定义的方式,可以随时在源程序宏定义中修改。本程序的宏定义为#defineN100。★back():返回菜单,作为公告函数,提供从各个子模块返回主菜单或者退出,程序如下:voidback(){ intn,m,w; do { puts("**************************************************\n"); puts("1.返回主菜单2.退出\n"); scanf("%d",&m); if(m!=1&&m!=2) { w=1; getchar(); } else{w=0;} }while(w==1); if(m==2) { puts("**************************************************\n"); printf("谢谢使用!\n\n"); exit(0); } if(m==1) { do { puts("*******************通讯录管理系统*****************\n"); puts("************************菜单**********************\n"); puts("1.显示通讯录\n"); puts("2.查找\n"); puts("3.更新通讯录\n"); puts("4.退出"); puts("\n**************************************************\n"); printf("请选择功能(1-4):"); scanf("%d",&n); if(n<1||n>4) { w=1; getchar(); } else{w=0;} }while(w==1); puts("\n**************************************************\n"); switch(n)/*选择功能*/ { case1:list();break;/*列出通讯录*/ case2:find();break;/*查找*/ case3:alter();break;/*更新通讯录*/ case4:printf("谢谢使用!\n\n");exit(0); /*退出*/ } }}显示通讯录模块【分析】要从文献读入记录,还要记录记录的总个数。由于读入文献的某些基本功能在其他地方还也许要用到,为了以便,在此都写成对应的功能函数,这样程序看起来构造更简朴更清晰。【程序】voidlist()/*读入数据并显示*/{ n=loadfiles(); printf_files(n-1); printf("\n"); back();/*返回主菜单或者退出*/}注:这里n作为全局变量,记录文献记录的总个数。loadfiles():读入记录函数。【程序】intloadfiles(){ FILE*fp; inti; if((fp=fopen("通讯录.txt","r"))==NULL)/*判断文献与否存在*/ { printf("不能打开文献\n"); return0; } for(i=0;!feof(fp);i++)/*从文献读入数据,保留在per构造体数组中*/ fscanf(fp,"%s%s%s%s",per[i].name,per[i].address,per[i].number,per[i].email); fclose(fp);/*关闭文献*/ return(i);/*返回记录个数*/}printf_one():显示一条信息。【分析】为了以便每条记录的显示及修改,在此特意设计了该函数。【程序】voidprintf_one(inti){ printf("%s%s%s%s\n",per[i].name,per[i].address,per[i].number,per[i].email);}printf_files():显示n条信息。【程序】voidprintf_files(intn){ intj; printf("姓名工作地址电话Email\n"); for(j=0;j<n;j++)/*用for循环实现记录的所有显示*/ printf_one(j); getch();}这样就实现了显示通讯录的功能,如下图:查找模块【分析】要实现通过姓名或者电话号码来查找记录,需要判断键入的姓名(电话号码)在文献中与否对应存在。用条件判断语句选择是用哪种方式查找。find():查找函数。【程序】voidfind(){ inti,k,p=-1;/*p初赋值-1,用来背面判断要查找的内容存不存在*/ charm[100],d[100]; n=loadfiles();/*载入文献记录并记录总信息条数*/ printf("\n*********************查找功能*********************\n"); printf("按什么查找?\n"); printf("1.姓名2.电话号码\n"); scanf("%d",&k); if(k==1) { printf("请输入姓名:"); scanf("%s",&m); for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0)/*判断键入的名字在通讯录中有无*/ { p=i;/*假如有,p被赋值*/ puts("\n**************************************************\n"); printf("姓名工作地址电话Email\n"); printf("%s%s%s%s\n\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } } if(p==-1) /*p没有被赋值,阐明输入的姓名记录中没有*/ printf("\n没有找到!\n"); } elseif(k==2) { printf("请输入电话号码:"); scanf("%s",&d); for(i=0;i<n;i++) { if(strcmp(d,per[i].number)==0)/*判断键入的电话号码在通讯录中有无*/ { p=i;/*假如有,p被赋值*/ puts("\n**************************************************\n"); printf("姓名工作地址电话Email\n"); printf("%s%s%s%s\n\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } }if(p==-1) /*p没有被赋值,阐明输入的姓名记录中没有*/ printf("\n没有找到!\n\n"); } else printf("\n输入错误!\n"); back();/*返回主菜单或者退出*/}这样就实现了记录查找功能。如下图:更新通讯录模块(此模块运行截图将在“系统运行”中给出)图3更新功能模块更新删除修改增长【分析】这个模块包括三个功能:更新、增长图3更新功能模块更新删除修改增长★choose():先定义一种更新通讯录主模块函数,用于选择对通讯录进行怎样的更新。【程序】voidchoose(){ intn; puts("*******************记录更新菜单*******************\n"); puts("1.修改\n"); puts("2.增长\n"); puts("3.删除\n"); puts("**************************************************\n"); printf("选择功能(1-3):"); scanf("%d",&n); switch(n)/*选择功能*/ { case1:alt();break; case2:add();break; case3:del();break; default:printf("\n输入错误!\n");back();/*返回主菜单或者退出*/ }}修改子模块【分析】为了是更新子功能简洁清晰,这里特意定义了choose(),alter(),alt()三个函数并有所嵌套。alt():子修改函数,用于修改单个记录。【程序】voidalt(){ inti,p=-1,a,n;/*p=-1的功能和前面的相似*/ charm[100]; n=loadfiles();/*载入文献记录并记录总信息条数*/ puts("\n*****************记录修改模块*********************\n"); printf_files(n);/*显示通讯录*/ puts("**************************************************\n"); printf("输入要修改人的姓名:\n"); scanf("%s",&m);for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0)/*判断键入的名字在通讯录中有无*/ { p=i; printf("\n姓名工作地址电话Email\n"); printf("%s%s%s%s\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } } if(p==-1)/*p没有被赋值,阐明输入的姓名记录中没有*/ { printf("输入错误!\n"); back(); /*返回主菜单或者退出*/ } puts("**************************************************\n"); printf("请输入要修改的选项:\n");/*选择要修改的选项*/ printf("1.姓名\n"); printf("2.工作地点\n"); printf("3.电话号码\n"); printf("4.Email\n"); scanf("%d",&a); switch(a)/*选择后修改构造体*/ { case1:printf("姓名改为:");scanf("%s",per[p].name);break; case2:printf("工作地点改为:");scanf("%s",per[p].address);break; case3:printf("电话号码改为:");scanf("%s",per[p].number);break; case4:printf("Email改为:");scanf("%s",per[p].email);break; default:printf("输入错误!");back();/*不想更改可以按别的键键返回主菜单或退出*/ }}alter():主修改函数,并将修改后的新记录保留到文献中。【程序】voidalter(){ FILE*fp1; intj,n; if((fp1=fopen("通讯录.txt","r+"))==NULL)/*用读写的方式打开文献*/ { printf("不能打开文献"); exit(0); } n=loadfiles();/*载入文献记录并记录总信息条数*/ choose();/*调用更新主模块函数*/ for(j=0;j<n;j++)/*用for循环将更新后的内容覆盖保留到文献里面*/ { fputs(per[j].name,fp1);fputs("\t",fp1); fputs(per[j].address,fp1);fputs("\t",fp1); fputs(per[j].number,fp1);fputs("\t",fp1); fputs(per[j].email,fp1);fputs("\t",fp1);fputs("\n",fp1); } fclose(fp1);/*关闭文献*/ puts("\n**************************************************"); printf("保留成功!\n"); back();/*返回主菜单或者退出*/}增长子模块【分析】增长子模块比较简朴,用追加的方式打开文献并追加记录就可以了。add():增长函数。【程序】voidadd(){ FILE*fp2; n=loadfiles();/*载入文献记录并记录总信息条数*/ printf("\n******************增长记录模块********************\n\n"); printf("姓名:"); scanf("%s",per[n].name); printf("工作地点:"); scanf("%s",per[n].address); printf("电话号码:"); scanf("%s",per[n].number); printf("Email:"); scanf("%s",per[n].email); if((fp2=fopen("通讯录.txt","a"))==NULL)/*用追加方式打开文献*/ { printf("不能打开文献"); exit(0); } fputs(per[n].name,fp2);fputs("\t",fp2); fputs(per[n].address,fp2);fputs("\t",fp2); fputs(per[n].number,fp2);fputs("\t",fp2); fputs(per[n].email,fp2);fputs("\t",fp2);fputs("\n",fp2); fclose(fp2);/*关闭文献*/ puts("**************************************************\n"); printf("保留成功!\n\n"); back();/*返回主菜单或者退出*/}删除子模块【分析】用前面查找的措施找到要删除的单个记录,再通过构造体数组赋值的措施从这个文献起后一种文献赋值给前一种文献,再把钱n-2个构造体写到文献中去。del():删除函数。【程序】(部分编程功能和前面的同样,不再赘述)voiddel(){ FILE*fp3; inti,j,k,p=-1,n; charm[100]; printf("\n*****************删除记录模块*********************\n\n"); n=loadfiles(); printf_files(n-1);/*这里特意是n-1,是为了防止反复删除时出现最终一条记录反复出现的状况发生,在系统运行中将给出调试过程*/ puts("\n**************************************************\n"); printf("输入要删除记录的姓名:\n"); scanf("%s",m); for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0) { p=i; printf("\n姓名工作地址电话Email\n"); printf("%s%s%s%s\n",per[p].name,per[p].address,per[p].number,per[p].email); puts("**************************************************\n"); for(k=p;k<n-2;k++) per[k]=per[k+1];/*背面的构造体数组往前推,将要删除的覆盖掉*/ if((fp3=fopen("通讯录.txt","w"))==NULL) { printf("不能打开文献"); exit(0); } for(j=0;j<n-2;j++)/*这里不是n-1而是n-2,由于已经删除了一条记录*/ { fputs(per[j].name,fp3);fputs("\t",fp3); fputs(per[j].address,fp3);fputs("\t",fp3); fputs(per[j].number,fp3);fputs("\t",fp3); fputs(per[j].email,fp3);fputs("\t",fp3);fputs("\n",fp3); } fclose(fp3); printf("删除成功!\n\n"); break; } } if(p==-1) { printf("\n输入错误!\n"); back(); } back();}退出功能【分析】这个也很简朴,在switch中自动退出或用exit(0)实现退出。系统运行在这里将演示更新“通讯录功能”的过程。在主菜单中选择“3.更新通讯录”,如下图:⑴选择修改,如下图:输入孔明,回车,修改工作地点为西蜀,如下图:返回主菜单,显示通讯录,如下图:“孔明”的“工作地点”已经变成“西蜀”,修改成功。⑵选择增长,如下图:输入新记录,回车,如下图:返回主菜单,显示通讯录,如下图:华佗来“上班”了,添加成功。⑶选择删除,如下图:输入关羽,回车,如下图:返回主菜单,显示通讯录,如下图:关羽“走麦城”去了,删除成功。★有关在del()函数里面要写成printf_files(n-1)的原因:这里特意是n-1,是为了防止反复删除时出现最终一条记录反复出现的状况发生。假如写成printf_files(n),并且在删除记录后再进入删除菜单将出现下图的状况:(这里删除张飞)这是由于n=loadfiles()中n的值没有伴随一条记录的删除而减1导致。因此要改丞printf_files(n-1),并且这样改了之后不管持续删除多少条记录都不会出现最终一天记录反复出现的状况。其之后的for(j=0;j<n-2;j++)中的n-2也是同样的道理。有关在程序中设计back()函数的好处:只要对键入的东西进行判断,假如子功能结束或输入错误,用back()函数就能返回主菜单,防止输入错误而必须频繁重新打开程序。有了back()函数,实现了不用重新启动就能反复执行不一样功能,并且我特意在每一种也许结束程序的地方都添加了back()函数。只举下面几种例子:总结在这次c语言程序设计实习,我重要碰到下面3个问题:1.缺乏头文献,导致有些看不懂的错误或警告出现;2.文献用不一样的方式打开所实现的功能不一样,有的是追加,有的是直接覆盖;3.忘了函数定义一定要写在其他语句前面,导致出现好多种错误。不过在这次实习中,我也有诸多收获:1.我常常用调试功能一步一步跟踪程序的运行(前面那个n-1的问题就是通过调试发现的),观测变量的变化;2.有些c语言懂得忘掉了,通过看书,重新温习,并且通过实践加强了印象;3.有些难题通过老师的指点和自己独立思索后得到处理后,感到很有成就感;4.由于我的c语言基础很好,同学们常常找我帮忙处理问题,使我在这次实习中接触了不一样的课题和不一样的程序设计思绪,锻炼了处理问题的能力,提高了c语言实际应用能力。附1:程序源代码#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#defineN100intn;//返回主菜单voidlist();voidfind();voidalter();voidback(){ intn,m,w; do { puts("**************************************************\n"); puts("1.返回主菜单2.退出\n"); scanf("%d",&m); if(m!=1&&m!=2) { w=1; getchar(); } else{w=0;} }while(w==1); if(m==2) { puts("**************************************************\n"); printf("谢谢使用!\n\n"); exit(0); } if(m==1) { do { puts("*******************通讯录管理系统*****************\n"); puts("************************菜单**********************\n"); puts("1.显示通讯录\n"); puts("2.查找\n"); puts("3.更新通讯录\n"); puts("4.退出"); puts("\n**************************************************\n"); printf("请选择功能(1-4):"); scanf("%d",&n); if(n<1||n>4) { w=1; getchar(); } else{w=0;} }while(w==1); puts("\n**************************************************\n"); switch(n)/*选择功能*/ { case1:list();break;/*列出通讯录*/ case2:find();break;/*查找*/ case3:alter();break;/*更新通讯录*/ case4:printf("谢谢使用!\n\n");exit(0); /*退出*/ } }}//构造体structpersons{ charname[100]; charaddress[100]; charnumber[100]; charemail[100];}per[N];/*N为通讯录总人数*///载入记录intloadfiles(){ FILE*fp; inti; if((fp=fopen("通讯录.txt","r"))==NULL) { printf("不能打开文献\n"); return0; } for(i=0;!feof(fp);i++)/*从文献读入数据,保留在per构造体数组中*/ fscanf(fp,"%s%s%s%s",per[i].name,per[i].address,per[i].number,per[i].email); fclose(fp); return(i);/*返回信息个数*/}//显示一条信息voidprintf_one(inti){ printf("%s%s%s%s\n",per[i].name,per[i].address,per[i].number,per[i].email);}//显示n条信息voidprintf_files(intn){ intj; printf("姓名工作地址电话Email\n"); for(j=0;j<n;j++) printf_one(j); getch();}//列出通讯录voidlist()/*读入数据并显示*/{ n=loadfiles(); printf_files(n-1); printf("\n"); back();}//查找记录voidfind(){ inti,k,p=-1; charm[100],d[100]; n=loadfiles();/*总信息条数*/ printf("\n*********************查找功能*********************\n"); printf("按什么查找?\n"); printf("1.姓名2.电话号码\n"); scanf("%d",&k); if(k==1) { printf("请输入姓名:"); scanf("%s",&m); for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0)/*判断键入的名字在通讯录中有无*/ { p=i; puts("\n**************************************************\n"); printf("姓名工作地址电话Email\n"); printf("%s%s%s%s\n\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } } if(p==-1) /*p没有被赋值,阐明输入的姓名记录中没有*/ printf("\n没有找到!\n"); } elseif(k==2) { printf("请输入电话号码:"); scanf("%s",&d); for(i=0;i<n;i++) { if(strcmp(d,per[i].number)==0)/*判断键入的电话号码在通讯录中有无*/ { p=i; puts("\n**************************************************\n"); printf("姓名工作地址电话Email\n"); printf("%s%s%s%s\n\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } }if(p==-1) printf("\n没有找到!\n\n"); } else printf("\n输入错误!\n"); back();}voidalt()/*修改函数*/{ inti,p=-1,a,n; charm[100]; n=loadfiles(); puts("\n*****************记录修改模块*********************\n"); printf_files(n); puts("**************************************************\n"); printf("输入要修改人的姓名:\n"); scanf("%s",&m);for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0)/*判断键入的名字在通讯录中有无*/ { p=i; printf("\n姓名工作地址电话Email\n"); printf("%s%s%s%s\n",per[p].name,per[p].address,per[p].number,per[p].email); break; } } if(p==-1) { printf("输入错误!\n"); back(); } puts("**************************************************\n"); printf("请输入要修改的选项:\n"); printf("1.姓名\n"); printf("2.工作地点\n"); printf("3.电话号码\n"); printf("4.Email\n"); scanf("%d",&a); switch(a) { case1:printf("姓名改为:");scanf("%s",per[p].name);break; case2:printf("工作地点改为:");scanf("%s",per[p].address);break; case3:printf("电话号码改为:");scanf("%s",per[p].number);break; case4:printf("Email改为:");scanf("%s",per[p].email);break; default:printf("\n输入错误!\n");back(); }}voidadd()/*增长函数*/{ FILE*fp2; n=loadfiles(); printf("\n******************增长记录模块********************\n\n"); printf("姓名:"); scanf("%s",per[n].name); printf("工作地点:"); scanf("%s",per[n].address); printf("电话号码:"); scanf("%s",per[n].number); printf("Email:"); scanf("%s",per[n].email); if((fp2=fopen("通讯录.txt","a"))==NULL) { printf("不能打开文献"); exit(0); } fputs(per[n].name,fp2);fputs("\t",fp2); fputs(per[n].address,fp2);fputs("\t",fp2); fputs(per[n].number,fp2);fputs("\t",fp2); fputs(per[n].email,fp2);fputs("\t",fp2);fputs("\n",fp2); fclose(fp2); puts("**************************************************\n"); printf("保留成功!\n\n"); back();}voiddel()/*删除函数*/{ FILE*fp3; inti,j,k,p=-1,n; charm[100]; printf("\n*****************删除记录模块*********************\n\n"); n=loadfiles(); printf_files(n-1); puts("\n**************************************************\n"); printf("输入要删除记录的姓名:\n"); scanf("%s",m); for(i=0;i<n;i++) { if(strcmp(m,per[i].name)==0)/*判断键入的名字在通讯录中有无*/ { p=i; printf("\n姓名工作地址电话Email\n"); printf("%s%s%s%s\n",per[p].name,per[p].address,per[p].number,per[p].email); puts("**************************************************\n"); for(k=p;k<n-2;k++) { per[k]=per[k+1]; } if((fp3=fopen("通讯录.txt","w"))==NULL) { printf("不能打开文献"); exit(0); } for(j=0;j<n-2;j++) { fputs(per[j].name,fp3);fputs("\t",fp3); fputs(per[j].address,fp3);fputs("\t",fp3); fputs(per[j].number,fp3);fputs("\t",fp3); fputs(per[
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年适用:高科技研发项目合作合同
- 2024苹果种植基地灌溉系统改造合同3篇
- 2024网络游戏开发与发行委托合同
- 2024年04月贵州贵州省农村信用社高校毕业生专场网络招考活动笔试历年参考题库附带答案详解
- 2025年度柴油发电机租赁及电力市场交易合同4篇
- 2024石材干挂工程安全生产与环境保护合同3篇
- 二零二五版窗帘安装与室内环境检测服务合同3篇
- 2025年度知识产权跨境交易及法律服务合同4篇
- 个人房产买卖合同2024年版5篇
- 2025年度健康医疗大数据研发与应用合同范本4篇
- 寒潮雨雪应急预案范文(2篇)
- DB33T 2570-2023 营商环境无感监测规范 指标体系
- 上海市2024年中考英语试题及答案
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传海报
- 垃圾车驾驶员聘用合同
- 2025年道路运输企业客运驾驶员安全教育培训计划
- 南京工业大学浦江学院《线性代数(理工)》2022-2023学年第一学期期末试卷
- 2024版机床维护保养服务合同3篇
- 《论拒不执行判决、裁定罪“执行能力”之认定》
- 工程融资分红合同范例
- 2024国家安全员资格考试题库加解析答案
评论
0/150
提交评论