电话号码簿管理系统,课程设计报告,.doc_第1页
电话号码簿管理系统,课程设计报告,.doc_第2页
电话号码簿管理系统,课程设计报告,.doc_第3页
电话号码簿管理系统,课程设计报告,.doc_第4页
电话号码簿管理系统,课程设计报告,.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

.目 录摘 要2第1章 需求分析31.1 问题提出31.2 本系统涉及的知识点31.3 功能要求31.3.1 功能菜单3第2章 总体功能设计42.1 算法设计42.1.1主界面菜单42.1.2根据所选菜单编写相应代码42.2 模块图52.3 部分模块流程图5第3章 程序代码设计73.1 create模块73.2 save模块73.3 load模块73.4 print模块83.5 search模块83.6 delete模块83.7 append模块93.8 modify模块9第4章 C程序设计总结104.1 程序调试104.1.1程序调试情况104.1.2 感想11谢 辞11参 考 文 献12附录 程序清单13摘 要本报告包括需求分析、总体功能设计、程序代码设计、C程序设计总结、谢辞、参考资料、附录七部分。需求分析中介绍了要实现的功能、功能菜单、涉及的知识点以及各功能之间的联系。总体功能设计中介绍了算法设计、模块图、主菜单以及根据主菜单而对各分函数的设计进行大致的描述,位于后面的是部分模块流程图。程序代码设计中详细描述了各分模块的代码设计,包括用到的函数、各种语句、对变量和功能的介绍说明,具体详见附录中的源代码。C程序设计总结中记录了调试程序时遇见的情况及解决方法和此次设计的感想。在谢辞中表达了对给予帮助的人员的感谢。参考资料中列举的是完成本设计所参考的资料。附录中为程序清单。关键词 功能菜单,模块图,代码设计,调试程序。第1章 需求分析1.1 问题提出本人计划编写一个电话号码簿管理系统,主要用来管理联系人电话号码。1.2 本系统涉及的知识点函数、结构体、指针、文件、链表、循环、判断、switch语句等。1.3 功能要求(1) 增加记录的修改功能。(2) 将指定电话从电话簿中删除。(3)显示当前电话簿中的所有信息。(4)实现查询,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。1.3.1 功能菜单1、建立新的电话号码簿,每个联系人的信息包括:姓名、电话号码; 2、读取电话号码簿;3、打印电话号码簿;4、查询电话号码;5、删除电话号码;6、添加新的电话号码;7、修改电话号码;8、退出电话号码簿管理系统;保存删除电话号码查询电话号码打印电话号码簿读取电话号码簿创建新的电话号码簿添加新的电话号码修改电话号码电话号码簿管理系统退出系统功能说明,如图 1:图1 系统功能说明图第2章 总体功能设计2.1 算法设计将程序分为9个模块,分别是create、save、load、print、search、delete、append、modify、main(主模块)。2.1.1主界面菜单在main()函数中利用switch语句设计如图2所示的主菜单。电话号码簿管理系统VER1.01、 create 建立新的电话号码簿2、 load 读取电话号码簿3、 print 打印电话号码簿4、 search 查询电话号码5、 delete 删除电话号码6、 append添加新的电话号码7、 modify修改电话号码8、 exit 退出电话号码簿管理系统 请选择1-8之间的操作图2 电话号码簿管理系统主界面菜单2.1.2根据所选菜单编写相应代码定义结构体类型struct tel,数据域char name15; char tel12;指针域ID *next(ID表示#define ID struct tel )。1、 创建函数create:利用循环输入的方式,将有关信息存入结构体,结构体根据实际的人数,采用动态方式建立单链表存储所有联系人信息,最后返回头指针head。 保存函数save:头指针作形式参数,利用文件函数fopen建立一个文本文件来存放电话号码簿,将单链表中的联系人信息用循环的方式和函数fwrite写入文件,无返回值。2、 读取函数load:无形式参数,利用文件函数fopen打开建立过的文本文件,在循环中利用fread函数依次读出文件中的信息,返回头指针。3、 打印函数print:头指针作形式参数,定义一个临时变量ID *temp,利用此变量遍历单链表,同时输出联系人信息,如果没有联系人信息,则输出提示,无返回值。4、 查询函数search:头指针作形式参数,利用双重循环,并且在内层循环中利用if语句实现查询功能,内层循环用来遍历单链表,外层循环用来实现是否继续查找功能,无返回值。5、 删除函数delete:头指针作形式参数,利用双重循环,并且在内层循环中利用if语句实现查询并删除功能,内层循环用来遍历单链表,外层循环用来实现是否继续删除功能,无返回值。6、 添加函数append:无形式参数,定义一个变量ID *temp,新联系人信息赋值予此变量中,利用fopen函数打开在create函数中建立的文件,在循环中依次输入联系人信息并利用fwrite函数将添加的信息存入文件中,无返回值。7、 修改函数modify:头指针作形式参数,利用双重循环,内层循环用来遍历单链表,同时利用三个if语句分别找到待修改记录、确定是否修改、确定是否保存。外层循环用来实现是否继续修改。2.2 模块图主模块创建电话簿保存信息添加信息删除信息查找信息打印信息修改信息读取信息图3 电话号码簿管理系统模块图2.3 部分模块流程图1主模块流程图*haed=NULL1?输出主菜单输入选择(吸收回车) 调用各子函数图4主模块流程图2 create模块流程图*head=*p1=*p2=NULL1?为p1分配内存空间输入姓名 输入的是#是 否total=0是否返回head退出循环退出循环输入电话号码head=NULL 是 否head=p1p2=p1p2-next=p1p2=p1total=total+1p2-next=NULL释放空间 输出提示(是否存盘?) (吸收回车)输入选择 Saveflag=Y|saveflag=y是 否调用save函数返回 head图 5 create模块流程图第3章 程序代码设计3.1 create模块1、函数原形:ID* create()2、功 能:利用while循环语句scanf、getchar、prinf、malloc、free函数完成对单链表的输入,存放n个联系人的信息(姓名、电话号码)。3、变量及类型:int total:记录结点个数,定义为全局变量。ID *head=NULL,*p1,*p2:结构体指针,p1、p2为全局变量,创建单表所需的变量。char saveflag:控制是否保存的变量。4、说明:首先将save模块在外部声明(便于其它模块调用),执行完输入函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数 (其它模块中也有类似情形。)ID使用的是宏定义 #define ID struct tel 。5、代码:见附录。3.2 save模块1、函数原形:void save(ID* head)2、功 能:利用文件指针fp及文件函数fopen、fwrite 、fclose将联系人信息存入磁盘。3、变量及类型:FILE *fp:定义文件指针(外部变量,便于其它函数使用)。ID * t:可以移动的指针,作用:从头到尾遍历一遍单链表,向文件写入。4、说明:fp=fopen(telephone.txt,w)以只写形式在当前目录下建立文件telephone.txt。fwrite(t,sizeof(ID),1,fp)向文件中写入数据,t表示输出数据的首地址,1表示数据块个数,数据块大小为sizeof(ID),fp是文件指针。 5、代码:见附录。 3.3 load模块1、函数原形:ID* load()2、功 能:while循环语句fopen、fread、feof、fclose 、malloc函数读取文件telephone.txt中的信息。3、变量及类型:ID *t1,*t2,*head=NULL:结构体指针,遍历单链表所需的变量。4、说明:t1=(ID *)malloc(sizeof(ID)申请空间,以便于存放从文件中读取的内容。while(!feof(fp)当文件不处于结束位置时循环,fread(t1,sizeof(ID),1,fp) 读取文件中数据,t表示输出数据的首地址,1表示数据块个数,数据块大小为sizeof(ID),fp是文件指针。5、代码:见附录。3.4 print模块1、函数原形:void print(ID* head)2、功 能:利用while循环语句printf函数依次输出联系人信息。3、变量及类型:ID* temp:临时变量,用来遍历单链表。4、说明:system(cls)清屏,while(temp!=NULL)当单链表未遍历完时循环。如果head=NULL,则输出提示(当前电话号码簿为空)。5、代码:见附录。3.5 search模块1、函数原形:void search(ID *head)2、功 能:利用双重循环查找,内层循环用来查找并输出,外层循环用来确定是否重新查找。3、变量及类型:int flag,searchflag=1:flag用来确定是否找到待查找记录的变量,searchflag用来确定是否重新查找(循环)的变量,searchflag=1时循环。char c choice:c表示待查姓名的首字母,choice表示用户的选择,是否重新查找。4、说明:其中用到全局变量p1、p2来遍历单链表,判断语句if(p1-name0 =c)用来确定是否找到待查记录。5、代码:见附录。3.6 delete模块1、函数原形:void delete(ID *head)2、功 能:利用双重循环查找,内层循环用来查找并删除,外层循环用来确定是否继续查找。3、变量及类型:int flag,searchflag=1:flag用来确定是否找到待删除记录的变量,searchflag用来确定是否重新查找(循环)的变量,searchflag=1时循环。char c choice d:c表示待查姓名的首字母,choice表示用户的选择,是否继续删除,d表示用户的选择,是否确认删除,确认删除后调用save函数。4、说明:整体上和search函数类似,先查找到待删除结点,找到后利用 if(p1=head) head=p1-next;else p2-next=p1-next;语句删除结点,p1指向的是待删结点,p2所指的是p1所指结点的前一个结点。5、代码:见附录。3.7 append模块1、函数原形:void append()2、功 能:利用while循环语句malloc、free、fopen、fwrite、fclose函数依次添加联系人信息。3、变量及类型:int flag=1:控制是否循环(继续添加联系人)的变量,flag为1时继续添加。 ID* temp:临时变量,用来存放新联系人信息。 char choice:用户的选择,控制flag中的值及是否跳出循环。4、说明:使用文件的方式为”a+”(允许在文件末尾追加数据),在循环中,每添加一次,要为temp分配一次空间,添加过后释放空间。5、代码:见附录。3.8 modify模块1、函数原形:void modify(ID *head)2、功能:利用双重循环查找,内层循环用来查找并修改,外层循环用来确定是否继续修改。3、变量及类型:int flag,searchflag=1:flag用来确定是否找到待修改记录的变量,searchflag用来是否重新查找(循环)的变量,searchflag=1时循环。char c, choice ,d,s:c表示待查姓名的首字母,choice表示用户的选择,是否继续修改,d表示用户的选择,是否确认修改,s表示用户的选择,是否保存修改后的记录(调用save函数)。 4、说明:整体上和search函数类似,找到待修改信息后直接对该结点数据域重新赋值即可。5、代码:见附录。第4章 C程序设计总结4.1 程序调试本人在程序设计中遇到的困难、收获,如何解决问题以及感想。4.1.1程序调试情况调试方法:每编好几个模块(包括相关模块),调试一次。运行程序,出现如图主界面:图6电话号码簿管理系统主界面输入指令数1后给予提示:请输入姓名,以#作为结束的标志:创建电话号码簿后,保存,打印正常。load、search 模块写好后,根据上一次创建的电话簿读取,然后查找,运行正常。调试delete模块时,出现情况:删除一个记录后,无法继续进行删除。如图: 图7 delete模块调试情况如果输入y,按提示操作,输入已有姓名首字母,却迅速显示一些提示后退出该功能。查找原因后,发现在循环末尾少一句getchar()来吸收回车,由于回车作为首字母字符,故所有输入的字符都作为了下一个字符变量的值,从而导致判断失误。加上getchar()后程序运行正常。收获:在循环语句中如果循环末尾和开头都有字符输入,应在末尾吸收回车或在开头输入字符前吸收回车。append模块的调试:添加记录后调用save函数保存,出现提示,错误的内存指令一系列信息。思考:第一次编写此模块源代码时将添加的记录直接调用save函数,而save函数中的文件使用方式是”w”,这种调用不符合添加规则,故无法调用save函数。修改:在此模块中打开已建立的文件,打开方式为”a+”,然后依次将新记录追加写入文件。4.1.2 感想 经此次设计,使我了解了设计一个软件的的大致开发流程,当遇见情况时的处理措施,还有独立解决问题和与他人交流合作的能力。虽然有了点经验,但还是感觉不足,对计算机方面的一些设计思想不是清晰,还没有形成自己的编程风格。我认为有待进一步学习。谢 辞感谢班主任王老师的指导,感谢同学的交流与讨论,感谢父母的资助。参 考 文 献 1 郭有强,C语言程序设计,清华大学出版社。2 谭浩强,C程序设计,清华大学出版社。3 刘振安,孙忱,刘燕君,C程序设计课程设计,机械工业出版社。4 汪诗林,数据结构算法与应用,机械工业出版社。附录 程序清单#include stdio.h#include stdlib.h#include string.h#include conio.h /*不是C标准的头文件,表示console input/output */#define ID struct tel struct tel char name15; char tel12; ID * next; void save( );int total=0;ID *p1,*p2;/*创建单链表函数*/ID* create() ID *head=NULL,*p1,*p2; char saveflag; head=p1=p2=NULL; /*p1是新开辟的指针,p2的作用是连接链表的尾部和新开辟的结点 */ printf(tttt 欢迎使用n); while(1) p1=(ID*)malloc(sizeof(ID); printf(请输入姓名,以#作为结束的标志:n); scanf(%s,p1-name); if(strcmp(p1-name,#)=0) if(total=0) printf(你输入了0条记录,单链表没有创建.n); free(p1); return head; break; printf(请输入电话号码:n); scanf(%s,p1-tel); if(head=NULL)/*第一次执行,以后不执行*/ head=p1; p2=p1; else p2-next=p1; p2=p1; total+; p2-next=NULL;/*收尾工作*/ free(p1); getchar();/*吸收回车*/ printf(新建电话号码簿成功,共有%d个联系人,是否存盘? Y/N t,total); scanf(%c,&saveflag); if(saveflag=Y|saveflag=y) save(head); return head; /*保存单链表函数*/FILE *fp; /*定义文件指针*/void save(ID* head) ID* t; /*定义一个可以移动的指针,作用:从头到尾遍历一遍单链表,向文件中写入*/ if(fp=fopen(telephone.txt,w)=NULL) printf(ttt 打开文件失败!不存在该文件。n); getch(); /*从键盘上等待用户输入一个字符*/ exit(1); printf(ttt 正在保存文件,请稍.n); t=head; while(t!=NULL) fwrite(t,sizeof(ID),1,fp); t=t-next; fclose(fp); printf(ttt 文件保存成功!n); /*读取单链表函数*/ID* load() ID *t1,*t2,*head=NULL; if(fp=fopen(telephone.txt,r)=NULL) printf(ttt 打开文件失败!不存在该文件。n); getch();/*等待用户输入一个字符*/ exit(1); t1=(ID *)malloc(sizeof(ID); /*申请空间,以便于存放从文件中读取的内容*/ head=t1; while(!feof(fp) if(fread(t1,sizeof(ID),1,fp)!=1) break;/*如果没有读取的内容,则结束*/ t1-next=(ID *)malloc(sizeof(ID); t2=t1; t1=t1-next; t2-next=NULL; fclose(fp); printf(ttt 文件读取完毕!n) ; return head;/*打印单链表函数*/void print(ID* head)ID* temp;temp=head;system(cls); /*清屏*/printf(姓名 tt 电话号码n);if(head=NULL) printf(tt 当前电话簿为空,请先创建新的号码或加载文件n);elsedo printf(%stt %sn,temp-name,temp-tel); temp=temp-next; while(temp!=NULL);/*创建查找函数*/void search(ID *head) printf(tt欢迎使用查找功能,请输入待查找姓名的首字母n); int flag,searchflag=1; char c,choice; while(searchflag) printf(请输入待查姓名的首字母:); scanf(%c,&c); getchar(); p1=head; flag=0; while(p1!=NULL) if(p1-name0=c) printf(姓名:%st电话号码:%sn,p1-name,p1-tel); flag=1; p2=p1; p1=p1-next; /*p1指针向后移动一位*/ if(flag=0) printf(ttt 对不起,未能找到符合条件的记录。n); printf(ttt 查找完毕,是否重新查找? Y/Nt); scanf(%c,&choice);getchar(); if(choice=Y|choice=y) searchflag=1; else system(cls); break; /*创建删除函数*/void delete(ID *head) int flag,searchflag=1; char c,choice,d; while(searchflag) printf(请输入待删除姓名的首字母:); scanf(%c,&c); getchar(); p1=head; flag=0; while(p1!=NULL) if(p1-name0=c) printf(姓名:%st电话号码:%sn,p1-name,p1-tel); printf(ttt 是否删除该记录? Y/Nt); scanf(%c,&d);getchar(); if(d=Y|d=y) if(p1=head) head=p1-next; else p2-next=p1-next; free(p1); save(head); flag=1; p2=p1; p1=p1-next; /*p1指针向后移动一位*/ if(flag=0) printf(ttt 对不起,未能找到符合条件的记录。n); printf(ttt 完成,是否继续删除? Y/Nt); scanf(%c,&choice); getchar(); if(choice=Y|choice=y) searchflag=1; else system(cls); break; /*创建添加函数*/void append() int flag=1; ID* temp; char choice; if(fp=fopen(telephone.txt,a+)=NULL) printf(ttt 打开文件失败!不存在该文件。n); getch(); /*从键盘上等待用户输入一个字符*/ exit(1); while(flag) temp=(ID*)malloc(sizeof(ID); printf(请输入新联系人姓名:); scanf(%s,temp-name);getchar(); printf(n请输入新联系人的电话号码:); scanf(%s,temp-tel);getchar(); fwrite(temp,sizeof(ID),1,fp); free(temp); printf(ttt 添加完毕,是否继续添加? Y/Nt); scanf(%c,&choice); if(choice=Y|choice=y) flag=1; else system(cls); break; fclose(fp); /*创建修改函数*/void modify(ID *head) int flag,searchflag=1; char c,choice,d,s; while(searchflag) printf(请输入待修改姓名的首字母:); scanf(%c,&c); getchar(); p1=head; flag=0; while(p1!=NULL) if(p1-name0=c) printf(姓名:%st电话号码:%sn,p1-name,p1-tel); printf(ttt 是否修改该记录? Y/Nt); scanf(%c,&d);getchar(); if(d=Y|d=y) printf(请输入新姓名:); gets(p1-name); printf(请输入新电话号码:); gets(p1-tel); printf(ttt 是否保

温馨提示

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

评论

0/150

提交评论