3.2 分支结构

3.2 分支结构

让我们从下面的编程做起,体会分支结构的流程。

【例3.2】需求:从键盘输入身高和体重,如果体重大于“(身高-100)×0.9”,就显示“为了健康,请注意体重”,如图1.3.2所示。

图1.3.2 例3.2图

【代码3.2】

代码3.2

注意if分支语句的语法规定:if是关键字,if后面的逻辑表达式要写在小括号中。如果条件为真,则执行后面的语句体;如果条件为假,则后面的语句体不执行。后面的语句体需要写在一对大括号中,如果语句体只有一个语句,也可以不写大括号,但是,在一般情况下,不管语句体中有多少条语句,都要写在一对大括号中。

【例3.3】需求:从键盘输入年龄,如果大于或等于18岁,就显示“成年人,要自重!”,否则,就显示“小朋友,长大你就知道啦!”,如图1.3.3所示。

图1.3.3 例3.3图

【代码3.3】

代码3.3

if-else两分支语句的语义是根据条件的真假进行两分支选择,例如,在代码3.3中,if和else是关键字,在第13行中,如果小括号中的条件为真,则执行第13行条件之后的语句体,如果条件为假,则执行第16行else后面的语句体。

【例3.4】需求:从键盘输入获奖等级,如果是一等奖,就显示“奖励MacBook”;如果是二等奖,就显示“奖励ssd固体硬盘”;如果是三等奖,就显示“奖励U盘”;如果是其他输入,就显示“没有这个等级”,如图1.3.4所示。

图1.3.4 例3.4图

【代码3.4】

代码3.4

if-else是一种两分支的语句,对于多个分支的情况,需要多个if-else的嵌套来实现。有一种多分支语句更加适合处理多分支情况,见例3.5。

【例3.5】将例3.4的需求用多分支语句实现,如图1.3.5所示。

图1.3.5 例3.5图

【代码3.5】

代码3.5

多分支语句:switch-case是关键字。switch后面的分支依据表达式要写在小括号中,多分支的执行语句要写在后面的大括号中。每一个case是一个分支。

执行语义:分支依据表达式的值依次和每个case后面表达式的值匹配相等,从第一个相等的分支开始执行,直到switch语句结束,或者遇到break,即退出switch语句。当所有的分支都不能匹配相等时,如果有default分支,则执行default后面的分支;如果没有default分支,则退出switch语句。

所以,每个分支后面有没有break,运行结果通常会不同。

例如,

对于以上程序片段,执行switch语句之后,输出结果为

23

【例3.6】需求:从键盘输入成绩,如果输入90~100,则显示“一等奖”;如果输入80~90,则显示“二等奖”;如果输入70~80,则显示“三等奖”;如果输入60~70,则显示“鼓励奖”;输入小于60,显示“小朋友要加油!”。

分析:学生的分数是浮点类型,一共有5种分支,如果用switch语句来实现的话,要注意switch语句的语法规定,即switch后面小括号中的分支依据只能是整型、字符型、字符串,不能是其他类型。

学生的分数是浮点类型,不能直接放在switch后面。可以考虑将学生的分数转换为整型,因为分数的个位数和小数位与获奖等级是无关的,所以可将分数的个位和小数位去掉。通过将分数强制类型转换为整型,就可以去掉小数位,得到一个整数。然后将这个整数降以10,可将原来的分数去掉个位数。

【代码3.6】

代码3.6

【例3.7】需求:编写一个简易计算器,从键盘输入两个浮点数,再输入一个运算符号(输入+、-、*、/四种中的一种,如果输入其他运算符号,则输出“错误的运算符号”),然后输出运算表达式和结果,如图1.3.6所示。

图1.3.6 例3.7图

【代码3.7】

代码3.7

分支结构的语法总结如下。

(1)if语句

如果布尔表达式的值为true,则执行布尔表达式后的代码块,否则不执行布尔表达式后的代码块。

(2)if-else语句

如果布尔表达式的值为true,则执行布尔表达式后的代码块,否则执行else后的代码块。

(3)多层嵌套if-else语句

如果布尔表达式1的值为true,则执行布尔表达式1后的代码块,否则,如果布尔表达式2的值为true,则执行布尔表达式2后的代码块,…,如果以上布尔表达式都不为true,则执行else后的代码块。

一旦其中一个if语句检测为true,则执行此分支,其他的else if以及else分支都将被跳过不执行。if语句可以有若干个else if,else在所有的else if语句之后。

每个else跟前面离的最近的if匹配,见代码片段1。

【代码片段1】

第4行中的else应该和前面最近的第3行的if匹配,所以第5行输出的b的值是2。当然,我们不应该写出这样可读性不高的代码,应该根据需要改写为代码片段2和代码片段3。

【代码片段2】

【代码片段3】

先为switch后面的表达式求值,然后依次跟每个case后面的值作相等比较,从第一个匹配的case分支开始向下执行,直到语句结束或者遇到break退出switch语句。

switch可以有可选的default分支在所有case分支之后,当switch后面的表达式和所有的case后面的值都不相等的时候,即执行default分支。

switch后面的表达式类型可以是byte、short、int、char或者字符串类型。case后面必须是常量值。

在一般情况下,每个分支都由break结束,使得每个分支执行结束后就跳出switch语句,在特殊的情况下,分支不以break结束,则此分支会继续向下执行,直到switch语句结束,或者在遇到break后跳出switch语句。