自顶而下,逐步求精

若想让计算机解题必须用清晰而无两义性的方式给它提供算法。要求:
1. 找出一个算法,它能提供所解问题的从输入到输出所需的映象。
2. 选择一种程序语言写出程序,用计算机能接受的方式表述算法。

关键是如何找出算法。因为写出程序,只是表述算法,应该没有困难。

“自顶向下、逐步求精”的程序设计技术是目前较为时髦的、合理的找出算法的一种思维方法。它的核心思想是:
对于某一个要解决的问题,在寻求它的解法过程中,首先从问题的整体(最顶层)出发,将它分解成独立而互不交叉的若干个子问题。每个子问题解决整体问题的一部分或一种情况。这几个子问题若能正确解决,则它们的总和就是整体问题的解。
向下再一个个的具体考虑下一层的各个子问题,针对每个子问题,仍采用对待整体问题解的思路,继续对其进行分解(求精),得到该子问题解法的分解步骤,即更低一层次的子问题。
如此下去,直到最低层的每个子问题都能用计算机语言的一个语句表示出来或都能明显写出解法为止。便找到解决整体问题的解题算法了。

(一)上述的求精过程中的每一步,主要用到如下四种求精技术:
1. 顺序连接的求精
2. 分支、选择的求精
3. 循环的求精
4. 递归的求精
●当问题的子解具有前后关系时,采用第一种顺序连接的求精技术,将问题分解成互不相交的几个子问题的顺序执行。
●当问题是分别不同情况而应该进行不同处理时,采用第二种分支、选择的求精技术,构造分支。这时要注意分支的条件一定要正确。
●当问题的子解具有特性:如果有向解的方向前进一步的方法,且不断重复该步骤,即能解决问题,最终达到完全解。则应该采用循环的求精技术。这时要弄清循环的初始条件、结束条件和有限进展的一步都是什么。
●当问题的某步解法与前边高层次的某步解法具有相同性质,只是某些参数不同时,可采用递归的求精技术。这时应注意递归的参数变化规律以及递归出口。
所谓自顶向下,逐步求精的分析技术实质上是下图所示过程的反复。

这里写图片描述

(二)采用自顶向下、逐步求精方法构造程序有如下优点:
1. 程序的层次分明、结构清晰。
2. 便于集体开发程序。对于大型程序来讲,可以每组负责一个模块(一个子部分),在一个组内又可以每个人负责一个子模块(更小的子部分)等等。而各个模块之间以及各个子模块之间相对独立,互相之间没有制约,各个模块的负责人员可以独立的进行程序设计。
3. 便于调试。若程序有错误,可以很容易的将错误局部于某一子部分,找出错误,同时每一部分的错误是独立的,也不至于影响其它的部分。

(三)有各种方法表示上述求精过程,比较常见的是:
1. 传统的流程图方法:把每步求精过程用流程图表示。优点是直观,以两维图表示程序的流程;缺点是不能体现结构化程序设计思想。
2. 函数方法:在求精过程中,每个子问题都以一个函数调用表示,然后再具体求精相应的函数本身。不画框图,而直接书写程序。优点是:直接写出程序,程序的层次分明,能体现结构化程序设计思想。缺点是:以一维方式表示逻辑结构,逻辑结构和算法不直观。
3. PAD 方法:用二维树形结构图描述程序的逻辑,直观、清楚。具有上述两种方法的共同优点,同时又摈弃了上述两种方法的缺点。
(1) 处理的概括性:与一条纵线相连的处理可以作为一个概括。在流程图和程序中,没有特别的表示处理概括的记法。
(2) 执行顺序的表示:从上至下用纵线连接处理顺序。在流程图中用箭头表示处理流向;在程序中则没有表示处理顺序的方法。
(3) 嵌套层次的表示: PAD的树结构可以清楚地表示嵌套层次。流程图没有表示嵌套的记号;程序则靠的是语句嵌套;都没有PAD清晰、明了。

(四)实例
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

### 回答问题 自向下、逐步求精的模块化程序设计是一种结构化编程方法,广泛应用于C++程序开发中。这种方法的核心思想是从整体到局部、从抽象到具体地解决问题。以下是详细的解释和实现步骤: --- #### 1. **自向下的设计思想** - 自向下是指从高层次的抽象开始,逐步细化到具体的实现细节。 - 在程序设计中,首先定义程序的整体目标和功能,然后将其分解为多个子任务或模块,每个模块负责完成一部分功能。 #### 2. **逐步求精的过程** - 逐步求精是将复杂问题分解为更小、更简单的子问题的过程。 - 每一步都专注于解决当前层次的问题,同时忽略下层细节,直到达到可以直接实现的具体步骤。 #### 3. **模块化的意义** - 模块化是指将程序划分为多个独立的模块,每个模块完成特定的功能。 - 这种方法有助于提高代码的可读性、可维护性和复用性。 --- ### 示例代码 以下是一个使用自向下、逐步求精方法设计的简单C++程序示例,该程序计算并输出一个整数数组的最大值。 ```cpp #include <iostream> #include <vector> using namespace std; // 函数声明 int findMax(const vector<int>& nums); void printResult(int maxVal); // 主函数 int main() { // 定义输入数组 vector<int> numbers = {3, 5, 7, 2, 8, -1, 4, 10, 12}; // 调用函数找到最大值 int maxValue = findMax(numbers); // 输出结果 printResult(maxValue); return 0; } // 找到数组中的最大值 int findMax(const vector<int>& nums) { if (nums.empty()) return INT32_MIN; // 如果数组为空,返回最小整数值 int maxVal = nums[0]; for (int num : nums) { if (num > maxVal) { maxVal = num; } } return maxVal; } // 输出最大值 void printResult(int maxVal) { cout << "The maximum value is: " << maxVal << endl; } ``` --- ### 解释 1. **自向下的设计过程**: - 首先定义程序的整体目标:计算并输出一个整数数组的最大值。 - 将问题分解为两个子任务: 1. 找到数组中的最大值(由 `findMax` 函数完成)。 2. 输出最大值(由 `printResult` 函数完成)。 2. **逐步求精的过程**: - 在主函数中,我们定义了一个数组,并调用 `findMax` 函数来找到最大值。 - `findMax` 函数通过遍历数组,逐步比较每个元素,找到最大值。 - 最后,`printResult` 函数负责格式化输出结果。 3. **模块化的优点**: - 程序被划分为三个独立的部分:主函数、`findMax` 和 `printResult`。 - 每个部分的功能明确且独立,便于测试和维护。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值