为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

15 计算机程序设计

2013-01-10 30页 pdf 1MB 59阅读

用户头像

is_310146

暂无简介

举报
15 计算机程序设计 下载 第15章 计算机程序设计 星期二晚上,你和一群朋友学习到很晚,饥肠辘辘,大家商议去吃比萨饼。但你们掏出所 有的钱也只有2 4 . 6 3美元,根本不够八个人填饱肚子。看来还是多转几家饼店,比较一下价格, “少花钱,多办事”。 你们先到了Va n G o饼店,发现8 . 9 9美元可以买一块直径为8英寸且带双层奶油的圆饼。接着 在Ve n i c e店发现11 . 9 9美元可以买一块边长为1 0英寸的方形比萨饼。哪个价格更好呢?你想找个 计算器但找不到,一个朋友带了一台笔记本电脑,所以你可以编段程序来比较一下比萨...
15 计算机程序设计
下载 第15章 计算机程序设计 星期二晚上,你和一群朋友学习到很晚,饥肠辘辘,大家商议去吃比萨饼。但你们掏出所 有的钱也只有2 4 . 6 3美元,根本不够八个人填饱肚子。看来还是多转几家饼店,比较一下价格, “少花钱,多办事”。 你们先到了Va n G o饼店,发现8 . 9 9美元可以买一块直径为8英寸且带双层奶油的圆饼。接着 在Ve n i c e店发现11 . 9 9美元可以买一块边长为1 0英寸的方形比萨饼。哪个价格更好呢?你想找个 计算器但找不到,一个朋友带了一台笔记本电脑,所以你可以编段程序来比较一下比萨饼的价 格。那么,接下来该怎么做呢? 计算机程序设计就是编写一些指令驱动计算机完成特定的工作。这一章将对此做一介绍。 计算机编程的基本概念包括:问题描述、算法、编码、控制结构、调试和建立文档。本章还包 括描述各种编程语言的特征、简介当今最流行的编程语言。本章是进行程序设计的基础。 本章概要 在本章中你将对计算机编程有初步的认识,而且将针对“比萨饼问题”编 写一个小程序。你可以用在这里学到的知识与技巧去解决很多可用计算机解决 的问题。同时你将学到一些程序员用来描述、编写和调试程序的方法论。不管 你从事软件开发工作还是应用计算机,理解这些原则都会对你有益。读完这一 章你将能够做到: • 区别系统分析师和软件工程师。 • 列出如今流行的编程语言。 • 以国防部标准描述大型程序和小型程序的区别。 • 在问题描述中鉴别哪些是假设?哪些是已知条件。 • 描述算法、伪代码和程序代码之间的关系。 • 列出至少四种表达算法的方法。 • 鉴别简单的B A S I C程序中的控制结构。 • 描述程序中语法错误和逻辑错误的区别。 • 解释程序正文、注释和用户参考手册的用途。 • 简述区分各种编程语言的主要特征。 15.1 软件工程 软件工程是指软件的开发、运作、维护和最终消亡的整个系统过程。软件工程师负责信息 系统所用软件的编写工作。系统分析师和软件工程师的工作是交织在一起的,但也有所不同。 一个系统分析师要整个信息系统,包括硬件、软件、员工和数据。而软件工程师则致力于 软件设计、编程和调试这些信息系统的软件组件上。 对于一个并不打算成为程序员的人来说,学习软件开发和电脑编程又有什么意义 呢?首先,你可能在工作中会使用许多程序,你会发现一个字处理软件就包含7 5万行程 序,存在一些错误是无法避免的。同样,你会发现,一个人很难完成一个字处理软件的 可视化程序 设计 实验 信息网 软件工程 1 编写,这些最好留给专业的编程小组去做。虽然你不会去专门编写自己想用的软件,但你可能会 修改一些软件来满足你特殊的要求,这时,你对计算机编程的了解将有助于你拟订建设性的计划。 15.1.1 计算机程序 写一个程序很难吗? 和你所使用的商业软件相比,这里你所接触到的程序是微不足道的。按照国防部的标准, 少于100 000条指令称为小程序,100 000~1 000 000行的归为中等,超过1 000 000行就是大程 序了。据统计,一个程序员平均每天只能完成 2 0行指令。这并不奇怪,因为一个商用软件通常 由一个程序员小组来完成,而且要花几个月、甚至几年时间。 在第2章中我们讲过计算机就是告诉计算机如何解决问题的一系列指令的集合。但“写程 序”不同于“写信”。写信时,只要能表达你的思想,可以不管其结构和效率,写程序则不然。 人与人之间交流时,有歧义的句子有时仍能表辞达意。比如,你的朋友突然在上学路上说: 门没锁。你肯定知道他讲的是忘了锁上家门,而不是门上没有锁。但计算机却没有人那么发达 的思维,给计算机编写程序需要缜密的思考与斟酌。因此,计算机编程很强调结构性,丝毫不 能马虎。 写程序也要比写信难得多,但软件开发过程中有一些原则可以帮你理出一些头绪。计算机 程序设计首先从问题的描述开始,它是算法的基础,而算法则是程序的基础。接下来我们将对 问题描述、算法分析和程序指令进行详细的讨论。 15.1.2 问题描述 对前述比萨饼问题怎样进行好的描述呢? 提出问题才能解决问题,就像前面的例子:哪个比萨饼店更好呢?这种提法很模糊,对你 解决问题并无帮助,因为它没有告诉你哪些是已知条件。你知不知道各个饼店的价钱?饼的大 小?奶油层有多少?“哪个饼店更好?”这种提法并没有解释“好”的含义,是仅仅指饼的价 钱低,还是指同样多的钱买的饼奶油层多,还是指你们仅有的 2 4 . 6 3美元能买到的饼越大越好 呢?看一下图1 5 - 1,你能否得出关于上面问题的一种更好的问题描述呢? 图1 5 -1 买什么样的比萨饼最合算 问题描述就是要说明一些能用来解决问题的要素。一个表达清晰的问题描述应该具备以下 三个特征: • 能说明描述问题范畴的任何假设。 428 计算机文化 下载 • 罗列出已知的所有条件。 • 具体说明需要解决什么问题。 在一个问题描述中,假设就是为了方便设计而假定的认为是正确的陈述。比如,在比萨饼 问题中,你可以假设只比较两种类型的比萨饼:方的和圆的。为了简化问题,你可以假设没有 长方形的饼,这是因为你所要解决的问题只与饼的面积有关,长和宽并不重要。还可以假设所 比较的比萨饼有相同厚度的奶油层。最后还可以说明,单位面积比萨饼价格低的就是最好的。 问题描述中的已知信息 就是你要计算机帮你解决问题时提供给它的信息。对于比萨饼问 题,已知信息包括两个饼店的比萨饼价钱、形状、大小。已知信息在问题描述中经常用“已 知”来给出,例如“已知两饼店饼的价格、形状、大小 . . . . . .” 在你说明了已知条件后,你应该说明问题解决后你该如何做决定,也就是想让程序给你输 出什么信息。当然,在运行程序之前你并不知道答案,正如你不知道哪个饼店更实惠,但你可 以告诉计算机它应该输出哪个饼店更好。 假设你和朋友认为,能以最低的价钱买到最大的饼就是最实惠的饼店,即单位面积的饼的 价格最低,这样每平方英寸 5美元的饼就比7美元的饼实惠。因此,只要能算出饼的单位价格, 比较它们,然后打印信息指出哪个饼店的价格低,问题就解决了。可以这样来写问题描述:计 算机算出比萨饼每平方英寸的价钱,然后输出是第一种还是第二种单位面积价格较低。 经过对问题的深入分析,可以做一些假设。最后,比萨饼问题的描述如下: 比较两种比萨饼,它们有相同多的奶油层,一种方的,一种圆的;已知价钱、形状和大 小;计算机计算两种比萨饼每平方英寸的价钱并输出那种价格低。 上面这种描述不易理解,下面这种格式较好: 假设: 两类比萨饼,P 1、P 2 奶油层相等 一种方的,一种圆的,都不是长方形 单位面积价钱低的为最好 已知: pP1=**;pP2=** (pPi为饼的价钱) P 1 , P 2的形状 P 1 , P 2的大小(以英寸为单位) 求: 每平方英寸饼的价钱 ( p P 1 , p P 2 ) 输出: 若p P 1 < p P 2 ,打印“P 1店更实惠” 若p P 1 > p P 2 ,打印“P 2店更实惠” 若p P 1 = p P 2 ,打印“两店一样” # # 现在我们学习了如何写问题描述,然后进行编程的下一步—算法设计。 15.1.3 算法设计 如何为比萨饼问题规划一个算法? 算法就是解决问题的步骤。算法是一个抽象的思想,但它是可表达的且是可执行的。比如, 第15章 计算机程序设计 429 下载 B A S I C语言。表1 5 - 1给出了一些基于B A S I C语言的恰倒好处的算法指令。 表15-1 一个B A S I C程序算法中写法的样本 算法实现的任务 实 例 赋值 S i z e = 1 0 列出公式 S q u a r e I n c h P r i c e = P r i c e / S q u a r e I n c h e s 等待输入数据 Enter the Price of a pizza 显示计算结果 Display the SquareInchPrice 得出结论 If the pizza is square ,calculate SquareInches by multiplying the Size*Size 重复某些操作 Repeat the price calculations for as many pizzas as the user wants 设计算法,一般你会先自己解决这个问题,然后再把这些步骤记录下来,因此必须先知道 一些信息,像比萨饼的成本、大小和形状等。同样计算机也需要这些初始信息,在算法中应该 具体说明计算机如何取得它。程序运行时,提示用户输入这些信息。算法可以这样写: Ask the user for the shape of the first pizza and hold it in RAM as Shape1. Ask the user for the price of the first pizza and hold it in RAM as Price1. Ask the user for the size of the first pizza and hold it in RAM as Size1. 接着你的算法应该详细说明如何操作这些信息。你想计算比萨饼每平方英寸的价钱,但像 “Calculate the price per square inch”这样的指令既没有说明如何计算,也没有说明对方饼和圆 饼两种不同情况的处理方法。一种更为恰当的写法如图 1 5 - 2所示。 图15-2 计算每平方英寸比萨饼的算法 430 计算机文化 下载 信息网 算法 2 1. 计算正方形比萨饼的 面积,用一条边长乘以另 一条边长。由于正方形边 长 相 等 , 可 以 用 公 式 Size1* Size1计算 3. 求出比萨饼的面积后,再 乘以每平方英寸的价可即可 2. 计算圆形比萨饼的面积, 使用计算圆形面积的公式pr2, p 约等于3 . 1 4 2,r2 是圆半径的平 方。比萨饼的大小是用直径来 表示的,所以需要将直径除以 2得到半径。使用 S i z e 1 / 2。然 后,求半径的平方。 ^ 2表示计 算机中的二次平方 上面的算法可以算出一块比萨饼的单价,对第二块还要写出同样的算法: Ask the user for the shape of the second pizza and hold it in RAM as Shape2 Ask the user for the price of the second pizza and hold it in RAM as Price2 Ask the user for the size of the second pizza and hold it in RAM as Size2 If Shape2 is square then calculate the square inches using the formula: S q u a r e i n c h e s 2 = S i z e 2 * S i z e 2 If Shape2 is round then calculate the square inches using the formula: S q u a r e i n c h e s 2 = 3 . 1 4 2 * ( S i z e 2 / 2 ) ^ 2 S q u a r e i n c h P r i c e 2 = P r i c e 2 / S q u a r e i n c h e s 2 最后算法还要指出计算机如何输出信息。你想让它告诉你哪种比萨饼单价低,算法可以这 样写: if SquareinchPrice1SquareInchPrice1 then display the message“Pizza 2is the best deal.” 不要忘记若两种单价相等程序该输出什么: if SquareinchPrice1=SquareinchPrice2 then display the message“Both pizzas are the same deal.” 比萨饼问题的整个算法如图1 5 - 3所示。 图15-3 (比萨饼的算法) 第15章 计算机程序设计 431 下载 输入P i z z a 1的形状赋值给S h a p e 1 输入P i z z a 1的价钱赋值给P r i c e 1 输入P i z z a 1的大小赋值给S i z e 1 if Shape1 is square then calculate the square inches using the formula: Squareinches1=size1 * size1 If Shape1 is round then Calculate the square inches using the formula: Squareinches1= 3.142*(size1/2)^2 S q u a r e I n c h e s P r i c e 1 = P r i c e 1 / S q u a r e I n c h s 1 输入P i z z a 2的形状赋值给S h a p e 2 输入P i z z a 2的价钱赋值给P r i c e 2 输入P i z z a 2的大小赋值给S i z e 2 if Shape2 is square then calculate the square inches using the formula: Squareinches2=size2 * size2 if Shape2 is round then calculate the square inches using the formula: Squareinches2= 3.142*(size2/2)^2 S q u a r e I n c h e s P r i c e 2 = P r i c e 2 / S q u a r e I n c h s 2 If SquareinchesPrice1SquareinchPrice2 then Display the message“Pizza2 is the best deal” If SquareinchesPrice1=SquareinchPrice2 then Display the message“both Pizza are the same deal” 取第一张比萨饼的信息 计算第一张比萨饼每 平方英寸的价格 取第二张比萨饼的信息 输出结果 计算第二张比萨饼每 平方英寸的价格 15.1.4 算法表达 表达一个算法的最好方法是什么? 有几种方法表达一个算法:结构化英语、伪代码、图和对象定义。这些工具 不是程序设计语言,它们不能直接被计算机执行。使用它们的目的就是把你的思想用 文字表述出来。 结构化英语是英语的一个子集,用简短的句型反映过程的进行。如图 15-4 表示 如何用结构化英语来表达比萨饼问题的算法。 另一个表达算法的方法是伪代码。伪代码好比是算法的注释系统,由英语和你熟悉的编程 语言混合而成。伪代码没有结构化英语规整,你可以随心所欲地去写。而且可以融入编程语言 的一些函数和语法。比较图1 5 - 4和图1 5 - 3,可以发现结构化英语和伪代码的区别。 图15-4 比萨饼程序的伪代码 第三种方法是。流程图是描述计算机一步一步完成任务的图表。图 1 5 - 5为比萨饼问 题的流程图。 另一种表达算法的方法是定义计算机要执行的对象,并定义操纵每个对象的方法。这种方 法对面向对象的程序设计很有价值,后面还将讨论。图1 5 - 6定义了一个关于比萨饼问题的对象。 习题A 1. 如果你是一个_ _ _ _ _ _ _,你会致力于信息系统中软件组件的开发。 2. 按美国国防部的标准,约100 000行代码的程序称为大程序。是对还是错?___ 3. 写一个计算机程序之前,必须写___来定义一些运行中要用到的元素。 4. _ _ _ _ _ _ _ _是完成任务或解决问题的步骤的有机集合。 5. 英语和程序设计语言混合使用称之为_ _ _ _ _ _ _ _。 6. _ _ _ _ _ _ _ _是描述计算机一步一步解决问题的图形表示方法。 432 计算机文化 下载 信息网 伪代码和 流表 3 图15-5 比萨饼程序流程图 第15章 计算机程序设计 433 下载 开始或结束 流程图符号意义 输入或输出 判断 计算 连接点 流程线 开始 输入 输入 输出输出 输出 结束 是 是 是 是 否 否 否 否 Shapel 是正方 形吗? Shape2 是正方 形吗? 图15-6 比萨饼程序的对象描述 15.2 编写计算机程序 问题描述和算法通常写入程序说明书,它们是程序设计必不可少的蓝图。写完了 程序说明书后,就可以编写程序了。程序的编写就是用程序设计语言把算法程序化。 编写程序的人称为程序员。对于大部分程序设计语言来说,编程就是输入命令;还有 一部分语言只需你选择对象和属性或编写对象的脚本即可。 用B A S I C编写比萨饼问题的程序,你只需输入一连串的命令。图 1 5 - 7给出了它的 完整的程序。仔细阅读,就能对程序的基本架构有一个大致的了解。 图15-7 比萨饼问题的B A S I C程序 434 计算机文化 下载 命令字用黑体表示 程序写成一个步骤表计算机从表中的顶部开始执行 用R E M开头表示注 释来解释一段程序 数据存储在变量或存储 地址中。变量 Shapel $ 存储文本,如“ r o u n d” $表示文本变量。其他 变量,如 F r i c e l存储数 据值,该变量名不合$ 信息网 程序设计 工作 4 15.2.1 程序顺序 我该如何告诉计算机程序执行的顺序? 所谓顺序执行,就是计算机按照程序员指定的顺序执行每一条指令。第一条语句 先执行,接下来是第二条, . . . . . .,一直到程序末尾。下面是一段用 Q B A S I C编写的程 序,用以输出“This is the first line.”和“This is the second line.” PRINT “This is the first line.” PRINT “This is the second line.” 虽然大部分现在的编程语言不需要写行号,但有些旧的编程语言则要标注行号,例如下面 这段用B A S I C最初版本写的程序: 100 PRINT “This is the first line.” 200 PRINT “This is the second line.” 如果程序中标了行号,计算机就会从行号最小的语句开始执行,接着是次小的。图 1 5 - 8中 的流程图表述了一段小的顺序指令。 图15-8 顺序执行 一些算法给出的执行顺序和程序中写的不同,在某些情况下跳过一些指令或重复执行某些 指令。控制结构用于控制程序执行的顺序。一般有三种控制结构:顺序控制、选择控制和循环 控制。 15.2.2 顺序控制 有没有方法改变程序执行的顺序? 顺序控制结构能改变计算机执行的顺序,执行一条指令转而执行其他的指令。下 面这段Q B A S I C程序使用G O TO语句告诉计算机直接跳往标号为“ Wi d g e t”的语句执 行。语句“PRINT ‘This is the second line.’”永远不会执行。 PRINT “This is the first line.” G O TO Wi d g e t PRINT “This is the second line.” Widget: PRINT “All Done!” E N D 第15章 计算机程序设计 435 下载 实验 可视化程序 设计 信息网 GOTO 5 1. 开始 结束 打印 打印2. 3. 4. 图1 5 - 9的流程图说明了计算机先 按标号顺序执行,然后在 G O TO语句 的作用下跳往其他语句。 虽然G O TO这种结构很简单,但 过多的使用会使程序的可读性和可维 护性很差,所以熟练的程序员忌讳使 用它。1 9 6 8年,《A C M通讯》杂志发 表了 D i j k s t r a的一封著名的信— “Go To语句的害处”。他在信中称, 滥用G O TO语句将使别人很难读懂你 的算法,这也就意味着这种程序不易 更正、改善和修订。 有经验的程序员喜欢用除 G O TO 语句以外的顺序控制结构把程序改写 成一个个的子程序、过程、模块或函 数。子程序、过程、模块和函数都是 程序的一段代码,但不包含在主程序 的顺序路径内。图 1 5 - 1 0说明了用 G O S U B语句把执行路径转移到子程序内。 图15-10 执行G O S U B命令 15.2.3 选择结构 计算机执行程序是能否选择路径? 选择控制结构也称为决定结构或分支,告诉计算机根据所列条件的正确与否选择执行路径。 436 计算机文化 下载 图15-9 GOTO的执行 1. 这是一个主程序。计算机开始执 行主程序指令直到遇到G O S U B命令 2. GOSUB命令指示计算机转到 称为“c h e c k i n p u t”的子程序执行 3. 这是一个“ c h e c k i n p u t” 子程序,计算机开始执行子程 序指令直到遇到R E T U R N命令 5. 当计算机返回到主 程 序 后 , 继 续 执 行 G O S U B命令之后的指令 4. RETURN命令指示 计算机返回到主程序 开始 跳到Widget 打印 打印 打印 结束 比较简单的选择结构是I F...THEN...ELSE 语句。下面这段程序使用 I F... THEN... ELSE 结构判断 输入的数字是否大于1 0。若大于1 0,打印“That number is greater than 10.”否则,不打印这条 信息。 INPUT “Enter a number from 1 to 10:”, N u m b e r IF Number >10 THEN PRINT “That number is greater than 10!” ELSE PRINT “That number is 10 or less.” E N D 图1 5 - 11用流程图描述了计算机如何执行这种结构。 图1 5 - 11 计算机执行选择 15.2.4 重复控制 计算机能不止一次的执行一段程序吗? 重复控制结构又称为循环结构或迭代结构,可以重复执行一条或多条指令直到满足退出条 件。在Q B A S I C中,最常用的循环结构是 W H I L E . . . W E N D 结构。下面的例子用F O R . . . N E X T结构打印一条信息三次。 FOR N=1 TO 3 PRINT “T h e r e ’s no place like home.” NEXT N E N D 图1 5 - 1 2的流程图描述了计算机如何执行循环结构。 为了对F O R . . . N E X T这种结构有一个更深刻的了解, 现在假设你就是计算机,执行下面这段程序。你可以用标 有N的框来代表内存地址。作为计算机,还要有一个显示 屏幕,用“显示”框表示。下面让我们一步步的执行这个 循环。 第15章 计算机程序设计 437 下载 图15-12 计算机执行循环N 屏幕输出 1. 2. 3. 否 是 4. 5. 打印 输入1到10之间的数 打印 开始 开始 开始循环 否 循环吗? 打印 是 结束 结束 FOR N=1 TO 3 PRINT “T h e r e ’s no place like home.” NEXT N E N D 1) 首先你看到语句FOR N=1 TO 3,把N赋值为1。在框N中写上1。 2) 接下来执行下一条语句 PRINT “T h e r e ’s no place like home.” 在“显示”框中写入 “T h e r e ’s no place like home .” 3) 语句NEXT 使你回到语句FOR N=1 TO 3。因为这是第二次执行这条语句,所以在N框子 中写上2(把1擦掉)。 4) 你应该测试一下N的值是否大于3。为什么?因为语句FOR N=1 TO 3 表示只有当N的值 不大于3时,你才能继续循环下去。现在N = 2,继续执行。 5) 执行下一条语句,把“T h e r e ’s no place like home .”写入“显示”框。 6) 继续,遇到NEXT 语句,回到F O R语句。 7) 把N框中的值改为3,确信框中没有大于3的数,进入循环。 8) 在显示框中再写上“T h e r e ’s no place like home.” N E X T语句使你回到F O R语句,N框中 的值增为4。这次检查时发现N的值大于3,这意味着循环结束,应该跳出。 9) 下面的语句是E N D,程序结束。 习题B 1. ________是用计算机语言描述一个算法的过程。 2. ________控制能把执行顺序从这条语句转到另一条语句。 3. ________结构使计算机按照所给条件的正确与否选择执行路径。 4. ________结构能重复执行一段程序直到某一条件为真。 15.3 调试和文档 编制程序时,你必须对其进行测试代码的每一段来确定其可以正确地工作。这一过程称为 调试( d e b u g g i n g ),因为这一过程就是查错,以避免程序运行时出错。编码时,你应当编制文档, 以作为永久性的记录来解释程序的工作过程。 15.3.1 测试程序 如何了解程序运行正确? 一个计算机程序必须对其进行测试来 保证程序工作正确。测试经常包括输入测 试数据来看看程序是否能够产生正确结 果。如果程序没有产生正确结果,程序员 必须查找程序中的错误、修改错误、再测 试程序。这个过程可能需要相当长的时间, 如图1 5 - 1 3。但是,测试却是程序设计中的 关键一步。 例如,要测试 P i z z a程序,你应当运 行程序并输入数据并计算好结果,假设你 438 计算机文化 下载 图15-13 斯坦福大学学生于1 9 6 7年制作的 视频,描述了一个程序员对于编程、 测试和调试过程中的沮丧状 使用计算器来计算每平方平方英寸的价格,价格为 1 8 . 5 0美元,大小1 5英寸的比萨饼的每平方 英寸的价格为0 . 0 8美元。一种测试程序的方法是运行程序,并输入价格 1 8 . 5 0美元、大小1 5英寸 和形状。程序应当产生结果0 . 0 8美元。如果不是,你就知道写程序时出错了,需要修改错误。 但是,测试一组值还不够。你每次最少应当测试一个状态,并且应当测试每条分支。 P i z z a程序有两个可能的分支来计算每平方英寸价格。一个分支是针对方形饼,一种是针对圆 形饼。即使你输入了一组测试方形饼的数据,程序能提供正确结果,但在你测试了圆形饼数据 之前,不能认为程序是正确的。 当你在程序中发现了一个错误时,可能是语法错,也可能是运行时错误。语法错误是由于 指令没有按照程序设计语言的语法规则编写所致。例如,当你要打印一个消息时,你需要使用 P R I N T命令。命令 IF AGE = 16 THEN “You can drive.”将产生语法错误,因为少了命令字 P R I N T。正确的写法是 IF AGE = 16 THEN PRINT “You can drive.” 另一种类型的程序错误是运行时错误。运行时错误是当你运行程序时出的错。这类错误可 以是由类型错误造成,语法正确但不能产生所需的结果。例如,假设你在下列 P i z z a程序的命 令中错误地使用了“<”号: IF SquareInchPrice1 < SquareInchPrice2 THEN PRINT “Pizza 2 is a better deal than Pizza 1.” 由于你在应当使用“>”符号的地方用了“<”符号,命令将产生错误结果。 其他运行时错误归类为逻辑错误。逻辑错误是一种程序设计或逻辑中的错误。逻辑错误可 能由于流程图或伪代码中问题说明不足或解法不完整或不正确造成。逻辑错误比起语法错误来 通常更难检测,也更费时间。 15.3.2 程序文档 为何需要程序文档? 一个计算机程序不可避免地要修改。如果程序文档编制的好,修改程序就比较容易。例如, 假设两个饼店都在菜单中增加了一种新的矩形比萨饼。这样,你和朋友们需要修改程序,以便 可以输入矩形饼的边长。首先,需要理解当前程序的工作过程,虽然这对于很短的程序来说相 当容易,但假如你要了解一个计算收入税的 5 0 0 0 0行程序,特别当你不是该程序的程序员时, 难度可想而知。你可能需要一些附加的信息来解释程序逻辑和程序员设计的。 程序文档解释了程序的工作过程及使用方法。你创建的文档应当能为其他程序员用来修改 程序或者为其他人使用程序提供帮助。典型地讲,程序文档有两种形式:插入到程序代码中的 注释和专门制作的文档。 注释是插入到计算机程序的代码行中的解释性注解。改写一个程序时,程序员需要阅读原 来程序以理解程序如何工作,然后修订适当的代码段。如果一个原有程序的程序员在程序中加 了注释,那么程序就比较容易理解。 计算机执行程序时会略过这些注释,但这对需要修改程序的程序员来说,注释是很方便的。 一个文档比较好的程序都包含解释程序目的注释。例如,比萨饼问题有下面的注释: REM The Pizza Program REM This program tells you which of two pizzas is the better deal REM by calculating the price per square inch of each pizza. 在一些意思不太明确的程序段也应加上注释。比如,语句 3 . 1 4 2 *(s i z e / 2)^ 2可能对读者并 不显而易见,因此在前面加上些注释会有好处: REM The program calculates the number of square inches 第15章 计算机程序设计 439 下载 REM in a round pizza where REM pi=3.142,size/2=radius,and(size/2)^2=radius squared: S q u a r e i n c h e s = 3 . 1 4 2 * ( s i z e / 2 ) ^ 2 什么地方该加注释并没有固定的法则,但如果你参加一个项目,小组可能会制订一些规定 来保证程序中使一致的注释,如果你拥有了这方面的经验,很自然地就会使用注释。 专门制作的文档不属于程序,它包含的是一些对程序员和用户都有用的关于程序的信息。 文档既可以是文字的又可以是电子格式的。既然文档能为程序员和用户服务,因此也包含两类: 程序手册和用户参考手册。 程序手册中包含所有对程序员有用的信息,包括问题描述和算法。因为程序手册是软件开 发和维护的工具,所以只有程序员才用,用户不用。用户参考或称参考手册中的信息可以帮助 用户学会使用该软件。用户参考的电子版本通常能给用户提供在线式帮助。表 1 5 - 2比较了用户 参考和程序手册中的信息。 表15-2 程序文档 程序员手册 用 户 参 考 问题描述 说明程序功能 以结构化英语、伪代码或流程图描述算法 如何安装、启动和实用程序,以及其中的图表和菜单 程序源代码 故障分析与排除 程序员一般负责编排代码并整理程序手册,但用户参考手册现在一般由专业的科 技作家去编写。科技作家专门解释科技概念和程序,把复杂的概念简化供非技术人员 阅读。许多大学开设科技写作课程,甚至有的大学设有科技写作学位。在计算机工业 中有经验的科技作家被聘为业余的或专业的雇员。 习题C 1. 输入已知数据来验证程序是否输出正确结果是 ________过程的一部分。 2. 如果你忽略了编程语言的规则和语法,你可能会犯 ________错误。 3. 假设运行比萨饼程序时,输出结果为P i z z a 2价钱便宜。但实验数据说明P i z z a 1价钱便宜。 因为在你运行程序时出现了这种错误,所以应归为 ________错误。 4. ________错误识别起来最困难而且费时。 5. ________解释程序如何工作和及如何使用它。 6. 为了解释程序如何工作,而且使其他修改程序的程序员容易读懂,程序员往往在程序中 插入________。 7. ________是为程序员编写的文档,而________是为用户使用软件设计的文档。 15.4 编程语言的特点 在过去的3 5年里出现了上百种编程语言。一些语言的开发是为了提高编程效率,降低出错 率。而另一些则是为专门的编程提供高效的指令集,例如商业程序和科技程序。其他的是用于 教学的。 这些语言在描述如何工作和如何给合适任务类型提供信息时各具特色。例如, PA S C A L语 言是一种可编译的过程性的高级语言。当你需要选择语言来编程时,了解这些语言的特色和它 们的优缺点将很有帮助。 440 计算机文化 下载 信息网 科技写作 6 15.4.1 过程性语言 比萨饼问题程序是用过程性语 言编写的吗? 用过程性语言编写的程序包含一系列的 描述,告诉计算机如何执行这些过程来完成 特定的工作。带有过程性特征的语言称为过 程性语言。编写比萨饼程序的B A S I C语言就 具有过程性的特征,那些语句确切地告诉了 计算机如何工作:显示信息请求用户输入比 萨饼形状;请求输入大小;然后请求输入价 钱;如果饼是方的,用公式 S q u a r e i n c h P r i c e = Price / SquareInches, 等等。 过程性的编程语言适合于那些顺序执行 的算法。用过程性语言编写的程序有一个起 点和一个终点。程序从起点到终点执行的流 程是直线型的,即计算机从起点开始执行写 好的指令序列,直到终点(见图1 5 - 1 4)。 15.4.2 说明性语言 是否是所有的语言都需要程序员明确给定解决问题的步骤呢? 说明性语言只需程序员具体说明问题的规则并定义一些条件即可。语言自身内置了方法把 这些规则解释为一些解决问题的步骤,这就把编程的重心转移到描述问题和其规则上,而不再 是数学公式。因此说明性的语言更适合于思想概念清晰但数学概念复杂的编程工作。 不同于过程性的程序,用说明性语言编写程序只需你告诉计算机要做什么,而不需告诉它 如何去做。如图1 5 - 1 5所示,这是一段P R O L O G程序,问题是在所列的几个人中找出谁有姐妹。 图15-15 Prolog程序 第15章 计算机程序设计 441 下载 主程序 指令1 指令2 指令3 指令4 指令5 结束 指令1 0 0 指令2 0 0 子程序或过程 图15-14 过程性语言的执行 C h a r l i e、L i n u s、S a m、 G e o rg e说明为男性 ( M a l e ) L u c y、P a t t i e、A m a n d a、 A n n e说明为女性 ( F e m a l e ) 描述父母与孩子的关系 程序描述了确定人X是否为 人Y的姐妹的规则。 1. X必须是为女性。 2. X的母亲是M且父亲是Y。 3. Y与X有相同的母亲和父亲。 15.4.3 脚本语言 H T M L是一种语言吗? H T M L一般归为脚本语言。脚本语言以脚本的形式定义一项任务。脚本需要一个主机应用 系统依附来运行,不能单机运行。例如用 H T M L标签为显示网页编写一个脚本,这个脚本由网 络浏览器解释,这里网络浏览器就是主机应用系统,没有它 H T M L脚本就不能运行。 脚本语言包含在许多应用程序中,像字处理软件和电子制表软件。你可以用脚本使应用程 序中的任务自动化。这些自动化例程即通常所说的宏指令。 脚本语言使用起来比其他编程语言要简单,但它提供的控制选项很少。如果想使你应用软 件中的功能自动定制完成的话,H T M L对不擅长编程的人是一个很好的选择。 15.4.4 低级语言 比萨饼程序使用了P R I N T和E N D命令。计算机是否只认识0和1呢? 低级编程语言需要程序员为计算机系统低层的硬件编写指令,像处理器、寄存器和内存地 址等。低级语言对程序员直接在硬件水平上操作机器很有用。程序员通常使用低级语言编写像 编译器、操作系统和设备驱动程序之类的系统软件。 低级语言中的指令一般和处理器的指令相对应。回想一下在第 5章讲过的像 MMR M1 REG1 这种指令是如何告诉计算机从内存读取数据并送入寄存器的。使用低级语言编程,即使 是两数相加这样简单的操作也要数条指令才能实现。表 1 5 - 3就是这样一段程序。 表15-3 低级语言指令 汇编语言指令 指 令 含 义 LDA 5 将 5放入累加器中 S TA Num1 将5放在地址N u m 1的内存中 LDA 4 将4放入累加器中 ADD Num1 把内存N u m 1种的数据与累加器中的数据相加 S TA Total 将和存入地址为To t a l的内存中 E N D 程序结束 机器语言是二进制形式的计算机能直接执行的低级语言。机器语言对人来说既难理解又难 掌握,只在早期高级语言还没出现时使用过。 15.4.5 高级语言 什么可以替代低级语言呢? 高级语言提供给程序员的指令更像是人类语言,像B A S I C的 PRINT “Please wait...”命令。 五十年代科学家刚开始构思高级语言时,以为可以减少编程中的错误,但事实相反—语法错 误和逻辑错误却更易出现。不过,高级语言的确降低了出错率并大大缩短了写程序的时间。高 级语言程序必须翻译成计算机能够执行的指令,因此需要编译。 15.4.6 编译语言 高级语言如何产生机器可执行的语言? 高级语言程序执行之前需要编译器把它翻译为低级指令。你用高级语言写的程序称为源代 码,编译后的程序称为目标代码。图1 5 - 1 6是编译的过程。 442 计算机文化 下载 图15-16 程序语言编译器 如果使用编译语言,必须把你的程序编译成可执行的代码。因此调试程序需要三步:写程 序、编译程序和运行程序,一旦发现程序有错,必须修改你的程序并重新编译,然后才能再测 试。如果你编译了没有错误的程序,再运行时就不用编译了。 15.4.7 解释语言 解释器和编译器有何不同? 解释语言用解释器而不是用编译器来生成可执行代码。运行一个解释语言编写的程序时, 语言解释器读一条指令然后把它转化成可执行的机器语言指令,执行完一条指令后解释器再读 入下一条指令并解释成机器语言,如此继续。解释语言编写的程序执行速度慢,尤其是循环语 句多的程序效率更低,因为计算机必须解释每一条语句,循环语句就要重复解释多次。 解释语言相对于编译语言又有什么优点呢?调试用解释语言写的程序,不用编译,因此调 试程序花的时间似乎要少一些。图1 5 - 1 7给出了语言解释的概念。 第15章 计算机程序设计 443 下载 1. 源代码由程序语言编译器的一 部分进行检查。编译器扫描源代码 中它理解的命令字、数据、操作符 和分隔符。放弃程序员制作程序文 档时用的注释 2. 当编译器找到命令字、变 量名、数据、操作符和分隔符 后,它建立一个标签。由编译 器建立的标签是命令字编码的 缩写。例如,可以为变量名 N U M 1生成一个单字节的标签 3. 编译器试图分析标 签,即重新将标签安排成 机器语言的格式 4. 编译器使用语法 分析器得到的信息产生 机器语言指令 源代码 扫描例程 标签 分析程序 代码生成器目标代码 图15-17 程序语言解释器 15.4.8 面向对象语言 对象如何解决计算机编程? 面向对象的程序设计语言是建立在用对象编程的方法基础之上的。对象就是程序中使用的 实体或“事物”,例如按钮—屏幕上的一种长方形图标—就是一个对象。我们已经习惯于 用鼠标单击一个按钮。程序员可以使用面向对象的语言来定义按钮对象,在程序运行时把它显 示出来。 对象属于一个具有一定特性的类或组。“窗口”类是比较常见的类,所有的窗口 对象,包括应用程序窗口,都属于“窗口”类,它们具有相同的属性,如都有一个标 题栏和一个关闭按钮。程序员创建一个窗口对象时,他就获得或者说继承了窗口类的 属性和操作,但一个特定的窗口实例可以具有自己特定的属性,如标题、大小、屏幕 上的位置均可不同。图1 5 - 1 8给出了几个对象。 同一对象可用在不同的程序中,这无形中就扩大了程序员的生产率。例如,许多应用软件 都给用户文件提供了 O p e n、S a v e、Save as、P r i n t等操作,如果你编写这样的应用程序,定义 一个对象来完成这些操作会很方便,只要程序中用到这些操作,随时都可调用这些对象,避免 了做无用功。 其实,对象是一种现有的非常明显的良好编程思想。微软公司的 Wi n d o w s 3 . 1包含一个 C o m d l g . d l l文件,其中就有用于打开、保存、打印文件的菜单对象和对话框对象。 444 计算机文化 下载 1. 解释器是一种计算 机程序,是程序语言环境 的一部分。解释器检查程 序中第一个命令字 2. 解释器在语言的有 效命令表中查找该命令字 3. 如果该命令在表中, 解释器读取命令的其他 部分,以确定该命令符 合语法规定 4. 如果语法正确,解 释器将该命令转换成机 器语言,并将指令送往 处理器 信息网 面向对象的 程序设计 7 程序命令 语法 命令字 图15-18 屏幕两个对象Document Wo r d P a d窗口和Save As窗口同属于窗口类“Wi n d o w”。所有的 窗口都是矩形并且具有一个标题条。你可以打开和关闭窗口 , 也可以在屏幕上移动窗口 15.4.9 事件驱动语言 是否所有的程序都是一组顺序的动作? 程序事件是指程序必须做出响应的动作或表现,比如按键和点击鼠标。程序员用事件驱动 语言编程可以使程序随时检测并响应事件。使用图形界面的程序大部分都是事件驱动的,它们 在屏幕上显示诸如菜单这样的控件,并在用户作用控件时采取某一动作。事件驱动的程序中, 第15章 计算机程序设计 445 下载 1. Document Wo r d P a d窗 口类是窗口类“ Wi n d o w s” 的子类 ,一般作为应用窗口 看待。这一类的窗口都有 一个最大化按钮、最小化 按钮和一个菜单条 2. Save As窗口类是窗口 类“Wi n d o w s”的子类 ,称 为对话框窗口。它有一个 标题条、但没有菜单条、 最大化按钮和最小化按钮 图15-19 事件驱动的程序 双击该按钮产生一个事件 事件引发计算机执行这些指 令来计算买比萨饼最合算的方法 代码段要和图形化的对象相关联,比如命令按钮和图标。用户操作某一对象时产生一个事件, 比如点击“C o n t i n u e”按钮,该事件就触发与此对象关联的指令执行。图 1 5 - 1 9显示了一个事件 驱动程序的界面和某一事件的代码。 15.4.10 构件 程序中的对象从何而来? 实际中,面向对象程序中的对象是由程序设计者生成的。但程序员可以购买一些称为构件 或库的对象。构件是事先写好的对象,程序员可以应用到自己的程序中。对于目前流行的编程 语言,构件可以买到。使用构件编程就称为构件程序设计。 假设你被聘用为政府编写一个研究再生的软件。工程师要求该软件能周期性地生成一些图 形来比较玻璃、纸、铝和其他可再生材料的量。图形构件可以为你的软件提供这种功能。你只 需把图形库与你的程序连接。如果还需要填写政府的表格,可以再买一些表格构件加到“再生” 软件上来生成所需的表格。 程序员可以选择各种各样的构件来增强功能,比如电子表格、数据库管理、专家系统、报 表生成、在线帮助、数据查询、文字编辑、科幻和 3 - D图形等。在Visual Basic Programmer’s J o u r n a l等关于程序设计的杂志上,构件的广告随处可见。 习题D 1. 用________语言写的程序由一系列语句组成,它告诉计算机完成特殊任务所执行步骤。 2. ________语言由定义解决问题的条件的一系列规则组成。 3. _ _ _ _ _ _ _ _语言需要程序员在最低水平上写指令,这里特指硬件元素如处理器、内存、寄 存器等。 4. 在编译语言中,________代码被编译、翻译成可执行的目标代码。 5. 一些编程语言用________在程序执行时一次将每一条语句转换为可执行的机器指令。 6. 在________编程中,代码和对象相联系,对象有动作时程序才被执行。 7. ________是事先写好的对象被设计为专用并可添加到程序中。 8. ________是程序必须响应的动作,如按键和点击鼠标。 15.5 选择编程语言 通常情况下,一项任务可以用多种编程语言来实现。当你为一项工程选择编程语言时,思 考一下下面的问题: • 这种编程语言是否适合手中的任务? • 这种语言在其他的应用程序中是否也经常使用? • 小组中的人是否都精通这门语言? 如果这些问题的回答都是肯定的,那么这门语言对你的这项工程是一个很好的选择。了解 当今一些流行语言的特性对你回答第一个问题会有帮助。 B A S I C是为初级编程者设计的。自从1 9 6 4年问世以来,已经出现了几种流行的版 本,包括 I B M - P C上的G W- B A S I C和微软的Q B A S I C。由于B A S I C容易使用和适合于 各种计算机系统,它已成为最流行和最广泛使用的语言之一。 B A S I C是一种过程性的 高级语言,它的大多数版本都是解释执行的语言,但也有一些是编译执行的。 446 计算机文化 下载 信息网 Visual Basic 8 B A S I C早期的版本对于开发复杂的商用程序非常有限,但一些新版本,像微软的 Vi s u a l B a s i c ( V B )就是综合性的且功能强大的编程语言,适
/
本文档为【15 计算机程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索