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