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

来源:互联网 发布:浦东网络电视台 编辑:程序博客网 时间:2024/05/18 12:40

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

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

“自顶向下”

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

“逐步求精”

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

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

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

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

阅读全文
0 0