分支结构——if语句
决策结构要求程序员应指定要由程序评估计算或测试的一个或多个条件,以及条件确定为真时要执行的语句或语句,如果条件被确定为假时,可选地如果执行其他语句。
MATLAB提供以下类型的决策语句。
语句 描述 if…end 语句 if ... end语句 包含一个布尔表达式,后跟一个或多个语句。 if…else…end 语句 if语句 可以跟随一个可选的else语句,当布尔表达式为false时,else语句块将执行。 if…elseif…elseif…else…end语句 if语句 后面可以有一个(或多个)可选elseif ...和一个else语句,这对于测试各种条件非常有用。 嵌套if语句 可以在一个if或elseif语句中使用另一个if或elseif语句。 switch语句 switch语句用来测试一个变量与值列表的相等性。 嵌套switch语句 可以在一个switch语句中使用一个switch语句。
一个if...end语句由一个if语句和一个布尔表达式组成,后跟一个或多个语句。它是由end语句分隔的语句块。
语法 在MATLAB中, if 语句的语法是
if <expression> <statements> end 如果表达式( expression )计算结果为 true ,则 if 语句中的代码块将被执行。如果表达式的计算结果为 false ,那么执行结束语句后的第一组代码。
流程图
例子 s= 70;if (s>=60) fprintf('恭喜,你这门课及格啦! \n' );end fprintf('你的分数是 : %d\n', s);
多if语句:
s= 70;if (s>=90) fprintf('你太优秀了,分数超过90了! \n' );end if (s>=60)&(s<90) fprintf('恭喜,你这门课及格啦! \n' );end if (s<60) fprintf('抱歉,你这门课不及格! \n' );end fprintf('你的分数是 : %d\n', s);
2. if...else...end语句(双分支)
if语句可以后跟一个可选的else语句,当该表达式为false时执行else语句中的代码。
语法 MATLAB中 if...else 语句的语法是
if <expression> <statement(1)> else <statement(2)> end
如果布尔表达式( expression )的值为 true ,那么 if 代码块将被执行,否则 else 代码块将被执行。
流程图
例子 s = 80;if s >= 60 fprintf('恭喜,你这门课及格啦! \n' ); else fprintf('抱歉,你这门课不及格! \n' ); end
课堂练习:给定一个年份,判断是否为闰年?
平年 每年365天 ,闰年 每年 366天。
闰年的定义:闰年分为 普通闰年 和世纪闰年 。
1、 普通闰年 :公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004、2020年就是闰年);
2、 世纪闰年 :公历年份是400的倍数是世纪闰年(如,2000年是世纪闰年,而1900年既不是普通闰年也不是世纪闰年,既1900年是平年)
总结:“四年一闰,百年不闰,四百年一闰”,年份满足条件(1)或 条件 (2),则为闰年。
(1)能被4整除且不能被100整除(如2004年是闰年,而1900年不是)
(2)能被400整除(如2000年是闰年)
补全下面代码:
year=1900;
if ?
fprintf('%d年是 闰年。\n',year)
else
fprintf('%d年 不是 闰年。\n', year)
end
因为月亮圆缺变化一次的周期大约是一个月。实际是29.5306天。
气候冷热变化一个周期是一年,或者365.2422天。但是这两者并不是整数关系,一除,一年是12.37个月。
因此历法上必须作出取舍。各种阳历和阴历的区别就在于,是以气候冷热变化一个周期作为一年更重要呢,还是月亮圆缺变化一个周期作为一个月更重要。
公历是典型的阳历,它的“月”抛弃了与月相变化的对应关系,把一年的长度较为精确地固定下来(最早是四年一闰,365.25天,后来加上百年不闰、四百年再闰,就是365.2425天了),把一年大致等分成12份作为12个月,再作一些微调。这样公历每月的日期和月相就脱离关系了,从月相没法得出今天是几号。
农历则是以阴历为主,每月的日期精确反映月相变化,抬头看到月亮就大概知道是初几了。但是既然要指导农耕,必须兼顾气候冷热变化,这样只能用闰月来调整。按19年7闰的置闰规则,一年是29.5306*(12*19+7)/19 = 365.2469天。但是每个月的具体日期和气候变化的时间还是会有前后十几天的偏差,所以需要节气这个更精确的工具来指导农时。节气直接反映了地球在公转轨道上的位置,属于纯粹的阳历。加上节气之后的农历就成了阴阳合历。 ps. 西方的十二星座对应的十二宫实际上和节气是严格对应的。
伊斯兰历则是纯阴历,一年定为12个月,不用闰月调整,因此他们的一年和其他历法的一年并不等长,隔两年多就会差一个月。因此伊斯兰历的斋月会出现在一年四季的任何一个季节。隔30多年就会差一年,因此一个六七十岁的阿拉伯老爷爷按其他地方的历法会少两岁。
3. if ... elseif ... elseif ... else ... end语句(多分支)
if语句后面可以有一个(或多个)可选elseif...和一个else语句,这对于测试各种条件非常有用。
当使用if...elseif...else语句时,请记住几点:
if可以有零个或一个else,它必须在elseif之后。
if 可以有零到多个 elseif ,它们必须在 else 语句之前。
当有一个elseif匹配成功,其余的elseif和else都不会被测试。
elseif相当于if,需要判断,是在一个if循环中的低一级的判断语句。 else也包含于该if循环,但无须再进行判断,
语法
if <expression 1> % Executes when the expression 1 is true <statement(1)> elseif <expression 2> % Executes when the boolean expression 2 is true <statement(2)> elseif <expression 3> % Executes when the boolean expression 3 is true <statement(3)> else % executes when the none of the above condition is true <statement(4)> end
例子 w=input('请输入你的体重(单位:斤) ') if w>170 fprintf('你该减肥啦...\n' ); elseif w>110 & w<=170 fprintf('体重正合适...\n' ); elseif w>40 & w<=110 fprintf('偏瘦,多吃点吧...\n' ); else fprintf('你在逗我玩么?\n' ); end
运行结果:
在MATLAB中,嵌套if-else语句是合法的,这意味着可以在一个if或elseif语句中使用另一个if或elseif语句。
语法 嵌套 if 语句的语法如下-
if <expression 1> if <expression 2> statement() end end 可以使用与嵌套if 语句相似的方式来合并elseif... 语句块。
例子 a = 100; b = 200; if (a==100) if (b == 200) fprintf('Value of a is 100 and b is 200\n' ); end end执行上面的示例代码,得到以下结果- Value of a is 100 and b is 200 %上述代码可以改为下面的:(不用嵌套) if (a==100)&(b == 200) fprintf('Value of a is 100 and b is 200\n' ); end
======================================
作业1.邮件地址切片器
目的: 编写一个脚本,可以从用户给出的 邮箱 地址中获取用户名和域名。
如果用户输入的邮箱不符合规则,则输出:邮箱格式有误。如果邮箱格式正确,则给出用户名和域名。
效果如下:
(1)如果输入的邮箱(需要单引号引住 )格式有误,即:帐号+@+域名 ,这三者缺少一个,则输出“邮箱格式有误!
(2)如果邮箱格式正确,则输出邮箱的账号和域名。
提示: 邮箱地址一般是帐号@域名的格式,就是帐号+@+域名 ,这三个部分组成。 可以使用@作为分隔符,将地址分为分为两个字符串。如果这三个部分,缺少任何一部分,则认为邮箱格式有误。 可以使用strfind()等函数,加上if判断,,以及判断数组是否为空的函数isempty( )等.
clear
s=input('请输入你的邮箱(email) :')
L= ? %得到字符串s的长度
num_at= ? %判断输入的字符串里面的“@”的数量num_at
k=strfind.... %通过strfind()函数得到“@”号在字符串s中的位置号k
if ? %如果“@”超过2个,或者等于0个,或者“@” 在开头,或者“@”在末尾
fprintf('邮箱格式有误!\n' );
else
s1= ? %把账号部分切片出来给s1
s2= ? %把域名部分切片出来给s2
fprintf('帐号为%s,域名为%s \n',s1,s2);
end