您的位置:首页 > 其它

简述“自顶向下,逐步求精”的方法

2017-11-30 16:50 288 查看
结构化程序设计支持“自顶向下, 逐步求精”的程序设计方法。

什么叫作“自顶向下,逐步求精”呢?

“自顶向下”

将复杂的大问题分解为相对简单的小问题,找出每个问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。其核心本质是”分解”。

“逐步求精”

将现实问题经过几次抽象(细化)处理,最后到求解域中只是一些简单的算法描述和算法实现问题。即将系统功能按层次进行分解,每一层不断将功能细化,到最后一层都是功能单一、简单易实现的模块。求解过程可以划分为若干个阶段,在不同阶段采用不同的工具来描述问题。在每个阶段有不同的规则和标准,产生出不同阶段的文档资料。

自顶向下,逐步求精的实践

在屏幕上输出如图所示的星号图形



一般人眼中可能看到的只是一堆星星,而在程序员看来,要用分解的思想,整理出关于图的规律来,或者说,要学会会分层次地去看待这个问题。这就需要“自顶向下,逐步求精”的思维方式。

思路:

首先看到的是一张图片;

这张图片有10行;

每一行有若干个星号;

每一行星号的个数有以下规律:第 i 行星号的个数是2 * i - 1个。

那么,我们得到的算法如下:

1、输出10行星号

  这是我们“自顶向下,逐步求精”的第一次分解:将一个图分成了若干行;

  

  伪代码如下

i=1;
while(i <= 10)
{
输出第i行;
换行
i = i + 1;
}


  “输出第i行”的问题还需要分解下去。实际上,输出“输出第i行”就是要“重复输出2*i-1个星号”,也可以用一个循环结构完成。

  

j = 1;
while(j <= 2 * i - 1)
{
输出一个*;
j = j + 1;
}


 结合以上两段伪代码,我们就能得到该题的伪代码如下:

i = 1;
while(i <= 10)
{
j = 1;
while(j <= 2 * i - 1)
{
输出一个*;
j = j + 1;
}
 换行 i = i + 1;
}


因此,用“自顶向下,逐步求精”的方法,我们得到该题的解答:

#include <iostream>
using namespace std;
int main( )
{
int i, j, n = 10;
i = 1;
while(i <= n)
{
j = 1;
while (j <= 2 * i - 1)
{
cout << '*';
j++;
}
cout << endl;
i++;
}
return 0;
}


由该实践可以看出:将输出一个“星号组成的图案”,分解为“循环输出若干行”,找出各行的规律,能够逐步细化到“输出第i行”这个任务,最终问题细化到只输出一个字符’*’。

从“顶层”出发,“向下”(即编程中能直接实现的细节)考虑,“逐步”地“求精”得到用C++语句直接描述的程度。对复杂的问题,可能需要更多层次的分解。

想一想,我们做任何工作,对大学生活做宏观的规划、制定一天的学习计划、组织一次班级活动、将来的工程项目开发、做老板后策划一项商业活动……无论复杂还是简单,有意或无意地,都是在“自顶向下,逐步求精”的伟大思想的光芒中行走的。只是现在,你需要用心体会,让“自顶向下,逐步求精”的方法成为一种习惯,一种思维惯性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: