• 沒有找到結果。

图形描述

在文檔中 程序设计大学教程 (頁 81-86)

第5章 算法与数据结构

2. 图形描述

z = x * y;

}

y = y / 2;

2. 图形描述

经验告诉我们画图往往是一种分析和解决问题的好办法。因为图形直观、易懂,容易说 明问题。所以,即使不是几何学的问题,如果我们能给出适当的几何图形表示,也会使问题 变得容易处理。程序设计中,能够用来表示算法基本概念的图主要有:PAD 图、N\S 盒图、

流程图。

流程图是最古老、最广泛使用的程序设计工具,也是展示程序逻辑流程的有效工具。流

程图是最常用的算法图形表示法。它使用框图的形式掩盖了算法所有的细节方面,它只显示 算法从开始到结束的整个流程。在程序设计环境下,它能用于设计一个完整的程序或者部分 程序。程序流程图常用图形符号及控制结构图例如图 5-1 所示。

图 5-1 程序流程图常用图形符号及控制结构图例

5.1.2 常用算法 1. 基本算法

基本算法大都比较简单,是其他算法的基础。这类算法在程序中应用非常普遍,如:累 加求和、累乘求积、求最大和最小值等。

这里我们来讨论在一组数据中求最大值的算法。它的思想是通过一个判断结构找到两个 数中的较大值。如果把这个结构放在循环中,就可以得到一组数中的最大值。以一个从 10 个数中找到最大值的算法为例,该算法的流程图如图 5-2 所示。

根据流程图我们还可以写出如示例程序 5-1 所示的伪代码。这里需要一个计数器 Counter 用来计数,并用一个变量 largest 保存当前比较出来的最大数。在初始化阶段给这个 计数器赋值为0,每循环一次就对它加 1。当计数器等于 10 时,退出循环。

之所以用伪代码来表述算法,是因为算法与具体计算机语言无关。也就是说,这个求 1000 个数中最大值的算法既可以用 Java 语言实现,应可以用 C++、Delphi 等语言实现。下 面我们就看看用Java 程序是如何实现的,程序代码如示例程序 5-2 所示,程序编译运行如 图 5-3 所示。

处理1

处理2

处理1 处理2 处理 条件 否 是

条件 处理

是 条件

端点符 处理 判断 预定义处 连接符

顺序结构 选择结构

(while-do) (repeat-until) 循环结构

图 5-2 从 20 个数中求最大值算法的流程图 示例程序 5-1 用伪代码写的在 10 个数中求最大值的算法 FindLargest

Input: 10 positive integers 1. largest←0

2. counter←0

3. while(counter < 10) 3.1 Input theInteger

3.2 if (theInteger > largest) then

3.2.1 largest←theInteger end if

3.3 counter←counter+1 end while

开始

初始化,将largest 和 counter 设为 0

计数器判断

counter <10 ?

while-do 循环

largesttheInteger 大值比较

theInteger>larges?

返回largest

结束

输入被比较的数theInteger

计数:counter←counter+1

4. Return largest end

示例程序 5-2 在 10 个数中求最大值算法的 Java 程序实现 1: import java.io.*;

2:

3: public class Max {

4: public static void main(String[] args) throws IOException { 5: //初始化

6: BufferedReader input = new BufferedReader 7: (new InputStreamReader(System.in));

8: int largest=0;

9: int counter=0;

10: int theInteger=0;

11: //循环比较

12: while(counter < 10) { 13: //输入被比较的数 14: counter++;//计数

15: System.out.println("请输入第"+counter+"个被比较的数:");

16: String inputString = input.readLine();

17: theInteger = Integer.parseInt(inputString);

18: //大值比较

19: if (theInteger > largest) largest=theInteger;

20: }// while

21: System.out.println("求出最大数是:"+largest);

22: } 23:

24: }

在示例程序 5-2 中,我们定义了一个 BufferedReader 类型的 input 变量,用于接收键盘 输入的数据:

BufferedReader input = new BufferedReader

(new InputStreamReader(System.in));

BufferedReader 是 Java 标准类库中提供的带缓存的读取器类,可通过 import java.io.*语 句导入。Java 标准类库中与输入输出有关的类位于 java.io 包中。

忠 告

JDK 提供的庞大的类库中包含了仔细设计并高效编程实现的类定义,可应 用于各种各样的任务。在设计和编写自己的代码之前,先在Java 类库里找一找,

看是否已经有了可以解决你所遇问题的类。

图 5-3 最大值算法的 Max 程序编译和运行

Java类库

在 Java 中,通常我们会用到 3 个的与输入输出有关的流。System.in、

System.out 以及 System.err。System.in 是一个预定义的 InputStream 输入流,

它通常与键盘联系在一起。而java.io.BufferedReader 类有一个 readLine 方法 可用于简单的键盘输入。BufferedReader 类包含执行带有缓冲的输入的方法。

缓冲区(buffer)是一片内存,用于保存输入直到程序需要它。在键盘与程序 之间使用缓冲区,即可用退格键来删除一个字符。当按回车键之后,程序在 从输入缓冲区里获取字符时将忽略被删除的所有字符。

注意,BufferedReader 的构造方法带有一个 Reader 参数。如果想用键盘 进行带缓冲的输入,可以把System.in 的一个引用传递给 BufferedReader 构造 函数,这样它就能让我们把System.in 转换成一个带缓冲的读取器。

一旦创建了一个BufferedReader 对象(程序中名为 input),就能用 readLine 方法来从键 盘读取一行字符并将它存放在一个字符串对象(如程序第16 行中的 inputString)中。考虑 到在程序的运算中,我们需要把键盘输入的字符串转换成可进行比较的整数,这时可以借助 Java 类库中的 java.lang.Integer 类:

theInteger = Integer.parseInt(inputString);

Integer 类的 parseInt 方法把 inputString 转换成 int 类型,并将返回值赋给了 theInteger 变量。Integer 类称为包装类(wrapper class),它是无法继承的 final 类,它提供的 parseInt 等类型转换方法都是静态方法,无需实例化就可以调用。

因为输入操作可能遇到各种无法预测的问题,如果发生了某个输入错误,readLine 方法 会引发一个IOException。为了在程序中使用 readLine,我们必须使用 throws 关键字确保能 够引发万一出现的IOException 异常。这样一来,如果出现了 IOException 异常可以被捕获,

并交给Java 虚拟机以默认的方式来处理(通常是停止程序并打印出一条错误信息)。这段代

在文檔中 程序设计大学教程 (頁 81-86)