通讯录管理系统C语言程序设计实习报告_第1页
通讯录管理系统C语言程序设计实习报告_第2页
通讯录管理系统C语言程序设计实习报告_第3页
通讯录管理系统C语言程序设计实习报告_第4页
通讯录管理系统C语言程序设计实习报告_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言课程设计题目:通讯录管理系统设计者:院系:数理学院专业:信息与计算科学班号:123111学号:指导教师:吴湘宁20题目规定通讯录管理系统是含有数据插入、更新、删除、显示和查询功效的电话簿管理程序。(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[j]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论