“自顶向下,逐步求精”——Top-down Design

来源:互联网 发布:同步推苹果助手 mac 编辑:程序博客网 时间:2024/06/05 21:55

Top-down Design就是将一个问题分解成若干个子问题,这些子问题也叫做“模块”,重点是构造一个由问题与子问题(模块)组成的分层结构,总结起来就是“自顶向下,逐步求精”。

这里写图片描述

而程序设计者便要学习“自顶向下,逐步求精”的思考方法,将一个复杂问题抽离出几个核心问题,逐步分解成几个模块,模块内再不断分解,直至我们容易用计算机实现的、直接的最小模块,从而构建分层结构。

生活中的例子来说,“举办一个聚会”就是一个复杂的问题,我们可以把他分成两个小模块“邀请朋友”、“准备食物”,而“邀请朋友”模块下又可以分成“制作朋友清单”、“发送邀请”等更小模块,“准备食物”又可分为“制作菜单”、“购买食材”、“烹饪食材”等更小模块。于是,一个复杂问题最后被分解成具备操作性的、简单的、容易实现的若干个小问题。

以一个简单的程序设计题为例

这里写图片描述

在本题中,我们需要输出出现次数最多的数字及其次数。

我们分解成三个小问题:
1、输入
2、计算每一个数字出现的次数
3、比较各数字的输出次数,输出

对于第一个问题,它是易实现的
这里写图片描述

对第二个问题,我们将其再分解成更小的问题:
1、对于每一个数字,再建立一个循环
2、如果第二个循环中有数字相同,次数加一
这里写图片描述

对第三个问题,我们分解一下:
1、建立一个循环依次比较;
2、每次比较中较大的被取出;
这里写图片描述

洗衣机问题
观察我们的洗衣机,分析其过程
首先我们进行一次分解问题,可以得到一个大过程
{
注水;
浸泡;
漂洗;
排水;
停机;
}

然后我们将上述子模块进行再次分解:
注水:打开注水开关,满时关闭
浸泡:等待
漂洗:分为左转,停止,右转,停止四个步骤
排水:打开排水开关,排完关闭
停机:满足一定条件停机,返回信息

即:

{//注水waterinswitch(open);if (getwatervolume() = max) {        //max为水的安全最大体积    waterinswitch(close);}//浸泡//漂洗if (timecounter() = begintime) {    //begintime为开始漂洗的时间,与停止注水有一点时间    int times = 1;    timescounter() = 0;    while(times <= n) {            //n为漂洗次数    if (timecounter() >= begintime * times && timecounter() <= begintime + 5 * times)    {    motorrun(left);    }if (timecounter() > begintime + 5 * times && timecounter() <= begintime + 30 * times)    {    motorrun(stop);    }if (timecounter() > begintime + 30 * times &&timecounter() <= begintime + 35 * times)       {    motorrun(right);    }if (timecounter() > begintime + 35 * times && timecounter() <= begintime + 60 * times)    {    motorrun(stop);    }times ++;    timescounter() = 0;    }}//排水wateroutswitch(open)if (volume = 0) {wateroutswitch(close);}if (times = n) {halt(success);}else{halt(fail);}}
原创粉丝点击