您的位置:首页 > 运维架构

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

2017-11-26 21:08 323 查看
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 * t
92d7
imes)
{
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: