版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实训报告实训报告题目:简易通讯录管理系统院系:专业:姓名:学号:指导教师:日期:2009年9月19日桂林电子科技大学信息科技学院目录1问题定义…………..32系统设计……………………32.1总体设计………………32.2详细设计………………42.2.1数据结构设计…………42.2.2主控流程…………52.2.3输入记录模块……………………62.2.4查询记录模块……………….…62.2.5管理记录模块………………62.2.6输出记录模块……………….…63系统实现………………………73.1编码………………………73.1.1程序预处理……….……………73.1.2主函数main()……….………83.1.3主菜单界面………….………83.1.4保存信息并释放内存空间…….…………………93.1.5记录查找(按姓名)………….…………………103.1.6输入记录……….…………………….…………113.1.7输出记录………….………………….…………113.1.8删除记录………….…………………….………123.2测试与调试………………………123.2.1概述………….……………123.2.2程序测试………….……………134系统维护………………………155归纳总结………………………165.1开发经验………………………165.2设计中的不足之处……………………165.3感想和心得体会……………………16简易通讯录管理系统本题目设计目的是训练学生的基本编程能力,了解简易通讯录的开发流程,熟悉C语言的文件各种基本操作。本程序中涉及很多方面的知识,通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握对简易通讯录实现的原理,进一步开发出高质量的通讯录系统打下坚实的基础。问题定义创建一个简易通讯录管理系统。假设系统中包含输入信息,显示信息,增加信息,删除信息和保存等信息。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。系统设计2.1总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。通讯录管理系统通讯录管理系统输入记录模块模块查询记录模块管理记录模块输出记录模块从键盘输入按姓名查询添加记录删除记录输出至文件输出至屏幕图2.1本成绩管理系统要求采用单链表实现,如图2.1所示,它由如下四大功能模块组成:输入记录模块。完成将数据存入单链表的工作。从键盘上逐个输入数据。。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。查询记录模块。完成在单链表中查找满足相关条件的记录。在此通讯录系统中,用户可以按照姓名在单链表中进行查找。若找到该人物的记录,则返回指向该人物的记录的指针。否则返回一个值为NULL的空指针,并打印出未找到该人物记录的提示信息。管理记录模块。完成在单链表中删除满足相关条件的人物记录。按照姓名先查找,再删除此记录。完成在单链表中继续添加人物信息的记录。与输入记录模块一样。输出记录模块。一是实现对人物记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。2.2详细设计2.2.1数据结构设计通讯录结构体structTelephone{charname[20];charaddrass[20];charzip[20];chartelephone[20];structTelephone*next;};结构体structTelephone用于储存通讯录的基本信息。结构体typedefstructTelephoneTEL;TEL*head=NULL;voidshowmenu();//菜单voidAppenditem();//添加条目voidprint();//输出条目voidFinditem1();//查找条目(按姓名)voidRemoveitem();//删除信息voidSaveandfree();//保存到文件voidOpen();//打开文件2.2.2主控main()函数的执行voidmain(){charch;Open();//打开文件while(1){showmenu();//显示菜单scanf("%c",&ch);switch(ch){case'1':Appenditem();//添加条目break;case'2':print();//输出条目break;case'3':Finditem1();//查找条目1.按姓名break;case'4':Removeitem();//删除信息print();//输出删除后的结果break;case'0':Saveandfree();//保存并释放内存exit(0);//退出break;default:printf("选择错误!");break;}}}先打开文件,此文件若不存在,则新件此文件.2.2.3输入记录模块输入记录模块主要实现将数据存入单链表中.用户选择voidAppenditem()函数进行对人物记录的输入,即完成在单链表中添加记录的操作.值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样一来,大大减少了代码的重复和冗余,符合模块化程序设计的特点。2.2.4查询记录模块查询记录模块主要实现了在单链表中按姓名查找满足相关条件的人物记录。在查询模块函数voidFinditem1()中,p为指向保存了学生成绩信息的单链表的首地址的指针变量。为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作,设计成了一个单独的函数若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。2.2.5管理记录模块此模块主要实现了对学生记录的删除、添加操作。因为学生记录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。(1)删除记录。该操作完成删除指定学号或姓名的学生记录,它也分两步完成。第一步,输入要删除的姓名,输入后调用定位函数,在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学号或姓名的学生记录,则返回指向该学生记录的节点指针;第二步,若找到该学生记录,将该学生记录所在节点的前驱节点的指针域,指向目标节点的后继节点。(2)添加记录。该操作完成在指定学号的随后位置插入新的学生记录。首先,要求用户输入某个学生的学号,新的记录将插入在该学生记录之后;然后,提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后.2.2.6输出记录模块当把记录输出至文件时,调用函数,将p指针所指节点中的各字段值,写入文件指针fp所指的文件。当把记录输出至屏幕时,调用函数,将单链表中的人物记录信息以表格的形式在屏幕上打印出来。开始着手进行系统实现的工作,开始程序代码的编写.3.系统实现3.1编码3.1.1程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。#include<stdio.h>#include<string.h>#include<stdlib.h>structTelephone{charname[20];charaddrass[20];charzip[20];chartelephone[20];structTelephone*next;};typedefstructTelephoneTEL;TEL*head=NULL;voidshowmenu();//菜单voidAppenditem();//添加条目voidprint();//输出条目voidFinditem1();//查找条目(按姓名)voidRemoveitem();//删除信息voidSaveandfree();//保存到文件voidOpen();//打开文件3.1.2主函数main()main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。voidmain(){charch;Open();//打开文件while(1){showmenu();//显示菜单scanf("%c",&ch);switch(ch){case'1':Appenditem();//添加条目break;case'2':print();//输出条目break;case'3':Finditem1();//查找条目1.按姓名break;case'4':Removeitem();//删除信息print();//输出删除后的结果break;case'0':Saveandfree();//保存并释放内存exit(0);//退出break;default:printf("选择错误!");break;}}}3.1.3主菜单界面用户进入通讯录管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。//菜单voidshowmenu(){printf("\n*****************通讯录系统*****************\n");printf("\t1.添加条目。\n");printf("\t2.输出输出\n");printf("\t3.按姓名查询\n");printf("\t4.删除条目\n");printf("\t0.保存并退出!\n");printf("*************************************************\n");printf("\t请选择:\n");}3.1.4保存信息并释放内存空间voidSaveandfree(){TEL*p=NULL;FILE*fp;char*Book="books.txt";if(head==NULL){printf("\n记录为空!\n");return;}elsep=head->next;if((fp=fopen(Book,"wb+"))==NULL){printf("\n打不开文件!\n");return;}while(p!=NULL)//保存信息{fwrite(p,sizeof(TEL),1,fp);p=p->next;}printf("保存完毕!");fclose(fp);//*****释放链表空间*****for(;head->next!=NULL;){p=head->next;head->next=head->next->next;free(p);}free(head);}//文件信息输出到链表voidOpen(){FILE*fp;TEL*p1=NULL,*p2=NULL,*temp=NULL;if((fp=fopen("books.txt","rb+"))==NULL){printf("\n****************这是一个新的通讯录管理系统******************\n");return;}head=(TEL*)malloc(sizeof(TEL));head->next=NULL;temp=p2=head;while(!feof(fp))//循环读取{p1=(TEL*)malloc(sizeof(TEL));temp=p2;p2->next=p1;p2=p1;fread(p1,sizeof(TEL),1,fp);}temp->next=NULL;fclose(fp);//关闭文件}3.1.5记录查找(按姓名)需要先输入姓名,找到相应的记录voidFinditem1(){TEL*p;charfindname[20];printf("请输入要查找的姓名:\n");scanf("%s",findname);printf("**************通讯录系统*********************\n");printf("姓名\t地址\t邮编\t电话\n");for(p=head->next;p!=NULL;p=p->next){if(strcmp(p->name,findname)==0)printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone);}}3.1.6输入记录voidAppenditem(){TEL*p1=NULL,*p2=NULL;p1=(TEL*)malloc(sizeof(TEL));//申请结点printf("输入姓名:\n");//添加信息scanf("%s",p1->name);printf("输入地址:\n");scanf("%s",p1->addrass);printf("输入邮编:\n");scanf("%s",p1->zip);printf("输入电话:\n");scanf("%s",p1->telephone);p1->next=NULL;//保存到链表if(head==NULL){head=(TEL*)malloc(sizeof(TEL));//申请空间head->next=p1;}else{for(p2=head;p2->next!=NULL;p2=p2->next);//找到结点尾p2->next=p1;}printf("此信息已添加!");}3.1.7输出记录voidprint(){TEL*p=NULL;if(head==NULL){printf("此通讯录中无记录,请输入记录后在使用本功能!\n");return;}printf("**************通讯录系统*********************\n");//输出信息printf("姓名\t地址\t邮编\t电话\n");for(p=head->next;p!=NULL;p=p->next)printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone);}3.1.8删除记录voidRemoveitem(){charfindname[20];//先查找后删除TEL*p=head->next,*pr=head->next;printf("请输入要删除的姓名:\n");scanf("%s",findname);if(head->next==NULL){printf("无此节点!\n");return;}while((strcmp(p->name,findname)!=0)&&p->next!=NULL){pr=p;p=p->next;}if(strcmp(findname,p->name)==0)//输出删除信息{printf("%s\t%s\t%s\t%s\n",p->next->name,p->next->addrass,\p->next->zip,p->next->telephone);if(p==head->next)head->next=p->next;elsepr->next=p->next;free(p);}printf("此信息已删除!");}3.2测试与调试3.2.1概述一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。测试程序需要测试用例,测试用例可用如下公式表示:测试用例=测试数据+预期结果。好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。还应分别测试输入合法数据与非法数据时,程序的运行情况,。对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。测试可按模块测试、组装测试和确认测试的步骤进行。(1)模块测试就是分别对各模块进行测试的过程。在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。(2)组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。(3)确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。3.2.2程序测试在主菜单中选择1当用户输入1并按回车键后,即可进入数据输入界面。其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国智慧港口自动化设备选型标准与投资效益报告
- 2025-2030中国智慧港口自动化升级与设备供应商投资机会
- 2025-2030中国智慧城市建设现状投资规模及未来发展趋势分析报告
- 2025-2030中国智慧农业物联网设备市场渗透率及商业模式评估报告
- 2025-2030中国智慧农业技术推广与产业化发展分析报告
- 2026江西萍建工程建设有限公司招聘11人备考题库【完整版】附答案详解
- 2026江苏苏州市常熟市卫生健康系统招聘备案制人员7人备考题库带答案详解(能力提升)
- 2026长春光机所春季招聘334人备考题库附答案详解(b卷)
- 2026甘肃省人力资源市场招聘就业见习人员6人备考题库【满分必刷】附答案详解
- 2026山东青岛海上综合试验场有限公司招聘38人备考题库附完整答案详解【典优】
- 土石坝安全监测与维修养护-土石坝护坡的修理
- 新里程大学英语听说教程谭思坦课后部分参考答案
- 病原生物与免疫-高职PPT完整全套教学课件
- 英语专业四级考试阅读技巧课件
- 六级词汇电子版(含例句)上
- 2023年3月PETS2真题卷及答案
- YS/T 22-2010锑酸钠
- GB/T 5825-1986建筑门窗扇开、关方向和开、关面的标志符号
- GB/T 28650-2012公路防撞桶
- GB/T 24524-2009金属材料薄板和薄带扩孔试验方法
- 大学生志愿服务基地合作共建协议书
评论
0/150
提交评论