当前位置: 首页 > news >正文

结构化编程(SP,structured programming)

简介:

        结构化编程又叫结构化程序设计。

        结构化程序设计是进行以模块功能处理过程设计为主的详细设计的基本原则。结构化程序设计是过程式程序设计的一个子集,它对写入的程序使用逻辑结构,使得理解和修改更有效更容易。

        结构化程式设计(英语:Structured programming),是一种编程典范。也是一种解决问题的思想和方法。它采用子程序、程式码区块(block structures)、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、品质以及开发时间,并且避免写出面条式代码。

        代码过度使用GOTO语句而不是结构化编程结构,从而导致错综复杂和不可维护的程序,通常称为意大利面条代码。        

        “面条式代码(Spaghetti code)是软件工程中反面模式的一种,是指一个代码的控制结构复杂、混乱而难以理解,尤其是用了很多GOTO、例外、线程、或其他无组织的分歧架构。

基本结构:

        结构化程序设计的三种基本结构是:顺序结构、选择结构和循环结构

  • 顺序结构 :顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。顺序结构的程序又称简单程序,这种结构的程序是顺序执行的,无分支,无转移,无循环,程序本身的逻辑很简单,它只依赖于计算机能够顺序执行指令(语句)的特点,只要语句安排的顺序正确即可。
  • 选择结构 :选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。
  • 循环结构 :循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。在循环结构中最主要的是:什么情况下执行循环?哪些操作需要循环执行?循环结构的基本形式有两种:当型循环和直到型循环。
    • 当型循环:表示先判断条件,当满足给定的条件时执行循环体,并且在循环终端处流程自动返回到循环入口;如果条件不满足,则退出循环体直接到达流程出口处。因为是"当条件满足时执行循环",即先判断后执行,所以称为当型循环。
    • 直到型循环:表示从结构入口处直接执行循环体,在循环终端处判断条件,如果条件不满足,返回入口处继续执行循环体,直到条件为真时再退出循环到达流程出口处,是先执行后判断。因为是"直到条件为真时为止",所以称为直到型循环。
       

基本结构图示

 循环结构又包括:当型循环(While型)、直到型(Until):

 结构化程序设计方法

  1. 自顶而下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。
  2. 逐步细化:对复杂问题,应设计一些子目标作为过渡,逐步细化。
  3. 模块化设计:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。
  4. 结构化编码

        结构化程序设计提出的原则可以归纳为32个字:

  • 自顶向下,逐步细化;
  • 清晰第一,效率第二;
  • 书写规范,缩进格式;
  • 基本结构,组合而成。

特点

        结构化程序中的任意基本结构都具有唯一入口和唯一出口,并且程序不会出现死循环。在程序的静态形式与动态执行流程之间具有良好的对应关系。

优点

        由于模块相互独立,因此在设计其中一个模块时,不会受到其它模块的牵连,因而可将原来较为复杂的问题化简为一系列简单模块的设计。模块的独立性还为扩充已有的系统、建立新系统带来了不少的方便,因为我们可以充分利用现有的模块作积木式的扩展。

        按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合:顺序结构、选择结构和循环结构来实现。

        结构化程序设计的基本思想是采用"自顶向下,逐步求精"的程序设计方法和"单入口单出口"的控制结构。自顶向下、逐步求精的程序设计方法从问题本身开始,经过逐步细化,将解决问题的步骤分解为由基本程序结构模块组成的结构化程序框图; "单入口单出口"的思想认为一个复杂的程序,如果它仅是由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。据此就很容易编写出结构良好、易于调试的程序来。

  1. 整体思路清楚,目标明确。
  2. 设计工作中阶段性非常强,有利于系统开发的总体管理和控制。
  3. 在系统分析时可以诊断出原系统中存在的问题和结构上的缺陷。

缺点

  1. 用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。
  2. 用系统开发每个阶段的成果来进行控制,不能适应事物变化的要求。
  3. 系统的开发周期长。

面向对象的设计方法会取代结构化程序设计方法?

        程序设计方法经历了从传统的“面向过程设计”到目前被广泛接受的“面向对象设计”的过程。方法的改变源自认识的改变。但即使是谬误也会以某种方式显示真理。而且,我觉得面向对象的设计方法是对结构化编程的优化、升级,而不是完全取代。结构化编程是更基础的思想方法。 

        1976 年 N.Wirth 出版的名为 《Algorithms + Data Structure = Programs》的著作中,明确提出“算法”和“数据结构”是程序的两个要素,即程序设计主要包括两方面的内容。  

  • 行为特性的设计:指完整地描述问题求解的全过程,并精确地定义每个解题步骤,这一过程即是“算法设计”  
  • 结构特性的设计:指在问题求解的过程中,计算机所处理的数据、及数据之间联系的表示方法。

        根据上述定义,传统的程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。

        世界观决定方法论。正是有了上述对程序设计的认识,才会产生结构化编程的方法论。

常见的程序设计思想

  • 模块化程序设计(modular programming)。简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。将项目进行划分,每个函数负责实现一部分功能。
  • 自顶向下编程(top-down)。先对整个系统有个了解,从高层次进行任务的划分,将大任务不断划分成小任务,每个小任务留到下一级进行处理。
  • 自底向上编程(bottom-up)。从底层开始,一步步合并成整体。
  • 结构化编程(structured)。主张使用顺序、选择、循环三种基本结构来嵌套连结成具有复杂层次的“结构化程序”,严格控制GOTO语句的使用。单出入口。自顶向下,逐步求精的思想。
  • 面向过程编程(procedure-oriented programming)。将问题划分成一系列小问题,用不同的函数来完成各个问题,采用的是top-down。这种编程方法强调做事情(函数),但是很少关注于数据的流动。全局的数据可以被所有函数访问和修改,这就导致了数据的不安全性以及当某个函数不小心修改了数据之后我们很难判断到底是哪个函数的问题。此外面向过程的编程不能很好对真实问题建模,因为它不是确切的对应问题的实体element。
  • 面向对象编程(object-oriented programming)。基于POP的缺点,OOP不允许数据在各个函数之间自由流动,它将数据和对数据进行操作的函数联系得更紧密。OOP将现实世界中的实体分解成对象,对象A包含数据A和函数A,数据A被隐藏起来并不被其他对象所访问,其他对象要访问数据A只能通过函数A,对象间的通讯由函数来完成。采用的是bottom-up。
     

相关文章:

  • Python 博客园快速备份脚本
  • Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)
  • JavaWeb三大组件之Servlet------Servlet详细讲解
  • 解决nacos集群搭建,服务注册失败
  • 瑞吉外卖Linux
  • 准备去「技术出海峰会」看看
  • Java毕设项目-OA办公系统
  • C# Post请求上传文件_C#Post请求带文件
  • Flutter:文本组件
  • ANSYS2021安装过程问题总结
  • 洛谷 P3119【分层图】【tarjan】
  • Reggie外卖项目 —— 项目开发整体介绍
  • git -- 回退版本(两个版本之间来回切)
  • Non-nullable instance field must be initialized
  • C++中的struct和class基本没啥区别,唯一的区别如下
  • 0基础学习移动端适配
  • Angular4 模板式表单用法以及验证
  • JS函数式编程 数组部分风格 ES6版
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 百度地图API标注+时间轴组件
  • 理解在java “”i=i++;”所发生的事情
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 免费小说阅读小程序
  • 如何用vue打造一个移动端音乐播放器
  • 实现简单的正则表达式引擎
  • 微信小程序:实现悬浮返回和分享按钮
  • 线性表及其算法(java实现)
  • 小而合理的前端理论:rscss和rsjs
  • ###C语言程序设计-----C语言学习(6)#
  • #include<初见C语言之指针(5)>
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)(1.11) SiK Radio v2(一)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)为什么要选择C++
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET处理HTTP请求
  • .NET框架
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • ??eclipse的安装配置问题!??
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [.NET]桃源网络硬盘 v7.4
  • []串口通信 零星笔记
  • [<死锁专题>]
  • [2016.7 day.5] T2
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue