十一、流程控制-if-switch

——————————————————————————————————————————————————

1.流程控制

做任何事情都要遵循一定的原则。例如,到图书馆借书,就必须要有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要有流程控制语句来实现与用户的交流,并根据用户的输入决定程序要“做什么”“怎么做”等。

流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序步骤的基本手段。如果没有流程控制语句,整个程序将按照线性的顺序来执行,不能根据用户的输入决定执行的序列。

——————————————————————————————————————————————————

1.1.复合语句

在Java语言中,语句是最小的组成单位,每条语句都必须使用分号作为结束符。如果想把多条语句看作单条语句,Java提供的方法又是什么呢?答案就是复合语句。

Java语言的复合语句是以整个块区为单位的语句,所以又称块语句。简而言之,复合语句是很多条语句的组合。在语法格式方面,复合语句由开括号“{”开始,闭括号“}”结束。

在前面的学习中我们已经接触了这种复合语句。例如,在定义一个类或方法时,类体就是以“{”与“}”作为开始与结束的标记,方法体同样也是以“{”与“}”作为标记的。复合语句中的每个语句都是从上到下被执行的。复合语句以整个块为单位,它能够被用在任何一个单独语句可以使用的地方,并且在复合语句中还可以嵌套复合语句。

例如,下面这段代码,在主方法中定义了复合语句块,复合语句块中还可以包含另一复合语句块。

在这里插入图片描述

在使用复合语句时要注意,复合语句为局部变量创建了一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用。如果在某个变量的作用域外使用该变量,则会发生错误。例如:在上述代码中,如果在复合语句外使用变量y、z、b,则将会出现错误,而变量x可在整个方法体中被使用。

——————————————————————————————————————————————————

1.2.if语句★

条件语句可根据不同的条件执行不同的语句。条件语句包括if条件语句与switch多分支语句。

使用if条件语句,可选择是否要执行紧跟在条件之后的那个语句。关键字if之后是作为条件的“布尔表达式”。如果该表达式返回的结果为true,则执行其后的语句;如果为false,则不执行if条件之后的语句。

if条件语句可分为简单的if条件语句、if…else语句和if…else if多分支语句。

——————————————————————————————————————————————————

1.2.1.简单条件的if语句★

简单的if条件语句是用于告诉程序在某种条件成立的情况下执行某一段语句,而在另一种条件成立的情况下执行另一段的语句。

简单条件的语法:

   if (布尔表达式){
              语句序列
   }

布尔表达式:必要参数,表示最后返回的结果必须是一个布尔值。可以是一个单纯的布尔变量或常量,也可以是使用关系或布尔运算符的表达式。

语句序列:可选参数。它可以是一条或多条语句,当表达式的值为true时执行这些语句。若语句序列中仅有一条语句,则可以省略条件语句中的“{ }”。

如果语句序列只有一条语句,则写法可以如下:

  int a = 100;
  if (a == 100)
      System.out.print("a的值是100");

虽然if条件语句中的语句序列只有一条语句时,省略“{ }”并无语法错误,但为了增强程序的可读性,最好不要省略。

条件语句后的语句序列被省略时:可以保留外面的大括号;也可以省略大括号,然后在末尾添加“;”。如下所示的两种情况都是正确的:

  boolean b = false;
  int(b);
  
  boolean b = false;
  if(b) {}

例:判断手机号码是否存在。

创建TakePhone类,模拟拨打电话场景,如果电话号码不是84972266,则提示拨打的号码不存在。

在这里插入图片描述
在这里插入图片描述

——————————————————————————————————————————————————

1.2.2.if…else语句★

if…else语句是条件语句中最常用的一种形式,它会针对某种条件有选择地做出处理。这通常表现为“如果满足某种条件,就进行某种处理,否则就进行另一种处理”。

   if (布尔表达式){
              语句序列1
   }else {
              语句序列2
   }

if后面“()”内的表达式的值必须是boolean型的。如果表达式的值为true,则执行紧跟if语句的复合语句;如果表达式的值为false,则执行else后面的复合语句。

if条件语句和if…else语句执行过程:

在这里插入图片描述

例:使用if…else语句校验密码。

在项目中创建Login类,在主方法中定义变量,并通过使用if…else语句判断变量的值,以决定输出结果。

在这里插入图片描述
在这里插入图片描述

——————————————————————————————————————————————————

1.2.3.if…else if多分支语句★

if…else if多分支语句用于针对某一事件的多种情况进行处理。通常表现为“如果满足某种条件,就进行某种处理;否则,如果满足另一种条件,则执行另一种处理”。语法如下:

   if (条件表达式 1){
              语句序列1
   }else if (条件表达式 2){
              语句序列2
   }
   ...
   else if (条件表达式 n) {
               语句序列n
   }

条件表达式1~条件表达式n:必要参数。可以由多个表达式组成,但最后返回的结果一定要为boolean类型。

语句序列:可以是一条或多条语句。当条件表达式1的值为true时,执行语句序列1;当条件表达式2的值为true时,执行语句序列2,以此类推。当省略任意一组语句序列时,可以保留其外面的“{ }”,也可以将“{ }”替换为“;”。

执行过程如图:

在这里插入图片描述

例:使用if…else if语句实现饭店座位的分配

创建Restaurant类,声明整型变量count表示用餐人数,根据人数安排客人到4人桌、8人桌或包厢用餐。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

——————————————————————————————————————————————————

1.2.4.if语句的嵌套★

if语句和if…else语句都可以嵌套判断语句。

在if语句中嵌套if…else语句。语法格式如下:

   if (表达式1){
              if(表达式2)
              语句1;
        else
              语句2;
        }

在if…else语句中嵌套if…else语句。形式如下:

   if (表达式1){
              if(表达式2)
              语句1;
        else
              语句2;
    }
    else {
            if(表达式2)
               语句1;
             else
               语句2;
    }

判断语句可以有多种嵌套方式,可以根据具体需要进行设计,但一定要注意逻辑关系的正确处理。

例如:使用嵌套的判断语句,判断控制台输入的年份是否是闰年;能被4整除且不能被100整除的年份,或者能被400整除的年份。代码如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

逻辑如下:

计算闰年:能被4整除,但是不能被100整除的年份;能被400整除的年份。以上2种方法满足一种即为闰年。

———————————————

如4年,执行if (iYear % 4 == 0), 能被4整除,继续执行

if(iYear % 100 == 0),不能被100整除,输出是闰年。

———————————————

如5年,执行if (iYear % 4 == 0),不能被4整除,输出不是闰年。

———————————————

如2000年,执行 (iYear % 4 == 0),能被4整除,继续执行

if(iYear % 100 == 0),能被100整除,继续执行。

if (iYear % 400 == 0),能被400整除,输出是闰年。

———————————————

详解下这个代码的写法顺序:

第一步:创建扫描器,定义变量a,存储输入的年分值。

package 流程控制;
import java.util.Scanner;
public class Year01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份");
        int a = sc.nextInt();
    }
}

第二步:进行逻辑运算,计算闰年:条件一:能被4整除,但是不能被100整除的年份;

先考虑第一步能被4整除,如果不能整除,则返回不是闰年。中间留空,因为条件一,要能被4整除,而且不能被100整除。先排除掉不能整除4的。

package 流程控制;
import java.util.Scanner;
public class Year01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份");
        int a = sc.nextInt();
        if (a % 4 == 0){
        
        } else
            System.out.println(a + "年不是闰年");
    }
}

第三步:能被4整除的话,进行下一步,判断条件能被100整除不。

如果能整除,继续进行条件二,是否能被400整除。否则就满足整除4,不能整除100的条件1。直接输出是闰年。

因为条件一和条件二,是或。要么匹配被4整除不能被100整除,要么匹配被400整除。

package 流程控制;
import java.util.Scanner;
public class Year01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份");
        int a = sc.nextInt();
        if (a % 4 == 0){
            if (a % 100 == 0){

            } else
                System.out.println(a + "年是闰年");
        } else
            System.out.println(a + "年不是闰年");
    }
}

第四步:继续嵌套最终的条件2,整除400。就是闰年,否则不是闰年。

package 流程控制;
import java.util.Scanner;
public class Year01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份");
        int a = sc.nextInt();
        if (a % 4 == 0){
            if (a % 100 == 0){
                if (a % 400 == 0)
                    System.out.println(a + "年是闰年");
                else
                    System.out.println(a + "年不是闰年");
            } else
                System.out.println(a + "年是闰年");
        } else
            System.out.println(a + "年不是闰年");
    }
}

——————————————————————————————————————————————————

1.3.switch多分支语句★

——————————————————————————————————————————————————

1.3.1.switch语句通用语法★

在编程中,一个常见的问题就是检测一个变量是否符合某个条件,如果不符合,再用另一个值来检测,以此类推。当然,这种问题使用if条件语句也可以完成。

例:使用if语句对考试成绩进行评估,代码如下:

    if(grade == "A") {
        System.out.println("真棒");
    }
    if (grade == "B") {
        System.out.println("做的不错");
    }

这个程序显得比较笨重,程序员需要测试不同的值来给出输出语句。在Java中,可以用switch语句将动作组织起来,以一个较简单明了的方式来实现“多选一”的选择。语法如下:

    switch (表达式){
    case    常量值 1;
               语句块 1
               [break;]
    ...
    case   常量值 n;
               语句块 n
               [break;]
    default;
              语句块 n+1;
              [break;]
    }

switch语句中表达式的值必须是整型、字符型、字符串类型或枚举类型,常量值1~n的数据类型必须与表达式的值的类型相同。

switch语句首先计算表达式的值,如果表达式的计算结果和某个case后面的常量值相同,则执行该case语句后的若干条语句,直到遇到break语句。

此时,如果该case语句中没有break语句,则将继续执行后面case中的若干条语句,直到遇到break语句。

若没有一个常量的值与表达式的值相同,则执行default后面的语句。

default语句为可选的,如果它不存在,且switch语句中表达式的值不与任何case的常量值相同,那么switch语句就不做任何处理。

注意:

同一条switch语句,case的常量值必须互不相同。

在switch语句中,case语句后的常量表达式的值可以为整数,但绝不可以是非整数的实数。例如,下面的代码就是错误的:

    case 1.1:

switch语句的执行过程:

在这里插入图片描述

例:使用switch语句为考试分数分级。

创建Grade类,使用Scanner类在控制台中输入分数,然后用switch多分支语句判断输入的分数属于哪类成绩。10分和9分属于优,8分属于良,7分和6分属于中,5分、4分、3分、2分、1分以及0分均属于差。

if语句

在这里插入图片描述

swtich语句

使用scanner(System.in)时,使用完毕后,一定要关闭扫描器,system.in属于IO流,一旦打开,它一直占用资源,因此使用完毕后要关闭扫描器。

在这里插入图片描述

看起来两者的差距不是很大,switch语句看起来更简洁点。在JDK14以后,对switch语句有了新的写法。

——————————————————————————————————————————————————

1.3.2.switch表达式★

switch语句是用于条件判断、流程控制的组件。从上例中不难看出,switch语句的写法显得非常笨拙。为了简化代码,Java 14提供了一个新特性:switch表达式。

代码如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

——————————————————————————————————————————————————

训练一★

划分成绩等级

对一、二年级学生的考试成绩进行等级划分,等级划分标准如下:

“优秀”,大于或等于90分。
“良好”,大于或等于80分,小于90分。
“合格”,大于或等于60分,小于80分。
“不合格”,小于60分。

使用if…else if语句判断成绩等级并输出与该成绩对应的等级。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

——————————————————————————————————————————————————

训练二★

判断月份对应的季节 使用switch多分支语句判断某个月份属于哪个季节。

有好几种说法。。这个季节,是按照立春、立秋这种节气划分,还是按照通俗的。。

在气候上,四个季节是以温度来区分的。在北半球,一般来说每年的3~5月为春季,6~8月为夏季,9~11月为秋季,12~2月为冬季 。划分标准:3~5月为春季,6~8月为夏季,9~11月为秋季,12~2月为冬季。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值