第1章大型程序的开发方法主要内容软件工程开发方法的介绍“扫雷”案例的讲解第1章大型程序的开发方法软件工程开发方法的介绍生命周期方法学:从时间角度对软件开发和维护的复杂问题进行分解,把软件生命的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化,加进了更多的实现细节。第1章大型程序的开发方法软件工程开发方法的介绍:生命周期方法学软件生命周期每个阶段及其解决的关键问题第1章大型程序的开发方法瀑布模型软件工程开发方法的介绍:生命周期方法学第1章大型程序的开发方法软件工程开发方法的介绍结构化程序设计方法:是一种设计程序的技术,采用自顶向下逐步求精的设计方法和单入口单出口的顺序、选择和循环三种基本控制结构。它提出的原则可归纳为32字:“自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。”第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法某学院为准备参加网络工程师认证的人员开办了相应的培训课程。当首批培训人员参加了认证考试后,该学院自然想知道这些学生考得如何,以便调整教学方案和收费标准。现在需要编写一个统计考试结果的程序,能够显示出通过和没有通过的人数,并且如果通过人数不低于总人数的70%,显示提高学费的建议。已知参加考试的人员有500名,并且已经在通过者的名字旁边标注了1,在未通过者的名字旁标注了2。应用实例问题描述第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法1)程序必须要处理500个应试者的考试结果,所以要使用循环;2)每个考试结果都是一个数,即1或2。程序每次读取一个结果后,必须确定该数是1还是2;3)使用两个计数器。一个用于计算通过考试的人数,另一个用于计算没有通过的人数;4)程序处理完所有结果后,必须判断是否有70%以上的人员通过了认证考试。应用实例问题分析第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法分析认证考试的结果并决定培训费是否提高应用实例问题的顶层表示第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法初始化变量;输入500个考试结果,统计通过和未通过的人数;打印统计结果,并决定培训费是否提高。应用实例第一次求精结果第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法“初始化变量”将变量passes初始化为0将变量failures初始化为0将变量counter初始化为1应用实例第二次求精的结果第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法“输入500个考试结果,统计通过和未通过的人数”While人员计数器counter小于等于500输入下一个考试结果至变量resultIf此结果是通过变量passes加1Else变量failures加1人员计数器counter加1应用实例第二次求精的结果第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法“打印统计结果,并决定培训费是否提高”打印通过认证的人数打印未通过认证的人数IF变量passes的值除500大于等于0.7打印“提高培训费”应用实例第二次求精的结果第1章大型程序的开发方法软件工程开发方法的介绍:结构化程序设计方法应用实例求精结果源程序第1章大型程序的开发方法软件工程开发方法的介绍三种描述设计的图形工具:层次图——用来描述软件层次结构程序流程图——是历史最悠久、使用最广泛的描述软件设计的方法盒图——是一种很好的支持结构化程序设计思想的图形工具第1章大型程序的开发方法软件工程开发方法的介绍:描述设计的图形工具应用实例正文加工系统的层次图第1章大型程序的开发方法软件工程开发方法的介绍:描述设计的图形工具应用实例程序流程图相应的盒图第1章大型程序的开发方法软件工程开发方法的介绍编码时注意的问题:全局变量——应该“有限制地使用全局变量”。使用全局变量过多,会降低程序的清晰性;降低函数的通用性;滥用全局变量会造成程序的混乱函数——“工欲善其事,必先利其器”。我们在编写大型程序时,要善于利用已有的函数,以减少重复编写程序段的工作量第1章大型程序的开发方法软件工程开发方法的介绍编码时注意的问题:风格——全局变量使用具有说明性的名字inttotalMine;inttable[ROW][COL];局部变量用短名字inti;…for(i=0;i10;i++)…第1章大型程序的开发方法软件工程开发方法的介绍命名规则命名规则当推Microsoft公司的匈牙利法该命名规则的主要思想是在变量和函数名中加入前缀以增进人们对程序的理解变量名=属性+类型+对象描述匈牙利法最大的缺点是烦琐第1章大型程序的开发方法软件工程开发方法的介绍规则1.标识符应当直观且可以拼读,可望文知意,不必进行解码。2.标识符的长度应当符合min-length&&max-information原则3.命名规则/风格尽量保持一致4.避免仅靠大小写区分的相似的标识符5.避免标识符完全相同的局部变量和全局变量第1章大型程序的开发方法软件工程开发方法的介绍命名规则6.避免标识符完全相同的局部变量和全局变量floatvalue;floatoldValue;floatnewValue;7.全局函数的名字应当使用动词或者动词+名词(动宾词组)intDrawTable()第1章大型程序的开发方法软件工程开发方法的介绍命名规则8.用正确的反义词组命名具有互斥意义的变量或相反动作的函数intminValue;intmaxValue;intSetValue(…);intGetValue(…);第1章大型程序的开发方法软件工程开发方法的介绍命名规则9.宏定义/常量全大写#defineCOL16intMAX_TABLE12第1章大型程序的开发方法软件工程开发方法的介绍命名规则10.静态变量加前缀s_全局变量加前缀g_第1章大型程序的开发方法软件工程开发方法的介绍编码时注意的问题:表达式的自然形式、分解复杂的表达式、当心具有副作用的运算符——神秘的数最好要命名,利用语言去计算对象的大小——除了定义符号常量外,最好避免使用宏——注释时要注意不要大谈明显的东西,要给函数和全局数据加注释第1章大型程序的开发方法软件工程开发方法的介绍编码时注意的问题:表达式的自然形式、分解复杂的表达式*xp+=(x=(2*k(n-m)?c[k+1]:d[k--]));x=2*kn-m?c[k++]:d[k--];*xp+=x;第1章大型程序的开发方法软件工程开发方法的介绍编码时注意的问题:当心具有副作用的运算符A[i++]=5;#defineisupper(c)(c=‘Z’&&c=‘A’)while(isupper(getch())…第1章大型程序的开发方法软件工程开发方法的介绍测试和调试方法:测试是在认为程序能工作的情况下,为发现其问题而进行的一整套确定的系统化的实验——白盒测试相当于把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理方法。它根据程序内部的逻辑来设计测试用例,检查程序中的逻辑路径是否都按预定的要求正确地工作。常用的技术包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖等。第1章大型程序的开发方法软件工程开发方法的介绍测试和调试方法:测试是在认为程序能工作的情况下,为发现其问题而进行的一整套确定的系统化的实验——黑盒测试相当于把程序看成一个黑盒子,不考虑内部结构和处理过程。它根据规定的功能来设计测试用例,检查程序的功能是否符合要求。常用的技术包括等价类划分和边界值分析等。第1章大型程序的开发方法软件工程开发方法的介绍测试和调试方法:调试(即排错)是在已知程序有问题时要做的事情——寻找熟悉的模式——检查最近的改动——不要两次犯同样的错误——现在排除,而不是以后——把你的代码解释给别人——分而治之,搜索局部化第1章大型程序的开发方法主要内容软件工程开发方法的介绍“扫雷”案例的讲解第1章大型程序的开发方法“扫雷”案例:选题实现一个具有Windows系统扫雷游戏主要功能的扫雷程序。Windows扫雷游戏(a)开局(b)胜利(c)失败第1章大型程序的开发方法“扫雷”案例:分析Windows扫雷游戏的游戏规则:在“游戏”菜单上,单击“开局”,出现的游戏界面中包括地雷计数器窗口、计时器窗口和雷区。开局后,单击雷区中的任何一个方块,便启动计时器。每标记一个地雷,地雷计数器减1;用鼠标左键单击某个方块,可挖开它。若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记,这局游戏失败;如果方块上出现数字,它代表在它周围的八个方块中共有多少颗地雷;用鼠标右键单击某个方块,则标记此块下埋着地雷(实际上可能是误标),显示为。每标记一个地雷,地雷计数器减1;用鼠标右键击打某个方块两次,则在某块上面标一个问号(?),意味着没有把握判定它是否有雷。标记为?的块可在恰当的时候再击打鼠标右键两次或单击左键,将其标记为地雷或挖开;如果某个数字方块周围的地雷全都标记完,可以同时单击鼠标左右键,将其剩下的方块挖开。如果挨着这个方块的地雷没有全部标记完,则未挖开的方块将闪烁。第1章大型程序的开发方法“扫雷”案例:分析主要功能:规则1)隐含初始化新游戏的开局功能;规则2)隐含的挖雷功能;规则3)对应的标记地雷功能;规则4)对应的标记疑问功能;规则5)的自动挖开功能。操作手段:鼠标第1章大型程序的开发方法“扫雷”案例:设计开局扫雷程序系统输入挖雷标记雷题标记疑问自动挖开输出扫雷系统的顶层层次图第1章大型程序的开发方法“扫雷”案例:设计自顶向下逐步求精:继续分析已有功能,精化出所有子功能,确定模块间接口;描述精化后每个模块的处理过程;确定主要的数据及其数据结构;确定输入输出数据的内外部形式;界面的设计第1章大型程序的开发方法“扫雷”案例:设计——界面第1章大型程序的开发方法“扫雷”案例:设计——操作方式采用键盘:上,下,左,右键用来移动光标的位置;回车或者空格键用来挖开光标当前指向的一个方块;F,f标记当前光标指向的方块有地雷;Q,q在光标指向方块打一个问号,表示可能有地雷;A,a自动挖开光标周围的方块;ESC退出游戏第1章大型程序的开发方法“扫雷”案例:设计——主要数据雷区界面数据#defineROW16/*表示整个雷区的行数*/#defineCOL16/*表示整个雷区的列数*/#defineSTARTX50/*表示雷区在屏幕上的起始x坐标*/#defineSTARTY50/*表示雷区在屏幕上的起始y坐标*/#defineSIZEX20/*表示一个方块的长度*/#defineSIZEY20/*表示一个方块的宽度*/第1章大型程序的开发方法“扫雷”案例:设计——主要数据雷区内部数据inttotalMine;/*整个雷区所含的地雷总数*/inttable[ROW][COL];/*数组table的每个元素值记录了雷区对应方块是否有雷:1有雷,0无雷*/intnum[ROW][COL];/*数组num的每个元素值记录了雷区对应方块周围有多少个地雷*/intflag[ROW][COL];/*数组flag的每个元素值记录了雷区对应方块当前的状态*/第1章大型程序的开发方法“扫雷”案例:设计——主要数据方块(i,j)的状态取值#defineUNFLAG0/*表示该方块还没有被打开或者标记*/#defineFLAGED1/*标记该方块有地雷*/#defineQUESTION20/*表示该方块可能有地雷*/#defineEXPLOD30/*踩到地雷爆炸了*/#defineOPEN40/*一个没有地雷的方块被打开*/第1章大型程序的开发方法“扫雷”案例:设计——主要数据光标当前位置数据intpi,pj;/*记录光标的当前位置,初始时光标在(0,0)*/intdi[8]={-1,-1,0,1,1,1,0,-1};intdj[8]={0