Matlab分支语句和编程设计_第1页
Matlab分支语句和编程设计_第2页
Matlab分支语句和编程设计_第3页
Matlab分支语句和编程设计_第4页
Matlab分支语句和编程设计_第5页
已阅读5页,还剩64页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 2021年8月7日第1页 第第4讲讲 分支语句和编程设计分支语句和编程设计 MATLAB R2010a 基础教程基础教程 清华大学出版社清华大学出版社 自上而下的编程方法简介 关系运算符和逻辑运算符 选择结构(分支语句) MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l在前面的章节中,我们开发了几个完全运转的在前面的章节中,我们开发了几个完全运转的MATLAB程序。但是程序。但是 这些程序都十分简单,包括一系列的这些程序都十分简单,包括一系列的MATLAB语句,这些语句按照语句,这些语句按照

2、固定的顺序一个接一个的执行。像这样的程序我们称之固定的顺序一个接一个的执行。像这样的程序我们称之顺序结构程序顺序结构程序。 它首先它首先读取输入,然后运算得到所需结果,打印出结果,并退出读取输入,然后运算得到所需结果,打印出结果,并退出。至。至 于要多次重复运算程序的某些部分是没有办法的,也不能根据输入的于要多次重复运算程序的某些部分是没有办法的,也不能根据输入的 值,有选择地执行程序的某些部分。值,有选择地执行程序的某些部分。 l在下面的两章中,将向大家介绍大量的在下面的两章中,将向大家介绍大量的MATLAB语句,这些语句允语句,这些语句允 许我们来许我们来控制语句的执行顺序控制语句的执行顺

3、序。有两大类控制顺序结构:。有两大类控制顺序结构:选择结构选择结构, 用选择执行特定的语句;用选择执行特定的语句;循环结构循环结构,用于重复执行特定部分的代码。,用于重复执行特定部分的代码。 循环结构我们将会在下节课讨论。循环结构我们将会在下节课讨论。 l随着选择和循环介绍,我们的程序也将变得复杂,对于解决问题来说,随着选择和循环介绍,我们的程序也将变得复杂,对于解决问题来说, 将会变得简单。为了帮助大家避免在编程过程中出现大量的错误,我将会变得简单。为了帮助大家避免在编程过程中出现大量的错误,我 们将向大家介绍正式的编程步骤,们将向大家介绍正式的编程步骤,即自上而下的编程方法即自上而下的编程

4、方法。我们也会。我们也会 向大家介绍一些普通的算法开发工具即伪代码。向大家介绍一些普通的算法开发工具即伪代码。 2021年8月7日第2页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 一一 自上而下的编程方法简介自上而下的编程方法简介 l当遇到一个新问题时,我们的心里会自然而然的产生这样的想法:马当遇到一个新问题时,我们的心里会自然而然的产生这样的想法:马 上坐在计算机前,开始编程,而不用浪费大量的时间思考我们所要解上坐在计算机前,开始编程,而不用浪费大量的时间思考我们所要解 决的问题是什么?决的问题是什么?用这种不切实际的想法来编一些非常小的程序可能用这种不切实际

5、的想法来编一些非常小的程序可能 会成功会成功。但在现实中,问题可能会非常的大,程序员再用这种方法编。但在现实中,问题可能会非常的大,程序员再用这种方法编 程将会陷入困境。程将会陷入困境。对于一个大的程序来说对于一个大的程序来说,在编写代码之前你要通盘,在编写代码之前你要通盘 的思考你所要面临的问题和解决的方法。在本节中,我们将向大家介的思考你所要面临的问题和解决的方法。在本节中,我们将向大家介 绍正式的编程设计步骤,然后应用这个步骤来编写所有的大的应用程绍正式的编程设计步骤,然后应用这个步骤来编写所有的大的应用程 序。对于我们所遇到一些简单的例子来说,这个步骤好像有些画蛇添序。对于我们所遇到一

6、些简单的例子来说,这个步骤好像有些画蛇添 足。但是当我们解决的问题变得越来越大的时侯,这个步骤将会变得足。但是当我们解决的问题变得越来越大的时侯,这个步骤将会变得 异常重要。异常重要。 2021年8月7日第3页 假设你是在工厂工作的工程师,为了解决某假设你是在工厂工作的工程师,为了解决某 些问题,你要编写一个程序。你如何开始呢?些问题,你要编写一个程序。你如何开始呢? MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l工作中遇到的大多数困难都是对所要解决问题的理解。一工作中遇到的大多数困难都是对所要解决问题的理解。一 旦你真正理解了问题,你就会把这个问题分解成许多小的

7、旦你真正理解了问题,你就会把这个问题分解成许多小的 问题,更加易于管理的小块,然后逐一解决某一个小块。问题,更加易于管理的小块,然后逐一解决某一个小块。 自上而下的编程方法是我们正规编程设计的基础自上而下的编程方法是我们正规编程设计的基础。我们现。我们现 在向大家介绍这些在下图中说明的步骤细节。步骤如下在向大家介绍这些在下图中说明的步骤细节。步骤如下: 2021年8月7日 第4页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 2021年8月7日第5页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 1.清晰地陈述你所要解决的问题清晰地陈述你

8、所要解决的问题 l编写的程序大多数情况下要满足一些感觉上的需要,但这种需要不一编写的程序大多数情况下要满足一些感觉上的需要,但这种需要不一 定能够被人清晰地表达出来。例如,定能够被人清晰地表达出来。例如,用户需要一个解线性方程组的表用户需要一个解线性方程组的表 达式达式。像这样的要求就不够清楚,程序员就很难编出一个使他满意的。像这样的要求就不够清楚,程序员就很难编出一个使他满意的 程序。他必须弄清楚要有多少问题需要解决程序。他必须弄清楚要有多少问题需要解决?在这些方程式中有没有对在这些方程式中有没有对 称的形式使我们的开发变得简单称的形式使我们的开发变得简单?程序设计者必须和使用者讨论所需的程

9、序设计者必须和使用者讨论所需的 程序,他们必须要对完成的任务有一个精确细致的描述。对问题清晰程序,他们必须要对完成的任务有一个精确细致的描述。对问题清晰 的描述可以防止误解,并且能够帮助程序员合理的组织他的思想。上的描述可以防止误解,并且能够帮助程序员合理的组织他的思想。上 面的例子对问题合适的陈述应为面的例子对问题合适的陈述应为: l设计一个用于解决联立线性方程组的程序,这些方程中未知数的系数设计一个用于解决联立线性方程组的程序,这些方程中未知数的系数 为实数,最多有为实数,最多有20个未知数。个未知数。 2021年8月7日第6页 MATLAB R2010a基础教程基础教程 清华大学出版社清

10、华大学出版社 2.定义程序所需的输入量和程序所产生的输出量定义程序所需的输入量和程序所产生的输出量 l指定输入量和输出量指定输入量和输出量,只有这样新的程序才能适应全过程,只有这样新的程序才能适应全过程 计划。在这个例子中方程式的系数可能有其预先存在的顺计划。在这个例子中方程式的系数可能有其预先存在的顺 序,我们的新程序必须能按照顺序读取它们。相似地,也序,我们的新程序必须能按照顺序读取它们。相似地,也 需要产生出这个程序所要求的结果,即输出量,我们还要需要产生出这个程序所要求的结果,即输出量,我们还要 以一定的格式打印出来。以一定的格式打印出来。 2021年8月7日第7页 MATLAB R2

11、010a基础教程基础教程 清华大学出版社清华大学出版社 3.设计你的程序得以实现的算法设计你的程序得以实现的算法 l算法是指为某个问题找到答案一步接一步的程序。算法是指为某个问题找到答案一步接一步的程序。在这个阶段自上而在这个阶段自上而 下的编程方法发挥了作用。编程设计者开始对这个问题进行下的编程方法发挥了作用。编程设计者开始对这个问题进行逻辑划分逻辑划分 ,把它逐步分解为一个又一个子工作。这个过程叫做分解,把它逐步分解为一个又一个子工作。这个过程叫做分解 (decomposition)。如果一些子工作还是比较大,设计者还可以把他。如果一些子工作还是比较大,设计者还可以把他 它分解成更小的块。

12、这个过程将会继续到问题被分解成许多简单且易它分解成更小的块。这个过程将会继续到问题被分解成许多简单且易 理解的小块为止。理解的小块为止。 l在问题被分解成小块之后,每一个小块要被进一步的求精,这个过程在问题被分解成小块之后,每一个小块要被进一步的求精,这个过程 叫做叫做逐步求精逐步求精(stepwise refinement)。在这个过程中,设计者开始。在这个过程中,设计者开始 于对本小块代码总括性的描述,然后开始一步一步地定义所需的函数于对本小块代码总括性的描述,然后开始一步一步地定义所需的函数 ,越来越具体,直到他能够转化为,越来越具体,直到他能够转化为MATLAB语句。逐步求精的过程语句

13、。逐步求精的过程 中,我们要用到的伪代码将会在下节为大家介绍。中,我们要用到的伪代码将会在下节为大家介绍。 l在算法开发过程中,这个方法是非常有用的。如果设计者真正理解了在算法开发过程中,这个方法是非常有用的。如果设计者真正理解了 解决问题这个些步骤,他将会对问题进行分解和逐步求精。解决问题这个些步骤,他将会对问题进行分解和逐步求精。 2021年8月7日第8页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 4.把算法转化为代码把算法转化为代码 l如果分解和逐步求精的过程已经顺利完成如果分解和逐步求精的过程已经顺利完成 ,那么这一步将会异常地简单。所有程序,那么这一步

14、将会异常地简单。所有程序 员都会将伪代码一句一句地转化为合适地员都会将伪代码一句一句地转化为合适地 MATLAB语句。语句。 2021年8月7日第9页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 5 检测产生的检测产生的MATLAB程序程序 l这一步是这一步是真正的拦路虎真正的拦路虎。首先,程序的每一部分将会被单独地检测,。首先,程序的每一部分将会被单独地检测, 如果有可能的话,整个程序还要被检测一遍。在我们检测程序时,我如果有可能的话,整个程序还要被检测一遍。在我们检测程序时,我 们必须证明所有合法输入数据值都能够正常运行。用标准的输入值检们必须证明所有合法输入

15、数据值都能够正常运行。用标准的输入值检 测程序,看它是否产生了值。如果在一个程序中执行的算法包含了不测程序,看它是否产生了值。如果在一个程序中执行的算法包含了不 同的分支,同的分支,你必须检测每一个分支,你必须检测每一个分支,以保证产生正确的答案。大程序以保证产生正确的答案。大程序 在交付大众使用之前,必须经过一系列地检测。在交付大众使用之前,必须经过一系列地检测。检测的第一步有时被检测的第一步有时被 称为单元检测称为单元检测(unit testing)。在单元检测过程中,程序的子程序将会。在单元检测过程中,程序的子程序将会 被独立地检测以证明它的正确性。当单元检测结束之后,这个程序将被独立地

16、检测以证明它的正确性。当单元检测结束之后,这个程序将 进行一系列的组合,把独立的子程序联合产生出最后的程序。程序第进行一系列的组合,把独立的子程序联合产生出最后的程序。程序第 一步的联合通常只包括很少的子程序。通过组合这些子程序,经常用一步的联合通常只包括很少的子程序。通过组合这些子程序,经常用 于检查子程序或函数之间的联系。在一系列地组合过程中,越来越多于检查子程序或函数之间的联系。在一系列地组合过程中,越来越多 的子程序被加了进来,直到整个程序的完成。的子程序被加了进来,直到整个程序的完成。在每一次组合的过程中在每一次组合的过程中 ,每一个错误都会被发现并在进行下一次组合之前纠正过来。,每

17、一个错误都会被发现并在进行下一次组合之前纠正过来。 2021年8月7日第10页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l在整个程序被组合之后,调试继续进行。程序第一个版本在整个程序被组合之后,调试继续进行。程序第一个版本 我们通常称之为我们通常称之为“alpha版本版本”。程序员和其他有机会接。程序员和其他有机会接 近它的人可以想尽一切办法应用它,以发现其中的漏洞,近它的人可以想尽一切办法应用它,以发现其中的漏洞, 然后改正之。当许许多多大的错误从程序中去除,一个新然后改正之。当许许多多大的错误从程序中去除,一个新 的版本出现了,我们称之的版本出现了,我们称

18、之“beta版本版本”。beta版本就要公版本就要公 开地发行给天天需要这个程序工作的人。这些用户使这个开地发行给天天需要这个程序工作的人。这些用户使这个 程序在不同的环境下,在不同的输入条件下工作,会发现程序在不同的环境下,在不同的输入条件下工作,会发现 许多的错误,并报告给程序员。当这些错误被更正后,这许多的错误,并报告给程序员。当这些错误被更正后,这 个程序就能够发行给公众使用了。因为我们现在一般接触个程序就能够发行给公众使用了。因为我们现在一般接触 的程序都比较小,没有必要进行上述的大规模的检测。但的程序都比较小,没有必要进行上述的大规模的检测。但 是我们会遵循基本的调试原则。是我们会

19、遵循基本的调试原则。 2021年8月7日第11页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 大程序典型地调试过程大程序典型地调试过程 2021年8月7日第12页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 程序设计的基本步骤程序设计的基本步骤: l1.清晰地陈述出你要解决的问题。清晰地陈述出你要解决的问题。 l2.确定程序所需地输入量和程序所产生的输确定程序所需地输入量和程序所产生的输 出量。出量。 l3.为你的程序设计算法为你的程序设计算法 l4.将算法转化为将算法转化为MATLAB语句语句 l5.调试调试MATLAB程序程序 2

20、021年8月7日第13页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l在大的编程项目中,在大的编程项目中,花在编程序的时间是出奇的少花在编程序的时间是出奇的少。Frederick P Brooks在他的在他的the Mythical ManMonth书中写道,对于大的软件工书中写道,对于大的软件工 程来说,程来说,三分之一的时间花在计划如何来做上三分之一的时间花在计划如何来做上(第一步到第三步第一步到第三步),六,六 分之一的时间花在编写程序上,近一半的时间用来调试程序。分之一的时间花在编写程序上,近一半的时间用来调试程序。而我们而我们 能做的只有压缩调试用的时

21、间。在计划阶段做好充分的准备和在编程能做的只有压缩调试用的时间。在计划阶段做好充分的准备和在编程 过程使用良好的编程习惯,这样会大大降低我们调试所用的时间。过程使用良好的编程习惯,这样会大大降低我们调试所用的时间。好好 的编程习惯能减少出错的数量,也能使别人迅速地找出其中的错误。的编程习惯能减少出错的数量,也能使别人迅速地找出其中的错误。 2021年8月7日第14页 好的编程习惯 遵循上面的步骤编写可靠,易理解的MATLAB程序。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 二二 伪代码的应用伪代码的应用 l作为我们设计步骤的一部分,描述出你要执行的算法是非常必要

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

23、l我们可以用伪代码的形式建立算法的结构。我们可以用伪代码的形式建立算法的结构。伪代码是伪代码是MATLAB和英和英 语的混合体。语的混合体。和和MATLAB一样,它是结构化的,一行表达一个明确一样,它是结构化的,一行表达一个明确 的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。 伪代码的每一行都应用普通简单且易于理解的英语或中文描述伪代码的每一行都应用普通简单且易于理解的英语或中文描述。因为。因为 修改简单灵活,所以伪代码在开发算法的过程中非常的有用。因为伪修改简单灵活,所以伪代码在开发算法的过程中非常的有用。因为伪 代码

24、给编辑器或字处理器代码给编辑器或字处理器(通常用于编写通常用于编写MATLAB程序程序)的,而不需要的,而不需要 其他的可视化功能。例如下面是例子的算法伪代码其他的可视化功能。例如下面是例子的算法伪代码 2021年8月7日第15页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l例(温度转换)设计一个例(温度转换)设计一个MATLAB程序,读取一个华氏程序,读取一个华氏 温度的输入,输出开尔文温度。温度的输入,输出开尔文温度。 l华氏温度和开尔文温度的转换关系式可在物理学课本中找华氏温度和开尔文温度的转换关系式可在物理学课本中找 到。其关系式为:到。其关系式为: l

25、 2021年8月7日第16页 15.2730 .32)( 9 5 )( 摄氏度开尔文TT MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l注意用向左指的箭头注意用向左指的箭头替代等号替代等号(=)指出一个值将存储到指出一个值将存储到 对应的变量中,这样就避免了赋值号与等号的混淆。在把对应的变量中,这样就避免了赋值号与等号的混淆。在把 它们转化为它们转化为MATLAB代码之前,伪代码将有助于你思想代码之前,伪代码将有助于你思想 的组织。的组织。 2021年8月7日第17页 lPrompt user to enter temperature in degrees Fah

26、renheit lRead temperature in degrees Fahrenheit(temp_f) ltemp_k in kelvins (5/9) * (temp_f 32) + 273.15 lWrite temperature in kelvins 我们设计程序的步骤如下 1.提示用户键入华氏温度值 2.读取输入值 3.通过关系式转换为开氏温度 4.输出结果,结束 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 三三 关系运算符和逻辑运算符关系运算符和逻辑运算符 l选择结构选择结构的运算由一个表达式控制的,这个的运算由一个表达式控制的,这个 表达式的

27、结果只有表达式的结果只有true(1)和和false(0)。有两。有两 种形式的运算符可以在种形式的运算符可以在MATLAB中关系得中关系得 到到true/false:关系运算符和逻辑运算符关系运算符和逻辑运算符。 l跟跟C语言一样,语言一样,MATLAB没有布尔型和逻辑没有布尔型和逻辑 数据类型。数据类型。MATLAB把把0值作为结果值作为结果false, 把所有的非把所有的非0值作为结果值作为结果ture。 2021年8月7日第18页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 1 关系运算符关系运算符 l关系运算符关系运算符是指两是指两数值或字符操作数数值或

28、字符操作数的运算符,的运算符, 这种运算将会根椐两操作数的关系产生结果这种运算将会根椐两操作数的关系产生结果true 或或false。关系运算的基本形式如下。关系运算的基本形式如下 la1 op a2 l其中其中a1和和a2是算术表达式,变量或字符串,是算术表达式,变量或字符串,op代代 表中的关系运算符中的一个。表中的关系运算符中的一个。 l如果两者的关系为真(如果两者的关系为真(true)时,那么这个运算)时,那么这个运算 将会返回将会返回1值;否则将会返回值;否则将会返回0值。值。 2021年8月7日第19页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 关系

29、运算符关系运算符 运算符运算 =等于 =不等于 大于 =大于或等于 小于 =小于或等于 2021年8月7日第20页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l下面是一些关系运算和它的结果运算结果下面是一些关系运算和它的结果运算结果 l3 4 l3 4 l4 = 4 lA b将会产生结果将会产生结果 l 2021年8月7日第22页 12 01 a 10 01 l关系运算符也可比较两个关系运算符,只要两个数组具有相同关系运算符也可比较两个关系运算符,只要两个数组具有相同 的大小。的大小。 12 20 b 表达式表达式a=b将会产生结果将会产生结果 11 01 如果

30、这个数组具有不同的大小,那如果这个数组具有不同的大小,那 么将会产生运行时错误。么将会产生运行时错误。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l注意注意因为字符串实际上是字符的数组,关系运算符也比较两个因为字符串实际上是字符的数组,关系运算符也比较两个相同长相同长 度度的字符串。的字符串。如果它们有不同的长度,比较运算将会产生一个错误如果它们有不同的长度,比较运算将会产生一个错误。 等于关系运算符等于关系运算符由两个等号组成,而由两个等号组成,而赋值运算符赋值运算符只有一个等号。它们只有一个等号。它们 是完全不同的两个符号,初学者极易混淆。符号是完全不同的两

31、个符号,初学者极易混淆。符号=是一个比较运算符是一个比较运算符 ,返回一个逻辑数,而符号,返回一个逻辑数,而符号=是将等号右边的表达式的值赋给左边的是将等号右边的表达式的值赋给左边的 变量。当进行比较运算的时候,初学者经常用误用符号变量。当进行比较运算的时候,初学者经常用误用符号=。 2021年8月7日第23页 常见编程错误 小心谨慎不要混淆了等于关系运 算符(=)和赋值运算符(=)。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l在运算的层次中,在运算的层次中,关系运算在所有数学运关系运算在所有数学运 算的之后进行算的之后进行。所以下面两个表达式是等。所以下面两

32、个表达式是等 价的,均产生结果价的,均产生结果1。 l7 + 3 2 + 11 l(7 + 3) a = 0; l b = sin(pi); l a = b lans = l 0 lMATLAB报告了报告了a和和b不同因为他产生了一个不同因为他产生了一个round off错误,在计算错误,在计算 中中sin(pi)产生了结果产生了结果1.22461016而不是而不是0。两个理论上相等的值因。两个理论上相等的值因 为为round off错误而使之发生了细微的差别。错误而使之发生了细微的差别。 2021年8月7日第26页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l

33、我们可以通过检测两数之间在一定的范围内是不是近似相等,在这个我们可以通过检测两数之间在一定的范围内是不是近似相等,在这个 精确范围内可能会产生精确范围内可能会产生round off错误。例如测试错误。例如测试 l abs(a b) =b将会产生结果将会产生结果 11 01 如果这个数组具有不同的大小,那如果这个数组具有不同的大小,那 么将会产生运行时错误。么将会产生运行时错误。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 2021年8月7日第32页 运算符 圆括号() 转置(.),共轭转置(),乘方(.),矩阵乘方() 逻辑非() 乘法(.*),矩阵乘法(*),右

34、除(./),左除(.),矩阵右除(/),矩阵左除() 加法(+),减法(-), 冒号运算符(:) 小于(),小于等于(),大于等于(=),等于(=),不等于(=) 数组逻辑与( lelseif (b2 4*a*c) = 0 l disp(This equation has two identical real roots.); lelse l disp(This equation has two distinct real roots.); lend 2021年8月7日第40页 回忆一下,判断为真时, 关系运算符将会返回一个 非0值,从而导致对应语 句的执行。 为增加程序的可读性,在 if结构

35、中的语句块中最好 缩进2到3个空格,而实 际上没有必要。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l你可以在一行内写完一个完整的你可以在一行内写完一个完整的if结构,只需把结构的每一部分后面加上结构,只需把结构的每一部分后面加上 l分号或逗号,所以下面的两个结构是等价的分号或逗号,所以下面的两个结构是等价的: lif x 0 l y = abs(x); lend l和和 lif x 0 x1 (-b + sqrt(discriminant) / (2*a) x2 (-b - sqrt(discriminant) / (2*a) Write msg that e

36、quation has two distinct real roots. Write out the two roots. elseif discriminant = 0 x1 -b / (2*a) Write msg that equation has two identical real roots. Write out the repeated roots. else real_part -b / (2*a) imag_part sqrt(abs(discriminant) / (2*a) Write msg that equation has two complex roots. Wr

37、ite out the two roots. end MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l4.把算法转化为把算法转化为MATLAB语言语言 l5.检测这个程序检测这个程序 l下一步,我们必须输入实数来检测这个程序。因这个程序下一步,我们必须输入实数来检测这个程序。因这个程序 有三个可能的路径。所以在我们确信每一人路径都工作正有三个可能的路径。所以在我们确信每一人路径都工作正 常之前,必须把这三个路径检测一遍。从式子中,我们可常之前,必须把这三个路径检测一遍。从式子中,我们可 以有用下面的方法来验证程序的正确性。以有用下面的方法来验证程序的正确性。 lx2

38、 + 5x + 6 = 0 x = 2, and x = =3 lx2 + 4x + 4 = 0 x = 2 lx2 + 2x + 5 = 0 x = 1 i2 2021年8月7日第44页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l编写一个程序,求以编写一个程序,求以x,y为自变量函数为自变量函数f(x,y)的值。函的值。函 数数f(x,y)的定义如下的定义如下: 2021年8月7日第45页 根据自变量x和y的正负符号的不同,而采取不同的求值表达式。为选取合适的表达 式,检查用户输入的x,y的正负符号是必要的。 1.陈述问题陈述问题 这个问题的陈述非常简单:根

39、据用户输入的x,y,求函数f(x,y)的值。 2.确定输入输出量确定输入输出量 程序的输入量为函数的自变量x,y。输出量为函数值f(x,y)。 3.设计算法这个问题可以把他分解成三个大块,即输入,计算过程,和输出。设计算法这个问题可以把他分解成三个大块,即输入,计算过程,和输出。 我们把这三大块再分解成小的,精细的工作。在计算f(x,y)时,我们有4种选择, 选哪一种取决于x,y的值。所以逻辑上我们要用4个选择的if结构来实现。产生的 伪代码如下: MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 lPrompt the user for the values x an

40、d y lRead x and y lif x0 and y0 l fun x + y lelseif x0 and y0 l fun x + y2 lelseif x 0 l . l if y 0 l . l end l . lend 2021年8月7日第48页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 lMATLAB翻译器经常把把已知的翻译器经常把把已知的end语句和它最近的语句和它最近的if语句联合在一语句联合在一 起起,所以第一个,所以第一个end语句和语句和if y0最接最接 近。对于一个编写正确的程序,它能工作正常。但如果程序员编写出近。对于一个编写

41、正确的程序,它能工作正常。但如果程序员编写出 错误,它将会使编译器出现混淆性错误信息提示。例如,假设我们编错误,它将会使编译器出现混淆性错误信息提示。例如,假设我们编 写一个大的程序,包括如下的一个结构写一个大的程序,包括如下的一个结构: l. lif (test1) l . l if (test2) l . l if (test3) l . l end l . l end l . lend 2021年8月7日第49页 这个程序包括了三个嵌套的这个程序包括了三个嵌套的if结构,在这个结构结构,在这个结构 中可能有上千行的代码。现在假设第一个中可能有上千行的代码。现在假设第一个end在在 编辑区

42、域突然被删除,那么编辑区域突然被删除,那么MATLAB编译器将会编译器将会 自动将第二个自动将第二个end与最里面的与最里面的if (test3)结构联合结构联合 起来,第三个起来,第三个end将会和中间的将会和中间的if(test2)联合起联合起 来。当编译器翻译到达文件结束的时候,那将发来。当编译器翻译到达文件结束的时候,那将发 现第一个现第一个if(test1)结构将永远没有结束,然后编结构将永远没有结束,然后编 译器就会产生一个错误提示信息,即缺少一个译器就会产生一个错误提示信息,即缺少一个 end。但是,它不能告诉你问题发生在什么地方,但是,它不能告诉你问题发生在什么地方, 这就使我

43、们必须回过头去看整个程序,来找问题这就使我们必须回过头去看整个程序,来找问题。 在大多数情况下,执行一个算法,即可以用多个在大多数情况下,执行一个算法,即可以用多个 else if语句,也可以用语句,也可以用if语句的嵌套。在这种情语句的嵌套。在这种情 况下,大家可以选择自己喜欢的方式况下,大家可以选择自己喜欢的方式。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l例例 l给出等级分数给出等级分数 l假设我们要编写一个程序,输入一个数值分数,输出等级假设我们要编写一个程序,输入一个数值分数,输出等级 分数,即是分数,即是A级,级,B级和级和C级级 l grade

44、95A l95 grade 86 B l86 grade 76 C l76 grade 66 D l66 grade 0F l用两种方式写出这个程序,第一种方式用多个用两种方式写出这个程序,第一种方式用多个elseif语句语句 ,第二种方式用,第二种方式用if的嵌套。的嵌套。 2021年8月7日第50页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 (a)用多个用多个elseif语句语句 if grade 95.0 disp(The grade is A.); elseif grade 86.0 disp(The grade is B.); elseif grade

45、 76.0 disp(The grade is C.); elseif grade 66.0 disp(The grade is D.); else disp(The grade is F.); end 2021年8月7日第51页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l(b)用用if嵌套结构嵌套结构 lif grade 95.0 l disp(The grade is A.); lelse l if grade 86.0 l disp(The grade is B.); l else l if grade 76.0 l disp(The grade is

46、C.); l else l if grade 66.0 l disp(The grade is D.); l else l disp(The grade is F.); l end l end l end lend 2021年8月7日第52页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l从上面的例子中,我们可以看到如果有多个选项的话,在从上面的例子中,我们可以看到如果有多个选项的话,在 一个一个if结构中用到多个结构中用到多个else if语句将会比语句将会比if的嵌套结构简单的嵌套结构简单 的多。的多。 2021年8月7日第53页 好的编程习惯好的编程习惯 对

47、于有许多选项的选择结构来说,最好对于有许多选项的选择结构来说,最好 在一个在一个if结构中使用多个结构中使用多个elseif语句,尽语句,尽 量不用量不用if的嵌套结构。的嵌套结构。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 4 switch结构结构 lswitch结构是另一种形式的选择结构。程序员可以根据一结构是另一种形式的选择结构。程序员可以根据一 个单精度整形数,字符或逻辑表达式的值来选择执行特定个单精度整形数,字符或逻辑表达式的值来选择执行特定 的代码语句块。的代码语句块。 2021年8月7日第54页 如果如果switch_expr的值与的值与case_

48、expr_1相符,那么相符,那么 第一个代码块将会被执行,然后程序将会跳到第一个代码块将会被执行,然后程序将会跳到 switch结构后的第一个语句。如果结构后的第一个语句。如果switch_expr的的 值与值与case_expr_2相符,那么第二个代码块将会被相符,那么第二个代码块将会被 执行,然后程序将会跳到执行,然后程序将会跳到switch结构后的第一个语结构后的第一个语 句。在这个结构中,用相同的方法来对待其他的情句。在这个结构中,用相同的方法来对待其他的情 况。况。otherwise语句块是可选的。如果它存在的话,语句块是可选的。如果它存在的话, 当当switch_expr的值与其他

49、所有的选项都不相符时,的值与其他所有的选项都不相符时, 这 个 语 句 块 将 会 被 执 行 。 如 果 它 不 存 在 , 且这 个 语 句 块 将 会 被 执 行 。 如 果 它 不 存 在 , 且 witch_expr的值与其他所有的选项都不相符,那么的值与其他所有的选项都不相符,那么 这个结构中的任何一个语句块都不会被执行。这种这个结构中的任何一个语句块都不会被执行。这种 情况下的结果可以看作没有选择结构,直接执行情况下的结果可以看作没有选择结构,直接执行 MATLAB语言。语言。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l如果说如果说switch_

50、expr有很多值可以导致相同代码的执行,有很多值可以导致相同代码的执行, 那么这些值可以括在同一括号内,如下所示。如果这个那么这些值可以括在同一括号内,如下所示。如果这个 switch表达式和表中任何一个表达式相匹配,那么这个语表达式和表中任何一个表达式相匹配,那么这个语 句块将会被执行。句块将会被执行。 2021年8月7日第55页 switch_expr和每一个case_expr既可以是 数值,也可以是字符值。 注意在大多情况下只有一个语句块会被执 行。当一个语句块被执行后,编译器就会 跳到end语句后的第一个语句开始执行。如 果switch表达和多个case表达式相对应, 那么只有他们中的

51、第一个将会被执行。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l让我们看一个简单的关于让我们看一个简单的关于switch结构的例子。下面的语句用来判断结构的例子。下面的语句用来判断1 到到10之间的数是奇数还是偶数。它用来说明一系列的之间的数是奇数还是偶数。它用来说明一系列的case选项值的选项值的 应用和应用和otherwise语块的应用。语块的应用。 lswitch (value) lcase 1, 3, 5, 7, 9, l disp(The value is odd.); lcase 2, 4, 6, 8, 10, l disp(The value is

52、 even.); lotherwise, l disp(The value is out of range.); lend 2021年8月7日第56页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 5 try/catch结构的应用结构的应用 ltry/catch结构是选择结构的一种特殊形式结构是选择结构的一种特殊形式 ,用于捕捉错误。一般地,当一个,用于捕捉错误。一般地,当一个 MATLAB程序在运行时遇到了一个错误,程序在运行时遇到了一个错误, 这个程序就会中止执行。这个程序就会中止执行。try/catch结构修结构修 改了这个默认行为。改了这个默认行为。 l如果

53、一个错误发生在这个结构的如果一个错误发生在这个结构的try语句块语句块 中,那么程序将会执行中,那么程序将会执行catch语句块,程序语句块,程序 将不会中断。它将帮助程序员控制程序中将不会中断。它将帮助程序员控制程序中 的错误,而不用使程序中断。的错误,而不用使程序中断。 2021年8月7日第57页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 Try/catch结构的基本形式如下结构的基本形式如下: 2021年8月7日第58页 当程序运行到当程序运行到try/catch语句块,在语句块,在try语句块中的语句块中的 一些语句将会被执行。如果没有错误出现,一些语句

54、将会被执行。如果没有错误出现,catch 语句块将会被跳过。另一方面,如果错误发生在一语句块将会被跳过。另一方面,如果错误发生在一 个个try语句块,那么程序将中止执行语句块,那么程序将中止执行try语句块,并语句块,并 立即执行立即执行catch语句块。语句块。 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l下面有一个包含下面有一个包含try/catch结构程序。它能结构程序。它能 创建一个数组,并询问用户显示数组中的创建一个数组,并询问用户显示数组中的 哪一个元素。用户提供一个下标,那么这哪一个元素。用户提供一个下标,那么这 个程序将会显示对应的数组元素,个程

55、序将会显示对应的数组元素,try语句语句 块一般会在这个程序中执行,只有当块一般会在这个程序中执行,只有当try语语 句块执行出错,句块执行出错,catch语句块将会发生错误语句块将会发生错误 。 2021年8月7日第59页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l% Initialize array la = 1 3 2 5; ltry l % Try to display an element l index = input(Enter subscript of element to display: ); l disp(a( int2str(index

56、) ) = num2str(a(index) ); lcatch l % If we get here an error occurred l disp( Illegal subscript: int2str(index) ); lend l这个程序的执行结果如下:这个程序的执行结果如下: l try_catch lEnter subscript of element to display: 3 la(3) = 2 l try_catch lEnter subscript of element to display: 8 lIllegal subscript: 8 2021年8月7日第60页

57、MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 五五 程序调试的进一步说明程序调试的进一步说明 l在含有选择结构和循环结构的程序出错的概率要比只含简在含有选择结构和循环结构的程序出错的概率要比只含简 单的顺序结构的程序出错的概率大得多。在完成了程序设单的顺序结构的程序出错的概率大得多。在完成了程序设 计的步骤之后,无论多大的一个程序,在第一次运行时都计的步骤之后,无论多大的一个程序,在第一次运行时都 很难通过。假如我们创建了一个程序并调试它,只发现这很难通过。假如我们创建了一个程序并调试它,只发现这 个程序的输出是错误的。我们怎样找到这些错误并修改它个程序的输出是错误

58、的。我们怎样找到这些错误并修改它 呢呢? l一旦程序包含了循环和选择结构,找到错语的最好的方法一旦程序包含了循环和选择结构,找到错语的最好的方法 是应用是应用matlab支持的支持的符号调试器符号调试器(symbolic debugger)。 这个调试器将会整合到这个调试器将会整合到matlab编辑器中。编辑器中。 2021年8月7日第61页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l应用这个调试器,首先应该选择应用这个调试器,首先应该选择 “file/open”打开你在打开你在MATLAB命令窗口中命令窗口中 要调试的程序。当一个文件被打开,编辑要调试的程序

59、。当一个文件被打开,编辑 器就加载了这个文件,代码根据语法的不器就加载了这个文件,代码根据语法的不 同出现不同的颜色。在这个文件中评论显同出现不同的颜色。在这个文件中评论显 示为绿色,变量和数字显示为黑色,字符示为绿色,变量和数字显示为黑色,字符 串显示为红色,语言的关键字显示为蓝色串显示为红色,语言的关键字显示为蓝色 。 2021年8月7日第62页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 2021年8月7日第63页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l当一个程序执行时,我们想知道什么事情当一个程序执行时,我们想知道什么

60、事情 发生了。为了达到此目的,我们可以用鼠发生了。为了达到此目的,我们可以用鼠 标右击你所关心的行并选择标右击你所关心的行并选择”set/clear breakpoint”选项。当一个断点被设置后,选项。当一个断点被设置后, 一个红色的点将会出现在行的左边一个红色的点将会出现在行的左边 2021年8月7日第64页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 2021年8月7日第65页 MATLAB R2010a基础教程基础教程 清华大学出版社清华大学出版社 l一旦这些断点被设置,在命令窗口键入一旦这些断点被设置,在命令窗口键入calc_roots将会像往常一样执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论