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

(转载)从0开始学matlab(第10天)—自顶向下的编程思想

        在前面的内容中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果,打印出结果,并退出。至于要多次重复运算程序的某些部分是没有办法的,也不能根据输入的值,有选择地执行程序的某些部分。
        在之后的内容中,我们将向大家介绍大量的 MATLAB 语句,这些语句允许我们来控制中语句的执行顺序。有两大类控制顺序结构: 选择结构 ,用选择执行特定的语句;循环结构,用于重复执行特定部分的代码。随着选择和循环介绍,我们的程序也将变得复杂,对于解决问题来说,将会变得简单。为了帮助大家避免在编程过程中出现大量的错误,我们将向大家介绍正式的编程步骤,即自顶向下的编程方法。我们也会向大家介绍一些普通的算法开发工具即伪代码。   

1简介

        假设你是在工厂工作的工程师,为了解决某些问题,你要编写一个程序。你如何开始呢?当遇到一个新问题时,我们的心里会自然而然的产生这样的想法:马上坐在计算机前,开始编程,而不用浪费大量的时间思考我们所要解决的问题是什么?用这种不切实际的想法来编一些非常小的程序可能会成功。但在现实中,问题可能会非常的大,程序员再用这种方法编程将会陷入困境。对于一个大的程序来说,在编写代码之前你要通盘的思考你所要面临的问题和解决的方法。在本节中,我们将向大家介绍正式的编程设计步骤,然后应用这个步骤来编写本书所有的大的应用程序。对于我们所遇到一些简单的例子来说,这个步骤好像有些画蛇添足。但是当我们解决的问题变得越来越大的时侯,这个步骤将会变得异常重要。
        当我还没有毕业的时侯,一个教授喜欢说:“编程很简单,因为我知道在编程的过程的困难”。当我们离开学校,在工厂从事于大规模软件工程编写时,我深深地理解了它所说的话。我发现在工作中我遇到的大多数困难都是对所要解决问题的理解。一旦你真正理解了问题,你就会把这个问题分解成许多小的问题,更加易于管理的小块,然后逐一解决某一个小块。自上而下的编程方法是我们正规编程设计的基础。我们现在向大家介绍这些在图1 说明的步骤细节。步骤如下 :

 图1 

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

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

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

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

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

        算法是指为某个问题找到答案一步接一步的程序。在这个阶段自上而下的编程方法发挥了作用。编程设计者开始对这个问题进行逻辑划分,把它逐步分解为一个又一个子工作。这个过程叫做分解(decomposition)。如果一些子工作还是比较大,设计者还可以把他它分解成更小的块。这个过程将会继续到问题被分解成许多简单且易理解的小块为止。在问题被分解成小块之后,每一个小块要被进一步的求精,这个过程叫做逐步求精(stepwise refinement)。在这个过程中,设计者开始于对本小块代码总括性的描述,然后开始一步一步地定义所需的函数,越来越具体,直到他能够转化为 MATLAB 语句。逐步求精的过程中,我们要用到的伪代码将会在下节为大家介绍。在算法开发过程中,这个方法是非常有用的。如果设计者真正理解了解决问题这个些步骤,他将会对问题进行分解和逐步求精。

1.4把算法转化为代码

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

1.5 调试 MATLAB 程序

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

图2

 

        在整个程序被组合之后,调试继续进行。程序第一个版本我们通常称之为“alpha 版本”。程序员和其他有机会接近它的人可以想尽一切办法应用它,以发现其中的漏洞,然后改正之。当许许多多大的错误从程序中去除,一个新的版本出现了,我们称之“beta 版本”。beta 版本就要公开地发行给天天需要这个程序工作的人。这些用户使这个程序在不同的环境下,在不同的输入条件下工作,会发现许多的错误,并报告给程序员。当这些错误被更正后,这个程序就能够发行给公众使用了。因为本书中的程序都比较小,没有必要进行上述的大规模的检测。但是我们会遵循基本的调试原则。程序设计的基本步骤如下 :
        1.清晰地陈述出你要解决的问题。
        2.确定程序所需地输入量和程序所产生的输出量。
        3.为你的程序设计算法
        4.将算法转化为 MATLAB 语句
        5.调试 MATLAB 程序
好的编程习惯
遵循上面的步骤编写可靠,易理解的 MATLAB 程序。
        在大的编程项目中,花在编程序的时间是出奇的少。Frederick P Brooks 在他的 the Mythical Man-Month 书中写道,对于大的软件工程来说,三分之一的时间花在计划如何来做上 (第一步到第三步),六分之一的时间花在编写程序上,近一半的时间用来调试程序。而我们能做的只有压缩调试用的时间。在计划阶段做好充分的准备和在编程过程使用良好的编程习惯,这样会大大降低我们调试所用的时间。好的编程习惯能减少出错的数量,也能使别人迅速地找出其中的错误。

2 伪代码的应用

        作为我们设计步骤的一部分,描述出你要执行的算法是非常必要的。算法的描述有一种标准形式,能让你和大家都能理解,这种描述将帮助你的内容转化为 MATLAB 代码。我们用于描述算法的标准形式叫做构造 (constructs 有时也称 structure)。用这些结构描述出的算法,我们称之为结构化算法。当在我们在 MATLAB 程序中执行这个算法时,产生的程序叫做结构化程序。
        我们可以用伪代码的形式建立算法的结构。伪代码是 MATLAB 和文字的混合体。和MATLAB 一样,它是结构化的,一行表达一个明确的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。伪代码的每一行都应用普通简单且易于理解的英语或中文描述。因为修改简单灵活,所以伪代码在开发算法的过程中非常的有用。因为伪代码给编辑器或字处理器 ( 通常用于编写 MATLAB 程序 )的,而不需要其他的可视化功能。例如下面是 一个算法伪代码
提示用户输入华氏温度值
读取华氏温度值并存储在变量temp_f中
将华氏温度值转换为开尔文温度值并存储在变量temp_k中
写出转换后的开尔文温度值
        注意用向左指的箭头←替代等号(=)指出一个值将存储到对应的变量中,这样就避免了赋值号与等号的混淆。在把它们转化为 MATLAB 代码之前,伪代码将有助于你思想的组织。

相关文章:

(转载)从0开始学matlab(第10天)—自顶向下的编程思想

在前面的内容中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果&a…...

mapreduce技术

要实现操作hbase数据表首先要了解它的原理: 1,Hbase原理篇 HBASE就是基于Hadoop的一个开源项目,也是对Google的BigTable的一种实现。 BigTable最浅显来看就是一张很大的表,表的属性可以根据需求去动态增加,但是又没有表与表之间…...

AI智慧安监视频平台EasyCVR视频出现不能播放的情况排查与解决

EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码、平台级联等功能。 有用户反…...

嵌入式学习之Linux驱动(第九期_设备模型_教程更新了)_基于RK3568

驱动视频全新升级,并持续更新~更全,思路更科学,入门更简单。 迅为基于iTOP-RK3568开发板进行讲解,本次更新内容为第九期,主要讲解设备模型,共计29讲。视频选集 0.课程规划 06:35 1.抛砖引玉-设备模型…...

LeetCode662.设计循环队列||4种方法实现

目录 题目 思路1(链表) 代码 思路2(数组) 代码 题目 题目要求的队列需要实现的功能有 ①Creat---设置队列长度 ②Front---获取队列头 ③Rear---获取队列尾 ④en----插入元素 ⑤de---删除元素 ⑥empty---判空 ⑦full---判满 思路1(链表) 🔍普通队列长度没有限制&…...

人工智能专栏第十二讲——依存解析

依存句法分析是一种自然语言处理技术,其目的是识别句子中单词之间的依赖关系。在自然语言处理中,依存句法分析是一项非常重要的任务,因为它可以帮助我们理解句子的语义结构,从而更好地进行文本分析、信息抽取、语音识别等任务。 …...

nest日志包pino、winston配置-懒人的折腾

nest日志 三种node服务端日志选型 winstonpinolog4js 2023年5月23日 看star数:winston > pino > log4js 使用体验: pino 格式简洁,速度快,支持输入日志到任意数据库,日志暂无自动清理(可能是我…...

一文看懂增值税发票识别OCR:从技术原理到 API Java 示例代码接入

引言 增值税发票识别OCR API是一项重要的技术创新,它在如今信息化的商业环境中发挥着重要作用。通过利用该API,企业和机构能够实现增值税发票的自动化识别和信息提取,从而在财务管理、票据核对、报销流程等方面带来许多好处。 本文将详细介…...

消息队列对比

目录 什么是消息队列 常用的消息队列工具对比 1 、ActiveMQ 2 、RabbitMQ 3、Kafka 4、 RocketMQ 什么是消息队列 消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。通过消息队列&#xff0…...

Ceph对象存储的基本概念,使用以及优点

Ceph对象存储的基本概念,使用以及优点 Ceph是一种基于分布式架构的对象存储系统,它可以提供高可靠性、高扩展性和高性能的存储服务。这种存储系统可以用于处理大量的数据,例如大型数据库、云存储、视频流、图像数据等。Ceph对象存储系统的基…...

工业互联网UWB定位系统源码,支持自定义开发

工厂人员定位系统,采用UWB定位技术,通过在厂区内部署一定数量的定位基站,以及为人员、车辆、物资佩戴标签卡的形式,实时获取人员精确位置,精度高达10cm。 文末获取联系 工厂人员定位系统可实现物资/车辆实时定位&#…...

VIC模型教程

详情点击链接:RVIC模型融合实践技术应用及未来气候变化模型预测 一:VIC模型的原理与特点 1.VIC模型各模块的主要原理 2.VIC模型的特点及优势 3.VIC模型的适用范围及其限制 4.VIC模型主要输入和输出文件解析案例一 :基于QGIS的VIC模型建模…...

软件著作权容易搞吗?

没有代码、材料,只有一个软件名字就能拿证,你说容易不… 当然这是对我们软著一级代理来说,每年申请下证几千个软著。下面说说下证要点给大家避坑。人群覆盖高新企业、大学生、大学老师、互联网公司。 软件著作权想要轻松下证,必…...

Mac打出特殊字符

optionq:œ ---------optionw:∑ optione: ---------optionr: optiont:† ---------optiony: optionu: ---------optionI:无 optiono: ---------optionP:π o…...

java设计模式之单例设计模式的前世今生

单例设计模式是什么? 单例设计模式是一种创建型模式,它保证一个类只有一个实例,并且该实例提供了全局访问点。这意味着即使在不同的地方,访问这个单例实例的代码得到的都是同一个对象。 单例模式的特点如下: - 保证…...

小航助学2023年3月GESP_C++一级试卷(含题库答题软件账号)

GESP在线模拟训练系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 答案:B 第1题以下不属于计算机输入设备的有( )。 A、键盘B、音箱C、鼠标D、传感器 …...

好程序员:女生学Java好学吗?女生学Java有什么优势?

小源经常会听到女生咨询适不适合学习Java开发的问题,提出这种问题归根结底还是缺乏性别自信,默认女性比男性弱。实际上这个问题并不存在,男女平等才是正确的思维,当然,也为了解开女生们的心结,这里好程序员…...

为Eclipse安装lombok插件

原生的Eclipse没有lombok插件,即使项目引入了lombok依赖也无法正常使用Data等常用标签。下面介绍一下如何手动为Eclipse添加lombok插件,具体操作步骤如下: (1)打开Download地址,点击页面中间的超链接下载最…...

spring-boot 实现接口转发服务,同时支持get 和 post等多种请求

spring-boot 实现接口转发服务,同时支持get 和 post等多种请求 (1)新建类:ProxyController.java package com.taobao.product.controller;import com.taobao.framework.HttpResult; import io.swagger.annotations.Api; import …...

About JDKFlightRecorder--人工翻译

JFR是什么 JDK Flight Recorder是一个工具,用于收集有关JVM以及在JVM上运行的Java程序的诊断和分析数据。 集成到Java虚拟机(JVM)中,使用默认设置时,性能影响小于1%。几乎不产生性能开销,因此即使在负载很…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...