版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
手机通信录管理系统设计[要求]模拟手机通信录管理系统,实现对手机中的通信录进行管理。功能要求如下:(1)查看功能:选择此功能时,列出下列三类选择。办公类个人类商务类当选中某类时,显示出此类全部数据中的姓名、电话号码和电子邮件。(2)增加功能:能录入新数据。一个结点包括:姓名、电话号码、分类(办公类、个人类、商务类)、电子邮件。例如:杨**135896********商务类*****@***。当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,储存空间已满,不能再录入新数据;;录入的新数据能按递增的依次自动进行条目编号。(3)修改功能:选中某个人姓名时,可对此人的相应数据进行修改。(4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。【需求分析】 依据题目要求,由于联系人信息时存放在文件中,所以应供应文件的输入、输出等操作;在程序中须要查看联系人信息,应供应显示、查看功能;要实现修改和删除联系人功能,所以应供应对文件的修改和删除操作。【总体设计】 以下分析整个系统,依据上面的需求分析,可将这个系统的设计分为四大模块(如图一):图一系统功能模块图【具体设计】主函数主函数设计比较简洁,仅有一个语句。 [程序] main()/*******************主函数********************/{ menu();}主菜单主菜单函数供应用户对系统功能的选择,包括阅读联系人、增加联系人、修改联系人、删除联系人。该函数的流程图如图二所示。程序如下,这样编写的目的在于系统执行完每部分模块后能够便利返回到系统界面。起先起先显示一系列功能选项显示一系列功能选项输入n,推断n是否是1-4?输入n,推断n是否是1-4?YY依据n的值调用各功能模块函数依据n的值调用各功能模块函数结束结束 图二主菜单流程图[程序]voidmenu()/******************菜单函数*****************/{ intn=0,w1; do { puts("\t\t***********************MENU***********************\n\n"); puts("\t\t\t\t1.Browseall"); puts("\t\t\t\t2.Addmembers"); puts("\t\t\t\t3.Modifyinformation"); puts("\t\t\t\t4.Deleteinformation"); puts("\n\n\t\t***************************************************\n"); printf("Chooseyournumber(1-4):[]\b\b"); scanf("%d",&n); if(n<1||n>4) { w1=1; getchar(); } else w1=0; }while(w1==1); switch(n) { case1:browse();break;/*阅读联系人模块*/ case2:add();break;/*增加联系人模块*/ case3:modify();break;/*修改联系人模块*/ case4:del();break;/*删除联系人模块*/ }} 3.数据结构设计各联系人信息包括有姓名、电话号码、联系人类型、电子邮件。可以运用结构体数组,则姓名、电话、类型和电子邮件作为结构体成员。structmember/*联系人结构体*/{ charname[20];/*联系人姓名*/ chartel[11];/*联系人电话*/ inttype;/*联系人类型:1为办公类;2为个人类;3为商务类*/ charemail[30];/*联系人电子邮件*/}mem[N];/*N为全局变量,表示能够储存的联系人数量*/留意:mem[N]中的N为联系人数目,程序中采纳宏定义的方式,可以随时在源程序宏定义中修改,本程序宏定义#defineN15.阅读联系人模块[需求分析]该模块的功能是运用户可以阅读或者分类阅读各联系人信息。如图三所示,当用户输入1、2、3、4时,分别显示办公类联系人、个人类联系人、商务类联系人和全部联系人。图三阅读联系人模块流程图[程序]voidbrowse()/*********阅读联系人函数**********/{ intm,n=0,w1; m=load(); do { puts("\n\n\t\t******************BROWSR********************"); puts("\t\t\t\t1.showclericalmembers");/*查询办公类联系人*/ puts("\t\t\t\t2.showpersonalmembers");/*查询个人类联系人*/ puts("\t\t\t\t3.showcommercialmembers");/*查询商务类联系人*/ puts("\t\t\t\t4.showallmembers");/*查询全部联系人*/ puts("\t\t\t\t5.returntomenu");/*返回菜单*/ printf("Chooseyournumber(1-5):[]\b\b"); scanf("%d",&n); if(n<1||n>5) { w1=1; getchar(); } else w1=0; }while(w1==1); if(n==1) { printf_cle(m);/*显示办公类联系人*/ puts("\ninformationhasbeenshowed,Pressanykeytoreturntomenu\n"); system("pause");/*暂停系统工作*/ getchar(); menu(); } elseif(n==2) { printf_per(m);/*显示个人类联系人*/ puts("\ninformationhasbeenshowed,Pressanykeytoreturntomenu\n"); system("pause");/*暂停系统工作*/ getchar(); menu(); } elseif(n==3) { printf_com(m);/*显示商务类联系人*/ puts("\ninformationhasbeenshowed,Pressanykeytoreturntomenu\n"); system("pause");/*暂停系统工作*/ getchar(); menu(); } elseif(n==4) { printf_all(m);/*显示商务类联系人*/ puts("\ninformationhasbeenshowed,Pressanykeytoreturntomenu\n"); system("pause");/*暂停系统工作*/ getchar(); menu(); } else { menu(); }}增加联系人模块[需求分析]该模块的功能是运用户实现增加新联系人的功能,从键盘输入新联系人信息并加入到原文件中。该模块流程图如图四所示。[程序]voidadd(){ intm,w1,n,t,w2,i,j;/*m为现有联系人数量*/ m=load();/*加载联系人信息,并将联系人数量输入m*/ if(m==N) {运行save(int)函数,将信息保存至文件中是否保存?输入联系人姓名、电话、类型、电子邮箱推断m是否小于N?运行m=load()函数,加载现有联系人信息起先运行save(int)函数,将信息保存至文件中是否保存?输入联系人姓名、电话、类型、电子邮箱推断m是否小于N?运行m=load()函数,加载现有联系人信息起先返回至主菜单输出:储存空间已满,无法输入 返回至主菜单输出:储存空间已满,无法输入YYNNNNYY图四增加联系人模块流程图 printf("thereisnoterabytestosave\n");结束 printf("Pressanykeytoreturntomenu...");结束 getchar(); system("pause"); menu(); } else { puts("\tpleaseinputcontract'sname:");/*输入联系人姓名*/ scanf("%s",mem[m].name);/*将联系人姓名保存至结构体*/ puts("\tpleaseinputcontract'stelephonenumber:"); scanf("%s",mem[m].tel); do/*选择联系人类型语句*/ { puts("\n\n\n\n\npleasechoosecontract'stype:\n\n\n"); puts("1,clerical\t"); puts("2,personal\t"); puts("3mercial\t"); puts("pleasechoosecontract'stype:[]\b\b"); scanf("%d",&n); if((n!=1)&&(n!=2)&&(n!=3)) { w1=1; getchar(); } else w1=0; }while(w1==1); switch(n)/*将联系人类型信息存入结构体中*/ { case1:mem[m].type=1;break; case2:mem[m].type=2;break; case3:mem[m].type=3;break; } puts("\tpleaseinputcontract'semailaddress:"); scanf("%s",mem[m].email); } do { puts("Areyousuretosave?1.yes2.no[]\b\b"); scanf("%d",&t); if(t<1||t>2) { w2=1; getchar(); } else w2=0; }while(w2==1); if(t==1) { for(i=0;i<m;i++) { if(strcmp(mem[i].name,mem[m].name)==0) { puts("namehasexisted!cannotsave, Pressanykeytomeun!"); for(j=0;j<20;j++) mem[m].name[j]='\0'; for(j=0;j<11;j++) mem[m].tel[j]='\0'; mem[m].type=0; for(i=0;i<30;i++) mem[m].email[j]='\0'; system("pause"); menu(); } if(strcmp(mem[i].tel,mem[m].tel)==0) { puts("telephonenumberhasexisted!cannotsave, Pressanykeytomenu!"); for(j=0;j<20;j++) mem[m].name[j]='\0'; for(j=0;j<11;j++) mem[m].tel[j]='\0'; mem[m].type=0; for(i=0;i<30;i++) mem[m].email[j]='\0'; system("pause"); menu(); } } save(m);/*保存联系人信息至文本文档*/ puts("informationsaved!\n"); puts("therefollowsalltheinformations:\n"); printf_all(m+1); getchar(); puts("Pressanykeytoreturntomenu"); system("pause"); menu(); } if(t==2)/*假如用户不保存,则将刚刚存入结构体中的数据删除*/ { for(i=0;i<20;i++) mem[m].name[i]='\0'; for(i=0;i<11;i++) mem[m].tel[i]='\0'; mem[m].type=0; for(i=0;i<30;i++) mem[m].email[i]='\0'; puts("informationnotsaved!\n"); puts("therefollowsalltheinformations:\n"); printf_all(m); getchar(); puts("Pressanykeytoreturntomenu"); system("pause"); menu(); }}修改联系人模块[需求分析]该模块的功能的功能是显示全部联系人信息。显示完后,用户输入要修改联系人的序号,系统依据用户输入的序号显示用户选择的联系人,并提示用户须要修改哪部分信息,是姓名、电话、类型还是电子邮箱。依据用户的选择修改相应的信息。[程序]voidmodify(){ intm,n,t,w1,w2; m=load(); puts("therefollowsalltheinformations:\t"); printf_all(m);/*显示全部信息,以便用户确认所要修改的信息*/ do { puts("pleaseinputthenumberthatyouwanttomodify,orpress'0'toexit:"); scanf("%d",&n); if(n<0||n>m) { w1=1; getchar(); } else w1=0; }while(w1==1); if(n==0) menu(); printf_one(n); do { puts("\t\t\t\t1,name"); puts("\t\t\t\t2.telephone"); puts("\t\t\t\t3.type"); puts("\t\t\t\t4.email"); puts("\t\t\t\t0.Exit"); puts("choosewhichinformationdoyouwanttomodify,orpress'0'toexit:"); scanf("%d",&t); if(t<0||t>4) { w2=1; getchar(); } else w2=0; }while(w2==1);结束返回至主菜单调用相应功能模块输入t推断t是否在0~4中n是否等于0依据n的值调用相应功能模块推断n是否在0~15中起先输入n运行m=load()函数,加载现有联系人信息,并显示全部用户信息结束返回至主菜单调用相应功能模块输入t推断t是否在0~4中n是否等于0依据n的值调用相应功能模块推断n是否在0~15中起先输入n运行m=load()函数,加载现有联系人信息,并显示全部用户信息NNYYNNYYNNYY图五修改联系人模块流程图 if(t==1) modify_name(n,m);/*修改姓名函数,n为要修改的联系人编号;m为总联系人数*/ if(t==2) modify_tel(n,m);/*修改电话函数,n为要修改的联系人编号;m为总联系人数*/ if(t==3) modify_type(n,m);/*修改类型函数,n为要修改的联系人编号;m为总联系人数*/ if(t==4) modify_email(n,m);/*修改Email函数,n为要修改的联系人编号;m为总联系人数*/ if(t==0) menu();} 删除联系人模块[需求分析]该模块首先显示现有全部联系人,显示完成后,用户输入要删除的联系人序号。删除方式是将数据从结构体中删除,然后将后面的记录向前移。删除之后将记录保存至文件中。[程序]voiddel(){ intm,n,w1,w2,t,i; m=load(); puts("therefollowsalltheinformations:\t"); printf_all(m); do { puts("pleaseinputthenumberthatyouwanttodelete:[]\b\b"); scanf("%d",&n); if(n<0||n>m) { w1=1; getchar(); } else w1=0; }while(w1==1); do/*用dowhile语句限制用户的输入,运用户只能输入1或者2*/ { puts("youwanttodeletethisinformation:"); printf_one(n); puts("\nAreyousuretodelete?1,yes2,no"); scanf("%d",&t);起先起先运行m=load();加载现有联系人信息;并显示全部联系人信息运行m=load();加载现有联系人信息;并显示全部联系人信息输入要删除的联系人序号n输入要删除的联系人序号n推断0推断0﹤n≤m是否成立NNYY显示用户要删除的联系人的全部信息显示用户要删除的联系人的全部信息用户是否确认用户是否确认删除NNYY删除数据,并运行move函数,将删除位置后面的数据前移删除数据,并运行move函数,将删除位置后面的数据前移运行save函数,将信息保存至文件中运行save函数,将信息保存至文件中返回至主菜单返回至主菜单结束结束图六删除联系人模块 if(t<1||t>2) { w2=1; getchar(); } else w2=0; }while(w2==1); if(t==2) { puts("informationnotdeleted!Pressanykeytobacktomenu\n"); getchar(); system("pause"); menu(); } if(t==1) { for(i=0;i<20;i++) mem[n-1].name[i]='\0'; for(i=0;i<11;i++) mem[n-1].tel[i]='\0'; mem[n-1].type=0; for(i=0;i<30;i++) mem[n-1].email[i]='\0'; move(n,m); puts("informationdeleted!Pressanykeytobacktomenu\n"); getchar(); system("pause"); menu(); }}公共函数一下为各模块中可能用到的一些公共函数。加载联系人信息函数:intload()[说明] 该函数用于将文件中的数据加载至结构体中,并且可以返回现有联系人的数目。[程序]intload(){ FILE*fp; inti,j; if((fp=fopen("E:\\vcprogrammes\\members.txt","rb"))==NULL)/*以只读方式打开一个二进制文件*/ { printf("\ncannotfindinformation"); } for(i=0;(!feof(fp))&&(i<N);i++) fread(&mem[i],sizeof(structmember),1,fp);/*将文件中的数据加载至结构体中*/ fclose(fp);/*关闭文件*/ for(j=0;((strcmp(mem[j].name,"\0"))!=0)&&(j<N);j++);/*通过检测联系人姓名否为空来推断联系人数量*/ return(j);/*返回现有联系人数量*/}保存全部联系人函数:voidsave(intm)[说明]该函数形参m表示现有结构体中最终一个元素的下标。该函数主体如下[程序]voidsave(intm)/*m表示现有结构体中最终一个元素的下标*/{ if(m==0)/*当m=0,即只有一个元素时,进入save_1函数,对文件进行只写操作*/ save_1(); else { save_1();/*当m>0时,首先进入save_1函数,新建一个文件,同时把mem[0]的数据保存;然后进入save_2函数,将mem[1]到mem[m]的数据追加至文件中*/ save_2(m); }}该包含两个子函数:voidsave_1()和voidsave_2(intm),当结构体中只有一个元素,即m=0时,只执行第一个函数,新建一个文件并将数据存入文件中;假如结构体中多于一个元素,即m>0时,首先执行第一个函数新建一个文件,然后执行其次个函数,将结构体中下标大于0的数据存入文件中。[程序]voidsave_1(){ FILE*fp; if((fp=fopen("E:\\vcprogrammes\\members.txt","wb"))==NULL) { printf("\ncannotfindinformation"); } fwrite(&mem[0],sizeof(structmember),1,fp); fclose(fp);}[程序]voidsave_2(intm){ inti; FILE*fp; if((fp=fopen("E:\\vcprogrammes\\members.txt","ab"))==NULL) { printf("\ncannotfindinformation"); } for(i=1;i<=m;i++) fwrite(&mem[i],sizeof(structmember),1,fp); fclose(fp);}显示全部联系人函数:voidprintf_all(intm)[说明]形参m表示现有联系人的数目。用以限制输出联系人的数量。该函数用于输出全部的联系人信息。[程序]voidprintf_all(intm){ inti; printf("\n\n\t\tallthecontractsasfollows:"); printf("\n\nNO.nametelephonetypeemail\n"); for(i=0;i<m;i++)/*推断联系人类别并输出*/ { if(mem[i].type==1) printf("%2d%-20s%-11sclerical%-30s\n",i+1,mem[i].name,mem[i].tel,mem[i].email); if(mem[i].type==2) printf("%2d%-20s%-11spersonal%-30s\n",i+1,mem[i].name,mem[i].tel,mem[i].email); if(mem[i].type==3) printf("%2d%-20s%-11scommercial%-30s\n",i+1,mem[i].name,mem[i].tel,mem[i].email); }}显示办公类联系人函数:voidprintf_cle(intm)[说明]形参m表示现有联系人数目。用以限制循环终点。该函数用于输出全部办公类联系人信息。[程序]voidprintf_cle(intm){ inti; printf("\n\n\t\tclericalcontractsasfollows:"); printf("\n\nnametelephonetypeemail\n"); for(i=0;i<m;i++) if(mem[i].type==1)/*推断联系人是否属于办公类*/ printf("%-20s%-11sclerical%-30s\n",mem[i].name,mem[i].tel,mem[i].email);}(5)显示个人类联系人函数:voidprintf_per(intm)[说明]形参m表示现有联系人数目。用以限制循环终点。该函数用于输出全部个人联系人信息。[程序]voidprintf_per(intm){ inti; printf("\n\n\t\tpersonalcontractsasfollows:"); printf("\n\nnametelephonetypeemail\n"); for(i=0;i<m;i++) if(mem[i].type==2)/*推断联系人是否属于个人类*/ printf("%-20s%-11spersonal%-30s\n",mem[i].name,mem[i].tel,mem[i].email);}(6)显示商务类联系人函数:voidprintf_com(intm)[说明]形参m表示现有联系人数目。用以限制循环终点。该函数用于输出全部商务类联系人信息。[程序]voidprintf_com(intm){ inti; printf("\n\n\t\tcommercialcontractsasfollows:"); printf("\n\nnametelephonetypeemail\n"); for(i=0;i<m;i++) if(mem[i].type==3)/*推断联系人是否属于商务类*/ printf("%-20s%-11scommercial%-30s\n",mem[i].name,mem[i].tel,mem[i].email);}(7)显示某一联系人函数:voidprintf_one(intm)[说明]形参m表示现有联系人数目。用以限制循环终点。该函数用于输出某一指定联系人信息。[程序]voidprintf_one(intm){ printf("nametelephonetypeemail\n"); if(mem[m-1].type==1)/*三个if语句推断联系人类型*/ printf("%-20s%-11sclerical%-30s\n",mem[m-1].name,mem[m-1].tel,mem[m-1].email); if(mem[m-1].type==2) printf("%-20s%-11spersonal%-30s\n",mem[m-1].name,mem[m-1].tel,mem[m-1].email); if(mem[m-1].type==3) printf("%-20s%-11scommercial%-30s\n",mem[m-1].name,mem[m-1].tel,mem[m-1].email);}(8)修改姓名函数:voidmodify_name(intn,intm)[说明]该函数用于修改联系人姓名。形参n为用户输入的要修改的联系人序号;m表示现有联系人数量。[程序]voidmodify_name(intn,intm){ charmod_name[20];/*用于暂存用户输入的更改后的联系人姓名*/ inti,t,w1; puts("pleaseinputthenewname:"); scanf("%s",mod_name); do { puts("Areyousuretosave?1.yes2.no[]\b\b"); scanf("%d",&t); if(t<1||t>2) { w1=1; getchar(); } else w1=0; }while(w1==1); if(t==1)/*当用户输入1,即确认修改时,将原来存在结构体中联系人的姓名删除,并将新的联系人姓名赋到结构体中*/ { for(i=0;i<20;i++) mem[n-1].name[i]='\0'; strcpy(mem[n-1].name,mod_name); save(m-1); puts("savedsuccessfully!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); } if(t==2) { for(i=0;i<20;i++) mod_name[i]='\0'; puts("informationnotsaved!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); }}(9)修改电话函数:voidmodify_tel(intn,intm)[说明]该函数用于修改联系人电话。形参n为用户输入的要修改的联系人序号;m表示现有联系人数量。[程序]voidmodify_tel(intn,intm){ charmod_tel[11]; inti,t,w1; puts("pleaseinputthenewtelephonenumber:"); scanf("%s",mod_tel); do { puts("Areyousuretosave?1.yes2.no[]\b\b"); scanf("%d",&t); if(t<1||t>2) { w1=1; getchar(); } else w1=0; }while(w1==1); if(t==1) { for(i=0;i<11;i++) mem[n-1].tel[i]='\0'; strcpy(mem[n-1].tel,mod_tel); save(m-1); puts("savedsuccessfully!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); } if(t==2) { for(i=0;i<11;i++) mod_tel[i]='\0'; puts("informationnotsaved!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); }}(10)修改联系人类型函数:voidmodify_type(intn,intm)[说明]该函数用于修改联系人电话。形参n为用户输入的要修改的联系人序号;m表示现有联系人数量。[程序]voidmodify_type(intn,intm){ intt1,t2,w1; do/*用dowhile语句限制用户的输入,运用户只能输入1—3*/ { puts("\t\t\t\t1,clerical"); puts("\t\t\t\t2,personal"); puts("\t\t\t\t3mercial"); puts("\t\t\t\tpleasechoosethetype:[]\b\b"); scanf("%d",&t1); if(t1<1||t1>3) { w1=1; getchar(); } else w1=0; }while(w1==1); do { puts("Areyousuretosave?1.yes2.no[]\b\b"); scanf("%d",&t2); if(t2<1||t2>2) { w1=1; getchar(); } else w1=0; }while(w1==1); if(t2==1)/*当用户确认保存时,t2的值为1,修改后的数据保存至结构体中,运行save函数后保存在文件中*/ { mem[n-1].type=t1; save(m-1); puts("savedsuccessfully!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); } if(t2==2)/*当用户确认不保存时,t2值为2,用户输入的修改信息被清空*/ { t1=0; puts("informationnotsaved!Pressanykeytocontinue..."); getchar(); system("pause"); modify(); }}(11)修改email函数:voidmodify_email(intn,intm)[说明]该函数用于修改联系人电话。形参n为用户输入的要修改的联系人序号;m表示现有联系人数量。[程序]voidmodify_email(intn,intm){ charmod_email[30]; inti,t,w1; puts("pleaseinputthenewemail:"); scanf("%s",mod_email); do { puts("Areyousureto
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省济南市第一中学九年级化学下册化学实验操作技能测试卷及答案
- 江苏省南京市外国语学校九年级化学第4章同步练习题及答案
- 2026年辽宁省交通法规模拟试题及答案
- 2026秋小学人教版数学六年级上册《分数应用题》(已知部分量求总量)易错题专项练习含参考答案
- 项目风险评估与控制流程手册
- 智能制造设备维护与操作规范
- 公关部公关专员工作手册
- 肝癌的放射治疗及 MDT
- 跨境电商批发案例客户开发课件
- 低年级小学生集体生活融入引导课
- 工程保险投保及理赔管理办法
- 2026事业单位招聘考试《公共基础知识》真题库及答案
- 新版2026年湖南物理卷高考真题(含答案)(网络参考)
- 深圳市中金岭南有色金属股份有限公司2026届校园招聘备考题库及参考答案详解
- 2025中国华电集团有限公司校园招聘笔试历年参考题库附带答案详解
- 威宁县病死畜禽无害化处理中心项目建设项目环境影响报告表
- 耳迷走神经刺激仪
- 25春国家开放大学《药剂学(本)》形考任务1-3参考答案
- 审计岗位笔试试题及答案
- 2025年职业院校技能大赛高职组(融媒体内容策划与制作赛项)考试题库(含答案)
- 委托代收拖欠物业费协议
评论
0/150
提交评论