QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1414|回复: 10
打印 上一主题 下一主题

自上而下的编程方法简介

[复制链接]
字体大小: 正常 放大
回帖奖励 9 点体力 回复本帖可获得 9 点体力奖励! 每人限 1 次(中奖概率 10%)

413

主题

36

听众

1854

积分

升级  85.4%

  • TA的每日心情
    开心
    2019-9-18 21:55
  • 签到天数: 258 天

    [LV.8]以坛为家I

    社区QQ达人

    群组2015国赛冲刺

    群组2016美赛公益课程

    群组国赛讨论

    群组第三届数模基础实训

    群组Matlab讨论组

    跳转到指定楼层
    1#
    发表于 2015-9-4 22:29 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    随着选择和循环介绍,我们的程序也将变得复杂,对于解决问题来说,将会变得简单。为了帮助大家避免在编程过程中出现大量的错误,我们将向大家介绍正式的编程步骤,即自上而下的编程方法。我们也会向大家介绍一些普通的算法开发工具伪代码

    3.1 自上而下的编程方法简介
    假设你是在工厂工作的工程师,为了解决某些问题,你要编写一个程序。你如何开始呢?当遇到一个新问题时,我们的心里会自然而然的产生这样的想法:马上坐在计算机前,开始编程,而不用浪费大量的时间思考我们所要解决的问题是什么?用这种不切实际的想法来编一些非常小的程序可能会成功。但在现实中,问题可能会非常的大,程序员再用这种方法编程将会陷入困境。
        对于一个大的程序来说,在编写代码之前你要通盘的思考你所要面临的问题和解决的方法。在本节中,我们将向大家介绍正式的编程设计步骤,然后应用这个步骤来编写本书所有的大的应用程序。对于我们所遇到一些简单的例子来说,这个步骤好像有些画蛇添足。但是当我们解决的问题变得越来越大的时侯,这个步骤将会变得异常重要。

    当我还没有毕业的时侯,一个教授喜欢说:“编程很简单,因为我知道在编程的过程的困难”。当我们离开学校,在工厂从事于大规模软件工程编写时,我深深地理解了它所说的话。我发现在工作中我遇到的大多数困难都是对所要解决问题的理解。   
        一旦你真正理解了问题,你就会把这个问题分解成许多小的问题,更加易于管理的小块,然后逐一解决某一个小块。自上而下的编程方法是我们正规编程设计的基础。
        我们现在向大家介绍这些在图
    3.1说明的步骤细节。步骤如下:

    1.清晰地陈述你所要解决的问题

    编写的程序大多数情况下要满足一些感觉上的需要,但这种需要不一定能够被人清晰地表达出来。例如,用户需要一个解线性方程组的表达式。像这样的要求就不够清楚,程序员就很难编出一个使他满意的程序。他必须弄清楚要有多少问题需要解决?在这些方程式中有没有对称的形式使我们的开发变得简单?程序设计者必须和使用者讨论所需的程序,他们必须要对完成的任务有一个精确细致的描述。对问题清晰的描述可以防止误解,并且能够帮助程序员合理的组织他的思想。上面的例子对问题合适的陈述应为:

    设计一个用于解决联立线性方程组的程序,这些方程中未知数的系数为实数,最多有20个未知数。




    2.定义程序所需的输入量和程序所产生的输出量

    指定输入量和输出量,只有这样新的程序才能适应全过程计划。在这个例子中方程式的系数可能有其预先存在的顺序,我们的新程序必须能按照顺序读取它们。相似地,也需要产生出这个程序所要求的结果,即输出量,我们还要以一定的格式打印出来。

    3.设计你的程序得以实现的算法


    算法是指为某个问题找到答案一步接一步的程序。在这个阶段自上而下的编程方法发挥了作用。
       编程设计者开始对这个问题进行逻辑划分,把它逐步分解为一个又一个子工作。这个过程叫做分解
    (decomposition)
       如果一些子工作还是比较大,设计者还可以把他它分解成更小的块。这个过程将会继续到问题被分解成许多简单且易理解的小块为止。

    在问题被分解成小块之后,每一个小块要被进一步的求精,这个过程叫做逐步求精(stepwiserefinement)
       在这个过程中,设计者开始于对本小块代码总括性的描述,然后开始一步一步地定义所需的函数,越来越具体,直到他能够转化为
    MATLAB语句。
       逐步求精的过程中,我们要用到的伪代码将会在下节为大家介绍。

    在算法开发过程中,这个方法是非常有用的。  
       如果设计者真正理解了解决问题这个些步骤,他将会对问题进行分解逐步求精

    4.把算法转化为代码

    如果分解和逐步求精的过程已经顺利完成,那么这一步将会异常地简单。所有程序员都会将伪代码一句一句地转化为合适地MATLAB语句。

    5检测产生的MATLAB程序

    这一步是真正的拦路虎。首先,程序的每一部分将会被单独地检测,如果有可能的话,整个程序还要被检测一遍。
       在我们检测程序时,我们必须证明所有合法输入数据值都能够正常运行。用标准的输入值检测程序,看它是否产生了值。
       如果在一个程序中执行的算法包含了不同的分支,你必须检测每一个分支,以保证产生正确的答案。
       大程序在交付大众使用之前,必须经过一系列地检测
    (3.2)。检测的第一步有时被称为单元检测(unit testing)。在单元检测过程中,程序的子程序将会被独立地检测以证明它的正确性。
       当单元检测结束之后,这个程序将进行一系列的组合,把独立的子程序联合产生出最后的程序。程序第一步的联合通常只包括很少的子程序。通过组合这些子程序,经常用检查子程序或函数之间的联系。在一系列地组合过程中,越来越多的子程序被加了进来,直到整个程序的完成。在每一次组合的过程中,每一个错误都会被发现并在进行下一次组合之前纠正过来。



    在整个程序被组合之后,调试继续进行。
       程序第一个版本我们通常称之为“
    alpha版本”。
       程序员和其他有机会接近它的人可以想尽一切办法应用它,以发现其中的漏洞,然后改正之。当许许多多大的错误从程序中去除,一个新的版本出现了,我们称之“
    beta版本”。beta版本就要公开地发行给天天需要这个程序工作的人。这些用户使这个程序在不同的环境下,在不同的输入条件下工作,会发现许多的错误,并报告给程序员。当这些错误被更正后,这个程序就能够发行给公众使用了。因为本书中的程序都比较小,没有必要进行上述的大规模的检测。但是我们会遵循基本的调试原则。

    程序设计的基本步骤如下:

    1.清晰地陈述出你要解决的问题。
    2.确定程序所需地输入量和程序所产生的输出量。
    3.为你的程序设计算法
    4.将算法转化为MATLAB语句
    5.调试MATLAB程序



    好的编程习惯

    遵循上面的步骤编写可靠,易理解的MATLAB程序。


    在大的编程项目中,花在编程序的时间是出奇的少。Frederick P Brooks在他的the Mythical Man­Month书中写道,对于大的软件工程来说,三分之一的时间花在计划如何来做上(第一步到第三步),六分之一的时间花在编写程序上,近一半的时间用来调试程序。
       而我们能做的只有压缩调试用的时间。在计划阶段做好充分的准备和在编程过程使用良好的编程习惯,这样会大大降低我们调试所用的时间。好的编程习惯能减少出错的数量,也能使别人迅速地找出其中的错误。

    3.2伪代码的应用

    作为我们设计步骤的一部分,描述出你要执行的算法是非常必要的。算法的描述有一种标准形式,能让你和大家都能理解,这种描述将帮助你的内容转化为MATLAB代码。我们用于描述算法的标准形式叫做构造(constructs有时也称structure)。用这些结构描述出的算法,我们称之为结构化算法。当我们在MATLAB程序中执行这个算法时,产生的程序叫做结构化程序。

    我们可以用伪代码的形式建立算法的结构。伪代码是MATLAB和英语的混合体。MATLAB一样,它是结构化的,一行表达一个明确的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。
    伪代码的每一行都应用普通简单且易于理解的英语或中文描述。  
       因为修改简单灵活,所以伪代码在开发算法的过程中非常的有用。
       因为伪代码给编辑器或字处理器
    (通常用于编写MATLAB程序)的,而不需要其他的可视化功能。例如下面是例2.3的算法伪代码

    Prompt user to enter temperature in degrees Fahrenheit

    Read temperature in degrees Fahrenheit(temp_f)

    temp_k in kelvins (5/9) * (temp_f - 32) + 273.15

    Write temperature in kelvins

    注意用向左指的箭头←替代等号(=)指出一个值将存储到对应的变量中,这样就避免了赋值号与等号的混淆。在把它们转化为MATLAB代码之前,伪代码将有助于你思想的组织。



    图3-1.PNG (13.03 KB, 下载次数: 152)

    图3-1.PNG

    图3-2.PNG (18.72 KB, 下载次数: 152)

    图3-2.PNG

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国版主团队!

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    残__泪 实名认证       

    10

    主题

    14

    听众

    429

    积分

    升级  43%

  • TA的每日心情
    慵懒
    2018-9-14 07:54
  • 签到天数: 244 天

    [LV.8]以坛为家I

  • TA的关系
  • 社区QQ达人

    群组2015SAS数据分析大赛

    群组Matlab讨论组

    群组数学建模

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    回复

    使用道具 举报

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    0

    主题

    13

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    奋斗
    2016-7-31 18:28
  • 签到天数: 72 天

    [LV.6]常住居民II

    自我介绍
    本科生

    社区QQ达人

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    瞥神        

    1

    主题

    10

    听众

    64

    积分

    升级  62.11%

  • TA的每日心情
    开心
    2015-9-11 07:28
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组数学建摸协会

    群组数学建模培训课堂1

    回复

    使用道具 举报

    瞥神        

    1

    主题

    10

    听众

    64

    积分

    升级  62.11%

  • TA的每日心情
    开心
    2015-9-11 07:28
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组数学建摸协会

    群组数学建模培训课堂1

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-22 05:07 , Processed in 0.629901 second(s), 103 queries .

    回顶部