建筑师设计大楼时,要采用前人的智慧,程序员设计程序时也要采用前人的智慧。我们的领域 比建筑领域要年轻,我们的集体智慧也比较少。前面曾介绍过,结构化编程产生的程序比非结构化编程的程序更容易理解,因此更容易测试、调试与修改,并在数学意义上更加正确。
为了简单起见,我们只用单人/单出控制结构,每个结构只是在程序中一个接一个地放置,称为控制结构堆栈形式。形成结构化程序的规则还允许嵌套控制结构。
形成结构化程序的规则
控制结构只有一个入口和一个出口。顺序连接控制结构以形成简单的结构化程序,一个控制结构的出口连接下一个控制结构的人口,即控制
1)从”最简单的流程图”开始(如图2.34所示)。
2)任何矩形框(操作)可以换成两个顺序矩形框(操作)。
3)任何矩形框(操作)可以换成任何控制结构(顺序、if/else、switch、while、do/while或for)。
4)可按任何顺序多次重复规则2和规则3。注意规则2产生控制结构堆栈,因此称为堆栈规则(stacking rule)。
规则3称为嵌套规则(nesting rule)。对最简单的流程图重复采用规则3即可得到包含整齐嵌套控制结构的流程图。首先将最简单的流程图中的矩形框换成双项选择结构(if/else)。然后再对双项选择结构中的两个矩形框采用规则3,将每个矩形框变成一个双项选择结构。每个双项选择结构周围的虚线框表示最初的简单流程图中被替换的矩形框。
规则4产生更大、更复杂且层次更多的嵌套结构。从而设置各种可能的结构化程序。结构化方法的妙处在于我们只用两种简单方法组合七种简单的单入单出块。
结构化编程提倡简单性。Bohm和Jacopini已经证明,只需要三种控制形式:
●顺序(sequence)
●选择(selection)
●重复(repetmon)
顺序结构很简单,选择可以用三种方法实现:
●if结构(单项选择)
●if/else结构(双项选择)
●switch结构(多项选择)
事实上很容易证明简单的if结构即可提供任何形式的选择,任何能用if/else结构和switch结构完成的工作,也可以组合简单if结构来实现(但程序可能不够流畅)。
重复可以用三种方法实现:
●while结构
●do/while结构
●for结构
很容易证明简单的while结构即可提供任何形式的重复,任何能用do/while和for结构完成的工作,也可以组合简单while结构来实现(但程序可能不够流畅)。
根据以上结果,C++程序中所需的任何控制形式均可以用下列形式表示:
●顺序
●if结构(选择)
●while结构(重复)
这些控制结构只要用两种方式组合,即嵌套和堆栈。事实上,结构化编程提倡简单性。
本章介绍了如何将包含操作和判断的控制结构组合成程序。第3章将介绍另一个程序结构单元——函数(function),我们将介绍如何用函数组成更大的程序(函数也是由控制结构组成的)以及函数如何提高软件复用性。第6章将介绍C++的另一个程序结构单元——类(class),从类生成对象,并进行面向对象编程。下面通过用面向对象设计攻克的难题来继续介绍对象。
本节和“有关对象的思考”的下几节将介绍建立电梯模拟程序时的有趣问题和实际遇到的挑战。
第1章到第5章要完成面向对象设计(OOD)的各个步骤。从第6章开始,我们要用C++面向对象编程(OOP)技术实现电梯模拟程序。目前这些应用比较复杂,但不必在意,这章只考虑这个问题的一小部分。
公司要建立一幢两层的办公大楼并装上“最新”的电梯。公司要求开发一个面向对象的软件模拟程序,模拟电梯的操作,确定这个电梯能否满足需要。
这个电梯只限乘载一人,为了省电,只在需要时才使用,电梯每天在一楼关门等待。
模拟程序包括一个时钟,每天从时间。开始,每秒滴答一次。模拟程序的调度器组件随机设置每一层第一个人到来的时间(第3章将介绍如何随机调度)。当时钟的时间等于第一个人到来的时间时,模拟程序对指定层生成一个新到的人并将人放在这一层。然后这个人按下该层的按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯时所在的那层相同。
如果第1个人到达第1层,则他可以在按下按钮和等待电梯开门之后立即进入电梯。如果第1个人在第2层,则电梯要升到第2层去接这个人。电梯从1层移到另一层需要5秒钟。
电梯到达一层时.打开该层的电梯门上面的灯,并在电梯内发出钟声。该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客(如果有人要乘电梯到该层)走出电梯.另一乘客(如果该层有人等待)进入电梯并按下目的地楼层的按钮,电梯门关上。如果电梯要开始移动,则要确定移动的方向(对只有两层的电梯,判断很简单)并移到下一层。为了简单起见,假设电梯到达一层时发生所有事件,而且直到电梯门关上所花的时间为0。电梯总是知道在哪层和要到哪层。
任伺时间每层最多只能有一个人等待,如果新到的人(不在电梯中的人)要到达一层时该层已被占用,则一秒后才能安排新的到达者。假设每隔5到20秒人们随机到达每层,第3章将介绍如何用随机数产生器模拟到达每层的概率。我们的目标是实现一个能够工作的软件模拟程序,并根据这些要求运行。该程序应模拟几分钟的电梯操作,确定电梯能否满足这座办公大楼的交通需求。
在这些电梯实验室任务中,要进行面向对象设计的各个步骤。第一步要确定问题中的对象,最终要正式描述这些对象并在C++中实现。在这个电梯实验室任务中应该:
1,确定这个电梯模拟问题中的对象。这个问题指定了许多对象模拟电梯以及与各个人、楼层、按钮等等之间的交互。找到问题中的名词(noun),这些名词通常就是实现电梯模拟问题中的对象。
2.对每个找到的对象,用一段话描述关于该对象的所有事实。
1. 这是个很好的小组练习,最好几个人一起讨论,小组成员之间可以互相提示,检讨和完善各人的设计和实现方法。
2.小组应与班级中的其他小组一起竞赛,开发出最佳设计和实现方法。
3.下一章介绍如何实现随机性,介绍随机数产生器。随机数产生器可以帮助读者模拟扔钱币和投骰子等,还可以模拟随机到达的乘电梯者。
4.我们做出了许多简化的假设,读者可以提供其他细节。
5.由于现实世界是面向对象的,因此完全可以在正式学习面向对象之前考虑这个项目。
6.不要怕设计不完美。系统设计不是完善和完整的过程,因此只要尽力而为即可。
1.如何确定电梯能否处理所需的交通量
2.为什么实现三层(或更高)的楼层时更加复杂
又稍后会介绍.建立一个电梯对象之后很容易建立更多的电梯对象。如果有多个电梯,每个电梯在每一层载客和下客时,都会遇到什么问题,
4.为了简单起见,我们指定电梯和每层的容量为一个乘客。如果增加这个容量,会遇到什么问题
●根据所要执行的操作和顺序解决问题的过程称为算法。
●指定计算机程序拽行语句的顺序称为程序控制。
●伪代码是人为的非正式语言,帮助程序员开发算法。
●声明是种信息,告诉编译器变量名和属性,指示编译器在内存中为这个变量保留内存空间。
●选择结构用于在多十操作之间进行选择。
●if选择结构在条件为true时执行一个操作,在条件为false时跳过这个操作。
●if/else选择结构在条件为true或false时各执行一个操作。
●要在if选择结构体中包括多条语句,就要把这些语句放在花括号中。复合语句可以放在程序中出现单个语句的任何地方。
●空语句就是在正常语句出现的地方放一个分号(;),表示不采取任何操作。
●重复结构(repetition structure)使程序员可以指定一定条件下可以重复的操作。
●while重复结构的形式为;
while(conditon)statement
●包含小数的值称为浮点数,用数据类型float表示。
●C++包括一元强制类型转换运算符static_cast <float>(),生成用于计算的临时浮点数值。
●C++提供算术赋值运算符+=、-=、*=、/=和%=,能够缩写某些常用类型的表达式。
●C++提供自增(++)和自减(--)运算符,可以将变量加1或减1。如果运算符放在变量前面,则变量先加1(减1),然后在表达式中使用。如果运算符放在变量后面.则变量先在表达式中使用.然后加1(减1)。
●循环是一组计算机指令重复执行,直到符合某个终止条件。其中有两种重复是计数器控制重复和标记控制重复。
●循环计数器计算一组指令的重复次数。每次执行这组指令时,其通常加1或减l。
●标记值通常用于控制事先不知道重复次数的循环,循环中包括每次执行循环时读取数据的语句。标记值在所有有效数据之后输人,应不同于有效数据项目。
●for重复结构处理计数器控制循环的所有细节。for结构的一般格式如下:
for(expression1;expression2;expression3)
statement
其中expression1初始化循环控制变量,expression2是循环条件,expression3递增控制变量。
●do/while重复结构执行循环体之后再测试循环条件,因此,do/while结构至少执行循环体一
次。do/while结构的形式如下:
dO
statement
while(cendition);
●break语句在while、for和do/while结构中执行时,将使程序立即退出这些结构。
●continue语句在while、for或do/while结构中执行时跳过该结构体的其余语句,进入下一轮循环。
●swish语句处理一系列判断,测试特定变量或表达式的值并相应地采取不同操作。大多数程
序中,每个case面的语句之后要包括一个break语句。几个case可以执行相同语句,只要
在语句前面列出这些case标号。switch结构只能测试常量整型表达式。多个case语句不必放
在花括号中。
●在UNIX系统和其他许多系统中,表示文件结束符的输入如下:
<ctrl—d>
而在VMS和DOS系统中,表示文件结束符的输入如下:
<ctrl—z>
●逻辑运算符可以用简单条件组合成复杂条件。逻辑运算符有逻辑与( &&)、逻辑或(||)和
逻辑非(!)。
●true值可以表示任何非0值,false值也可以表示0值。
术语
&& operator &&运算符 char || operator ||运算符 cin.get()function cin.get()函数 ! operator !运算符 compoundstatement 复合语句 -- operalor --运算符 condifional operator(?:) 条件运算符 ++ operator ++运算符 continue ?:operator ?:运算符 control strueture 控制结构 action/decision model 操作/判断模型 counter-controlled repefition 计数器控制重复 algorithm 算法 decrement operator(--) 自减运算符 arithmetic assignment operatom:+=、-=、 defauhcueinswitch switch中的默认case *=、/=和%= 算术赋值运算符 definiterepetition 确定重复 ASCII characterset ASCII字符集 definition 定义 block 块(程序块) delay loop 延迟循环 body of a loop 循环体 do/while repetition structure do/while重复结构 bool double break double-selection structure 双项选择结构 case label case标号 empty statement(;) 空语句 cast operator 强制类型转换运算符 EOF false postincrement operator 后置自增运算符 fatal error 致命错误 pow function pow函数 filed width 域宽 predecmment operator 前置自减运算符 fixed-point format 定点格式 pmmcrement operator 前置自增运算符 float pseudocode 伪代码 for repetition structure for重复结构 repetition 重复 garbage value 垃圾值 repetition structures 重复结构 if selection structure if选择结构 rvalne("right value") 右值 if/else selection structure if/else选择结构 selection 选择 increment operator(++) 自增运算符 sentinel value 标记值 indefinite repetition 不确定重复 sequential execution 顺序执行 infinite loop 无限循环 setiosflags stream manipulator setiosflags流操纵 initialization 初始化 算子 integer division 整除 setprecision stream manipulator setpmcision流操纵 iOs::nxed 算子 iOs::left setw stream manipulator setw流操纵算子 ios::showpoint short keywold 关键字 single-entry/single-exit control structures 单入/ logic error 逻辑错误 单出控制结构 logical AND(&&) 逻辑与 single-selection structue 单项选择结构 logical negation(!) 逻辑非 stacked control structures 堆栈控制结构 logical operators 逻辑运算符 static_cast() logical OR(||) 逻辑或 structured programming 结构化编程 long switch selection strueture switch选择结构 loop counter 循环计数器 syntax error 语法错误 looping 循环 ternary operator 三元运算符 loop—continuation condition 循环条件 top-down,stepwise refinement 自上而下逐步 lvalue("left value") 左值 完善 multiple-selection structure 多项选择结构 transfer of control 控制转移 nested control structures 嵌套控制结构 title nonfatal error 非致命错误 unary operator 一元运算符 off-by—one error 差1错误 undefined value 未定义数值 parameterized stream manipulator参数化流操纵while repetition structure while重复结构 算子 whitespace characters 空白字符 post decrement operator 后置自减运算符