7 Matlab 条件判断与自定义输入输出

计算机在某种程度上可以像人类一样完成条件判断——根据不同的条件,执行不同的操作。Matlab 使用if语句实现条件判断。

if 语句

假如我需要判断一个学生的考试成绩是否合格,做法是这样的:如果分数score变量的值大于等于60分,就显示合格。下面是用if语句写的判断程序(请练习使用脚本编辑器写代码并运行)。

score = 70;
if score >= 60
    disp ('your score is ')
    disp (score)
    disp ('qualified!')
end

有几件事情需要注意:

  • if语句之后的那一行,需要缩进(一般是四个空格)。虽然
    Matlab 不像 python 语言那样强制要求缩进,但是,这就像写文章不分段一样,阅读体验非常差。一段两段的还好说,代码一长就没法看了。matlab 脚本编辑器自带自动缩进功能,可以省不少事情。
  • if语句必须以end结尾。
  • 示例程序中,if语句的执行顺序是:如果score >= 60这一逻辑表达式的值为true,就执行缩进的那三行disp语句,否则什么都不做.
  • disp中的字符串,当然可以使用中文。但是因为编码的问题,可能会遇到错误,如果遇到了,请记得排查是否使用了中文字符。

把这个程序改进一下,让score < 60的时候,也显示信息,而不是什么都不做。方法很简单,加一个else语句。

score = 58;
if score >= 60
    disp ('your score is ')
    disp (score)
    disp ('qualified!')
else 
    disp ('your score is ')
    disp (score)
    disp ('unqualified!')
end

else 是“其他”的意思,这段代码的条件判断,其实就两种情况:score >= 60和“其他”。显然,58符合“其他”这一条件,所以程序执行else后面的语句而不执行if后面的三个disp语句。

这个程序只能判断一个成绩是否合格,现实情况是要判断成绩的等级。比如,90分以上是“优”,75到90分是“良”,60到75分是“中”,60分以下是“差”。Matlab 提供了elseif用来做更多的判断。示例如下:

score = 58;
if score >= 90
    disp ('your score is ')
    disp (score)
    disp ('优')
elseif score >= 75
    disp ('your score is ')
    disp (score)
    disp ('良')
elseif score >= 60
    disp ('your score is ')
    disp (score)
    disp ('中')
else
    disp ('your score is ')
    disp (score)
    disp ('差')
end

现在,我们可以看到if语句的完整形式了:

if <逻辑表达式 1>
    <动作 1>
elseif <逻辑表达式 2>
    <动作 2>
.
.
.
elseif <逻辑表达式 n>
    <动作 n>
else
    <动作 n+1 >
end

if语句的使用很灵活,除了ifend必须的,elseifelse不是必须的。

if 语句的执行顺序是从上到下的,如果当前的逻辑表达式为false,就进入下一个逻辑表达式的判断,直到遇到某个逻辑表达式的值为true,就执行该逻辑表达式后面的“动作”并忽略后面的所有elseifelse

大家可以试着给出不同的score值,看看程序的输出结果,仔细理解和体会if语句的执行过程。

现在这个判断成绩等级的程序基本符合要求了,但还很麻烦,每执行一次判断都需要修改代码中 score 的赋值。disp的输出,看起来也很不美观。自定义输入输出就能解决这些问题。

input函数

input 函数可以从键盘接受用户的输入。help一下,可以了解到它的使用格式是input (PROMPT)或者input (PROMPT, 's'). 那个PROMPT是用户可以自定义的一个提示语,是字符串型的数据,需要用引号括起来的。

默认情况下,input接受数值型数据,可以是矩阵、表达式。也可以使用input (PROMPT, 's')这样的用法,让input接受string型数据。

不管哪种用法,接受到的输入都可以赋值给变量。看下面的例子:

>> score =  input ('Please Enter Your Score: ')
Please Enter Your Score: 59 + 20
score = 
      79
>> name = input ('What''s Your Name? ', 's')
What's Your Name? John
name = 
      'John'

上述命令行中,变量 score 和 name 分别从用户处获得了数值型数据79和 string 型数据John

有了这个东西,我们可以把判断学生成绩等级的程序修改一下,让它先等待用户输入成绩,然后作出判断。

score = input ('Please Enter Your Score: ');
if score >= 90
    disp ('your score is ')
    disp (score)
    disp ('优')
elseif score >= 75
    disp ('your score is ')
    disp (score)
    disp ('良')
elseif score >= 60
    disp ('your score is ')
    disp (score)
    disp ('中')
else
    disp ('your score is ')
    disp (score)
    disp ('差')
end

现在,这个程序可以反复运行了,不用每次判断成绩都修改代码。但是还有一个小麻烦,大家都知道成绩是 0 到 100 分的数字,可是有些用户他不按套路出牌,胡乱输入数据。怎么解决这个问题?大家可以试试。

我们现在解决另一个问题,就是那个disp的输出有点丑,我希望能看到这样的结果“你的成绩是:X,对应的成绩等级是:Y”。

格式化输出字符串,sprintf

Matlab 格式化输出字符串与其他的程序语言类似,也采用占位符%的办法。占位符有点像是图书馆占座。

今天我到图书馆以后就将三本书往三个位置上一扔,这三个座位就是有人占了。过了一会儿,我和其他两个室友分别找那三本书,去相应的位置上坐下来。

这里书就相当于占位符%,而真正去坐那个座位的人,可以看成是变量的值。

好了,现在我有两个变量分别是score和等级rank. 我要输出这样的字符串the score you entered is %, the rank is %. 那个%所处的位置是我要用真正的scorerank去替换的。

占位符%,不仅可以指定输出位置,还可以指定输出格式。使用%d这样的形式指定输出格式。这里的意思是在占位符位置输出一个整数。最常见的有三种格式:

  • %d, 十进制整数
  • %f, 浮点数,可以用类似%.2f的格式控制显示精度
  • %s, 字符串

所以,一个完整的格式化输出字符串应该是这样的:the score you entered is %d, the rank is %s, %d%s分别对应 score 和 rank,并指定了它们的数据类型:整数和字符串。

sprintf是 Matlab 用来完成格式化输出的一个函数。它的用法也很简单,把你要说的话写成字符串,然后把占位符对应的变量指顺序写出来就可以了。我们试试:

>> score = 78;
>> rank = 'qualified';
>> sprintf ('the score you entered is %d, the rank is %s', score, rank)
ans = 
    'the score you entered is 78, the rank is qualified'
>> floatnumber = 5.3456;
>> sprintf ('This is an example for output of float number: %.3f', floatnumber)
ans = 
    'This is an example for output of float number: 5.346'

最后,留个作业给大家:将判断学生成绩等级的程序修改一下,要求使用input 函数接受用户输入,如果输入的数据错误,需要给出相应的信息;使用 sprintf 函数格式化输出结果。

    原文作者:花生_毛豆
    原文地址: https://www.jianshu.com/p/cbd437b902cb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞