2011-2012(2)《软件工程导论》实验报告学院:计算机学院班级:软件工程班姓名:学号:实验一:项目计划、分析和设计[实验日期]2013年5月8日[实验目的]初步了解结构化分析、设计方法的原理、步骤以及各阶段的文档,练习撰写简要的需求文档、设计文档。[实验内容]通讯录管理程序[实验原理和步骤]结构化分析(SA)分层数据流图面向数据流分析(DFA)的设计方法[实验结果]说明:main()函数打开通讯录Menu()函数选择要操作的功能Load()函数读取文件内容到通讯录List()函数显示通讯录中的内容App函数添加记录到通讯录Search函数按姓名查找Dele函数删除记录Save函数保存记录Sort函数按姓名排序各函数流程图如下添加记录:主函数Switch功能显示通讯录内容删除函数排序函数保存到通讯录查找函数显示函数打开函数保存函数添加记录3查找函数:开始返回主菜单输入联系人的姓名,电话,地址,群组是否继续添加是否删除函数:开始输出:选择何种方式查找输入方式按姓名查找按电话查找按群组查找输出查找到的所以信息返回主菜单联系人是否存在是是没有该相关信息排序函数:开始输入要删除联系人的姓名联系人是否存在返回主菜单成功删除!否是没有该联系人保存函数:开始返回主菜单按姓名排序是否显示排序后结果!否是显示函数:开始联系人是否为0个写入信息否是返回主菜单没有信息可保存信息保存成功[实验总结]规划一个软件系统,要考虑好每一步要做什么,各个方面都要得到深入的了解;并自己要把握好每一步,不能马虎。正确分配好每一步,每个过程,就像规划人生一样,完成每个步骤,这样可以让我们更加清楚的知道我们在做什么、应该怎么做、、、、、开始选择何种方式显示!输入方式分类输出!直接输出!返回主菜单实验二:编码[实验日期]2013年5月8日[实验目的]培养良好的编码风格。[实验内容]根据详细设计的结果,按结构化思想编写代码,并对程序进行注释。[实验原理和步骤]编码风格强调“清晰易读”而不是个人技巧。请注意变量或函数的名字要有意义,表达式和语句要一目了然,排版风格、循环语句风格要保持一致,函数宏的定义,常数的定义,注释要全面。注释包括序言性注释、函数模块注释和程序语句注释。[实验报告要求]//用数组实现的简单通讯录#includestdio.h#includestdlib.h#defineSIZE80structrecord{intnum;charname[9];intage;chartel[13],email[20],addr[20],zip[7];}rec[SIZE];inti,m=0;//m为当前通讯录中的记录数charmenu();//选单voidload();//读入voidlist();//显示voidapp();//添加voidsearch();//查找voiddele();//删除voidsave();//保存voidsort();//排序//**********************************************main(){charchoice;while(1){choice=menu();switch(choice){case'1':printf(显示通讯录中的内容。\n);list();break;case'2':printf(添加记录。\n);app();break;case'3':printf(按姓名查找。\n);search();break;case'4':printf(从通讯录中的删除内容。\n);dele();break;case'5':printf(按姓名对通讯录中的内容重新排序。\n);sort();break;case'6':printf(保存通讯录中的内容到文件。\n);save();break;case'7':printf(从文件读记录到通讯录。\n);load();break;case'0':printf(退出通讯录管理系统。\n);save();break;default:printf(输入错误!);}if(choice=='0')break;printf(\n按任意键继续.......!);getchar();}}//******************************************************************************charmenu(){charc;printf(\n\n\n\n\n\n\n=====通讯录管理系统=====\n);printf(--------------\n);printf(1.显示通讯录\n);printf(2.添加记录啊\n);printf(3.按姓名查找\n);printf(4.删除记录\n);printf(5.排序记录\n);printf(6.保存记录\n);printf(7.读入记录\n);printf(0.退出系统\n);printf(\n\n请选择......\n\n\n\n\n);c=getchar();getchar();returnc;}//*******************************************************************************voidload()//从文件度记录到通讯录中{FILE*fp;if((fp=fopen(txl.txt,wb))==NULL){printf(Cannotopenfile);exit(0);}list();for(i=0;im;i++)if(fwrite(&rec[i],sizeof(structrecord),1,fp)!=1)printf(Filewreteerror!\n);fclose(fp);}//*******************************************************************************voidlist()//显示通讯录中的内容{for(i=0;im;i++){if(rec[i].name[0]){printf(%3d%-8s%2d,rec[i].num,rec[i].name,rec[i].age);printf(%-12s%-20s,rec[i].tel,rec[i].email);printf(%-20s%-6s\n,rec[i].addr,rec[i].zip);}}}//*********************************************************************************voidapp()//添加记录{charan;puts(当前通讯录中的内容:\n);list();printf(当前通讯录中有%d条记录。\n,m);do{rec[m].num=m+1;printf(姓名:);gets(rec[m].name);printf(年龄:);scanf(%d,&rec[m].age);getchar();printf(电话:);gets(rec[m].tel);printf(email:);gets(rec[m].email);printf(地址:);gets(rec[m].addr);printf(邮编:);gets(rec[m].zip);puts(新输入的记录为:);printf(%3d%-8s%2d,rec[m].num,rec[m].name,rec[m].age);printf(%-12s%-20s,rec[m].tel,rec[m].email);printf(%-20s%-6s\n,rec[m].addr,rec[m].zip);m++;puts(继续输入吗?(Y/N));an=toupper(getchar());getchar();}while(an=='Y');}//********************************************************************voidsearch()//按姓名查找{charxm[9];printf(请输入查找的姓名:);gets(xm);for(i=0;im;i++){if(strcmp(xm,rec[i].name)==0){printf(%3d%-8s%2d,rec[i].num,rec[i].name,rec[i].age);printf(%-12s%-20s,rec[i].tel,rec[i].email);printf(%-20s%-6s\n,rec[i].addr,rec[i].zip);break;}}}//*********************************************************************voiddele()//删除记录{intsc;list();printf(当前通讯录中有%d条记录。\n,m);do{printf(删除几号记录:);scanf(%d,&sc);}while(scm&&sc0);if(sc!=m-1)for(i=sc;im;i++){rec[i-1]=rec[i];rec[i-1].num=i;}m--;list();}//*********************************************************************voidsave()//保存通讯录中的内容到文件{FILE*fp;if((fp=fopen(txl.txt,wb))==NULL){printf(Cannotopenfile);exit(0);}list();for(i=0;im;i++)if(fwrite(&rec[i],sizeof(structrecord),1,fp)!=1)printf(Filewreteerror!\n);fclose(fp);}//*************************************************************voidsort()//按姓名对通讯录中的内容重新排序{intj,k;structrecordt;list();for(i=0;im-1;i++){k=i;for(j=i;jm;j++)if(strcmp(rec[k].name,rec[j].name)0)k=j;if(k!=i){t=rec[k];rec[k]=rec[i];rec[i]=t;}for(i=0;im;i++)rec[i].num=i+1;}puts(\n排序已完成!);list();}[注意事项]1.模块的逻辑描述应该清晰第一、使用标准的、规范的控制结构、正确可靠[实验总结]收获与体会:1、不断运行:从程序的运行过程中你可以明白你所写的这段代码是否正确,以及信息的输出形式是否人性化,是否能让使用者满意。2、巧妙使用函数返回值:程序的运行是看不见的,但是我们可以通过函数的返回值来了解它到底有没有运行某一出的代码,进而依据此信息做出后续要执行的语句。3、注意细节:编码是最忌浮躁,要静下心来专心对待才能避免一些编码错误。实验三:代码复查、编译、测试[实验日期]2013年5月8日[实验目的]学习如何利用代码复查检查表快速而有效地发现程序中的缺陷。[实验内容]按照代码复查脚本规定的流程,对照代码复查检查表检查源代码并记录。编译程序,测试程序,修复所有缺陷,同时填写缺陷记录日志。[实验原理和步骤]如果想发现和改正程序的每一个缺陷,就必须遵照一个精确的规程。检查表可以帮助确保遵循这个规程。检查表也是一个构思的来源。当按照检查表去做时,就知道如何进行代码复查。检查表包括了个人的经验。通过不断地使用和改进个人检查表,可以更好地发现在程序中的缺陷。[实验报告要求]代码复查检查表一般性说明:在完成每个复查步骤之后,将发现的某个类型的缺陷的个数记录在右面的栏目中。如果该步骤没有发现缺陷,就在右面的栏目中打个表示检查