计算机在某种程度上可以像人类一样完成条件判断——根据不同的条件,执行不同的操作。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
语句的使用很灵活,除了if
,end
是必须的,elseif
和else
都不是必须的。
if 语句的执行顺序是从上到下的,如果当前的逻辑表达式为false
,就进入下一个逻辑表达式的判断,直到遇到某个逻辑表达式的值为true
,就执行该逻辑表达式后面的“动作”并忽略后面的所有elseif
和else
。
大家可以试着给出不同的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 %
. 那个%
所处的位置是我要用真正的score
和rank
去替换的。
占位符%
,不仅可以指定输出位置,还可以指定输出格式。使用%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 函数格式化输出结果。