流程控制
——————————————————————————————————————————————————
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月为冬季。