手机通信录管理系统设计—C语言课程设计(共26页).doc
精选优质文档-倾情为你奉上手机通信录管理系统设计要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理。功能要求如下:(1)查看功能:选择此功能时,列出下列三类选择。a) 办公类b) 个人类c) 商务类当选中某类时,显示出此类所有数据中的姓名、电话号码和电子邮件。(2)增加功能:能录入新数据。一个结点包括:姓名、电话号码、分类(办公类、个人类、商务类)、电子邮件。例如:杨* *商务类 。当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,储存空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。(3)修改功能:选中某个人姓名时,可对此人的相应数据进行修改。(4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。【需求分析】根据题目要求,由于联系人信息时存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要查看联系人信息,应提供显示、查看功能;要实现修改和删除联系人功能,所以应提供对文件的修改和删除操作。【总体设计】以下分析整个系统,根据上面的需求分析,可将这个系统的设计分为四大模块(如图一):图一 系统功能模块图【详细设计】1. 主函数主函数设计比较简洁,仅有一个语句。程序main() /*主函数*/menu();2. 主菜单主菜单函数提供用户对系统功能的选择,包括浏览联系人、增加联系人、修改联系人、删除联系人。该函数的流程图如图二所示。程序如下,这样编写的目的在于系统执行完每部分模块后能够方便返回到系统界面。开始显示一系列功能选项输入n,判断n是否是1-4?Y根据n的值调用各功能模块函数结束图二 主菜单流程图程序void menu() /*菜单函数*/int n=0,w1;do puts("tt*MENU*nn");puts("tttt1.Browse all");puts("tttt2.Add members");puts("tttt3.Modify information");puts("tttt4.Delete information");puts("nntt*n");printf("Choose your number(1-4): bb");scanf("%d",&n);if(n<1|n>4)w1=1;getchar();elsew1=0;while(w1=1);switch(n)case 1:browse();break; /*浏览联系人模块*/case 2:add();break; /*增加联系人模块*/ case 3:modify();break; /*修改联系人模块*/case 4:del();break; /*删除联系人模块*/3数据结构设计各联系人信息包括有姓名、电话号码、联系人类型、电子邮件。可以使用结构体数组,则姓名、电话、类型和电子邮件作为结构体成员。struct member /*联系人结构体*/char name20; /*联系人姓名*/char tel11; /*联系人电话*/int type; /*联系人类型:1为办公类;2为个人类;3为商务类*/char email30; /*联系人电子邮件*/memN; /*N为全局变量,表示能够储存的联系人数量*/注意:memN中的N为联系人数目,程序中采用宏定义的方式,可以随时在源程序宏定义中修改,本程序宏定义#define N 15.4. 浏览联系人模块需求分析该模块的功能是使用户可以浏览或者分类浏览各联系人信息。如图三所示,当用户输入1、2、3、4时,分别显示办公类联系人、个人类联系人、商务类联系人和所有联系人。图三 浏览联系人模块流程图程序void browse() /*浏览联系人函数*/int m,n=0,w1;m=load();doputs("nntt *BROWSR*");puts("tttt1.show clerical members"); /*查询办公类联系人*/puts("tttt2.show personal members"); /*查询个人类联系人*/puts("tttt3.show commercial members"); /*查询商务类联系人*/puts("tttt4.show all members"); /*查询所有联系人*/puts("tttt5.return to menu"); /*返回菜单*/printf("Choose your number(1-5): bb");scanf("%d",&n);if(n<1|n>5)w1=1;getchar();elsew1=0;while(w1=1);if(n=1)printf_cle(m); /*显示办公类联系人*/puts("ninformation has been showed,Press any key to return to menun");system("pause"); /*暂停系统工作*/getchar();menu();else if(n=2)printf_per(m); /*显示个人类联系人*/puts("ninformation has been showed,Press any key to return to menun");system("pause"); /*暂停系统工作*/getchar();menu();else if(n=3)printf_com(m); /*显示商务类联系人*/puts("ninformation has been showed,Press any key to return to menun");system("pause"); /*暂停系统工作*/getchar();menu();else if(n=4)printf_all(m); /*显示商务类联系人*/puts("ninformation has been showed,Press any key to return to menun");system("pause"); /*暂停系统工作*/getchar();menu();elsemenu();5. 增加联系人模块需求分析该模块的功能是使用户实现增加新联系人的功能,从键盘输入新联系人信息并加入到原文件中。该模块流程图如图四所示。程序void add()int m,w1,n,t,w2,i,j; /*m为现有联系人数量*/m=load(); /*加载联系人信息,并将联系人数量输入m*/if(m=N)运行save(int)函数,将信息保存至文件中是否保存?输入联系人姓名、电话、类型、电子邮箱判断m是否小于N?运行m=load()函数,加载现有联系人信息开始返回至主菜单输出:储存空间已满,无法输入 YNNY 图四 增加联系人模块流程图printf("there is no terabytes to saven");结束printf("Press any key to return to menu .");getchar();system("pause");menu();elseputs("tplease input contract's name:"); /*输入联系人姓名*/scanf("%s",memm.name); /*将联系人姓名保存至结构体*/puts("tplease input contract's telephone number:");scanf("%s",memm.tel);do /*选择联系人类型语句*/puts("nnnnnplease choose contract's type:nnn");puts("1,clericalt");puts("2,personalt");puts("mercialt");puts("please choose contract's type: bb");scanf("%d",&n);if(n!=1)&&(n!=2)&&(n!=3)w1=1;getchar();elsew1=0;while(w1=1);switch(n) /*将联系人类型信息存入结构体中*/case 1:memm.type=1;break;case 2:memm.type=2;break;case 3:memm.type=3;break;puts("tplease input contract's email address:");scanf("%s",memm.email);doputs("Are you sure to save? 1.yes 2.no bb");scanf("%d",&t);if(t<1|t>2)w2=1;getchar();elsew2=0;while(w2=1);if(t=1)for(i=0;i<m;i+)if(strcmp(memi.name,memm.name)=0)puts("name has existed!cannot save,Press any key to meun!");for(j=0;j<20;j+) memm.namej='0'for(j=0;j<11;j+)memm.telj='0'memm.type=0;for(i=0;i<30;i+)memm.emailj='0'system("pause");menu();if(strcmp(memi.tel,memm.tel)=0)puts("telephone number has existed!cannot save,Press any key to menu!");for(j=0;j<20;j+) memm.namej='0'for(j=0;j<11;j+)memm.telj='0'memm.type=0;for(i=0;i<30;i+)memm.emailj='0'system("pause");menu();save(m); /*保存联系人信息至文本文档*/puts("information saved!n");puts("there follows all the informations:n");printf_all(m+1);getchar();puts("Press any key to return to menu");system("pause");menu();if(t=2) /*如果用户不保存,则将刚刚存入结构体中的数据删除*/for(i=0;i<20;i+) memm.namei='0'for(i=0;i<11;i+)memm.teli='0'memm.type=0;for(i=0;i<30;i+)memm.emaili='0'puts("information not saved!n");puts("there follows all the informations:n");printf_all(m);getchar();puts("Press any key to return to menu");system("pause");menu();6. 修改联系人模块需求分析该模块的功能的功能是显示所有联系人信息。显示完后,用户输入要修改联系人的序号,系统根据用户输入的序号显示用户选择的联系人,并提示用户需要修改哪部分信息,是姓名、电话、类型还是电子邮箱。根据用户的选择修改相应的信息。程序 void modify()int m,n,t,w1,w2;m=load();puts("there follows all the informations:t");printf_all(m); /*显示所有信息,以便用户确认所要修改的信息*/doputs("please input the number that you want to modify,or press '0' to exit:");scanf("%d",&n);if(n<0|n>m)w1=1;getchar();elsew1=0;while(w1=1);if(n=0)menu();printf_one(n);doputs("tttt1,name");puts("tttt2.telephone");puts("tttt3.type");puts("tttt4.email");puts("tttt0.Exit");puts("choose which information do you want to modify,or press '0' to exit:");scanf("%d",&t);if(t<0|t>4)w2=1;getchar();elsew2=0;while(w2=1);结束返回至主菜单调用相应功能模块输入t判断t是否在04中n是否等于0根据n的值调用相应功能模块判断n是否在015中开始输入n运行m=load()函数,加载现有联系人信息,并显示所有用户信息NYNYNY图五 修改联系人模块流程图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();7. 删除联系人模块需求分析该模块首先显示现有所有联系人,显示完成后,用户输入要删除的联系人序号。删除方式是将数据从结构体中删除,然后将后面的记录向前移。删除之后将记录保存至文件中。程序void del()int m,n,w1,w2,t,i;m=load();puts("there follows all the informations:t");printf_all(m);doputs("please input the number that you want to delete: bb");scanf("%d",&n);if(n<0|n>m)w1=1;getchar();elsew1=0;while(w1=1);do /*用do while语句控制用户的输入,使用户只能输入1或者2*/puts("you want to delete this information:");printf_one(n);puts("nAre you sure to delete? 1,yes 2,no");scanf("%d",&t);开始运行m=load();加载现有联系人信息;并显示所有联系人信息输入要删除的联系人序号n判断0nm是否成立NY显示用户要删除的联系人的所有信息用户是否确认删除NY删除数据,并运行move函数,将删除位置后面的数据前移运行save函数,将信息保存至文件中返回至主菜单结束图六 删除联系人模块if(t<1|t>2)w2=1;getchar();elsew2=0;while(w2=1);if(t=2)puts("information not deleted!Press any key to back to menun");getchar();system("pause");menu();if(t=1)for(i=0;i<20;i+)memn-1.namei='0'for(i=0;i<11;i+)memn-1.teli='0'memn-1.type=0;for(i=0;i<30;i+)memn-1.emaili='0'move(n,m);puts("information deleted!Press any key to back to menun");getchar();system("pause");menu();8. 公共函数一下为各模块中可能用到的一些公共函数。(1) 加载联系人信息函数:int load()说明该函数用于将文件中的数据加载至结构体中,并且可以返回现有联系人的数目。程序int load()FILE *fp;int i,j;if(fp=fopen("E:vc programmesmembers.txt","rb")=NULL)/*以只读方式打开一个二进制文件*/printf("ncannot find information");for(i=0;(!feof(fp)&&(i<N);i+)fread(&memi,sizeof(struct member),1,fp);/*将文件中的数据加载至结构体中*/fclose(fp); /*关闭文件*/for(j=0;(strcmp(memj.name,"0")!=0)&&(j<N);j+);/*通过检测联系人姓名否为空来判断联系人数量*/return(j); /*返回现有联系人数量*/(2) 保存所有联系人函数:void save(int m)说明该函数形参m表示现有结构体中最后一个元素的下标。该函数主体如下程序void save(int m) /*m表示现有结构体中最后一个元素的下标*/if(m=0) /*当m=0,即只有一个元素时,进入save_1函数,对文件进行只写操作*/save_1();elsesave_1(); /*当m>0时,首先进入save_1函数,新建一个文件,同时把mem0的数据保存;然后进入save_2函数,将mem1到memm的数据追加至文件中*/ save_2(m);该包含两个子函数:void save_1()和void save_2(int m),当结构体中只有一个元素,即m=0时,只执行第一个函数,新建一个文件并将数据存入文件中;如果结构体中多于一个元素,即m>0时,首先执行第一个函数新建一个文件,然后执行第二个函数,将结构体中下标大于0的数据存入文件中。程序void save_1()FILE *fp;if(fp=fopen("E:vc programmesmembers.txt","wb")=NULL)printf("ncannot find information");fwrite(&mem0,sizeof(struct member),1,fp);fclose(fp);程序void save_2(int m)int i;FILE *fp;if(fp=fopen("E:vc programmesmembers.txt","ab")=NULL)printf("ncannot find information");for(i=1;i<=m;i+)fwrite(&memi,sizeof(struct member),1,fp);fclose(fp);(3) 显示所有联系人函数:void printf_all(int m)说明形参m表示现有联系人的数目。用以控制输出联系人的数量。该函数用于输出所有的联系人信息。程序void printf_all(int m)int i;printf("nntt all the contracts as follows:");printf("nnNO. name telephone type email n");for(i=0;i<m;i+) /*判断联系人类别并输出*/if(memi.type=1)printf("%2d %-20s %-11s clerical %-30sn",i+1,memi.name,memi.tel,memi.email);if(memi.type=2)printf("%2d %-20s %-11s personal %-30sn",i+1,memi.name,memi.tel,memi.email);if(memi.type=3)printf("%2d %-20s %-11s commercial %-30sn",i+1,memi.name,memi.tel,memi.email);(4) 显示办公类联系人函数:void printf_cle(int m)说明形参m表示现有联系人数目。用以控制循环终点。该函数用于输出所有办公类联系人信息。程序void printf_cle(int m)int i;printf("nntt clerical contracts as follows:");printf("nnname telephone type email n");for(i=0;i<m;i+)if(memi.type=1) /*判断联系人是否属于办公类*/printf("%-20s %-11s clerical %-30sn",memi.name,memi.tel,memi.email);(5) 显示个人类联系人函数:void printf_per(int m)说明形参m表示现有联系人数目。用以控制循环终点。该函数用于输出所有个人联系人信息。程序void printf_per(int m)int i;printf("nntt personal contracts as follows:");printf("nnname telephone type email n");for(i=0;i<m;i+)if(memi.type=2) /*判断联系人是否属于个人类*/printf("%-20s %-11s personal %-30sn",memi.name,memi.tel,memi.email);(6) 显示商务类联系人函数:void printf_com(int m)说明形参m表示现有联系人数目。用以控制循环终点。该函数用于输出所有商务类联系人信息。程序void printf_com(int m)int i;printf("nntt commercial contracts as follows:");printf("nnname telephone type email n");for(i=0;i<m;i+)if(memi.type=3) /*判断联系人是否属于商务类*/printf("%-20s %-11s commercial %-30sn",memi.name,memi.tel,memi.email);(7) 显示某一联系人函数:void printf_one(int m)说明形参m表示现有联系人数目。用以控制循环终点。该函数用于输出某一指定联系人信息。程序void printf_one(int m)printf("name telephone type email n");if(memm-1.type=1) /*三个if语句判断联系人类型*/printf("%-20s %-11s clerical %-30sn",memm-1.name,memm-1.tel,memm-1.email);if(memm-1.type=2)printf("%-20s %-11s personal %-30sn",memm-1.name,memm-1.tel,memm-1.email);if(memm-1.type=3)printf("%-20s %-11s commercial %-30sn",memm-1.name,memm-1.tel,memm-1.email);(8) 修改姓名函数:void modify_name(int n,int m)说明该函数用于修改联系人姓名。形参n为用户输入的要修改的联系人序号;m表示现有联系人数量。程序void modify_name(int n,int m)char mod_name20; /*用于暂存用户输入的更改后的联系人姓名*/int i,t,w1;puts("please input the new name:");scanf("%s",mod_name);doputs("Are you sure to save? 1.yes 2.no bb");scanf("%d",&t);if(t<1|t>2)w1=1;getchar();elsew1=0;while(w1=1);if(t=1)/*当用户输入1,即确认修改时,将原来存在结构体中联系人的姓名删除,并将新的联系人姓名赋到结构体中*/for(i=0;i<20;i+)memn-1.nam