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

结构化程序设计支持“自顶向下, 逐步求精”的程序设计方法。

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

“自顶向下”

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

“逐步求精”

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

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

在屏幕上输出如图所示的星号图形
简述“自顶向下,逐步求精”的方法_第1张图片
        一般人眼中可能看到的只是一堆星星,而在程序员看来,要用分解的思想,整理出关于图的规律来,或者说,要学会会分层次地去看待这个问题。这就需要“自顶向下,逐步求精”的思维方式。
思路:

  1. 首先看到的是一张图片;
  2. 这张图片有10行;
  3. 每一行有若干个星号;
  4. 每一行星号的个数有以下规律:第 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 
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++语句直接描述的程度。对复杂的问题,可能需要更多层次的分解。
        想一想,我们做任何工作,对大学生活做宏观的规划、制定一天的学习计划、组织一次班级活动、将来的工程项目开发、做老板后策划一项商业活动……无论复杂还是简单,有意或无意地,都是在“自顶向下,逐步求精”的伟大思想的光芒中行走的。只是现在,你需要用心体会,让“自顶向下,逐步求精”的方法成为一种习惯,一种思维惯性。

你可能感兴趣的:(简述“自顶向下,逐步求精”的方法)