5. 程序流程控制
程序执行包含三种结构:顺序结构、分支结构、循环结构
分支结构
if-else
根据条件是否满足来执行相应的代码块,且执行完if-else语句就结束
基本使用
class IfTest {
public static void main(String[] args) {
// if
int heartBeats = 79;
if(heartBeats < 60 || heartBeats > 100) {
System.out.println("需要做进一步检查");
}
System.out.println("检查结束");
// if-else
int age = 23;
if(age < 18) {
System.out.println("你可以看动画片");
}else {
System.out.println("你可以看成人电影了");
}
// if-else if-else,这个结构中的else是可选的
if(age < 0) {
System.out.println("您输入的数据非法");
}else if(age < 18) {
System.out.println("青少年时期");
}else if(age < 35) {
System.out.println("青壮年时期");
}else if(age < 60) {
System.out.println("中年时期");
}else if(age < 120) {
System.out.println("老年时期");
}else {
System.out.println("您输入的数据非法");
}
}
}
键盘获取用户输入
import java.util.Scanner;
class ScannerTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入姓名");
String name = scan.next();
System.out.println(name);
System.out.println("请输入年龄");
int age = scan.nextInt();
System.out.println(age);
System.out.println("请输入体重");
double weight = scan.nextDouble();
System.out.println(weight);
System.out.println("是否单身:true or false");
boolean single = scan.nextBoolean();
System.out.println(single);
// Scanner没有提供获取char类型的方法
System.out.println("请输入性别:(男/女)");
String gender = scan.next();
char genderChar = gender.charAt(0); // 获取字符串中索引为0的字符
System.out.println(genderChar);
}
}
例题1
import java.util.Scanner;
class IfTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("输入岳小鹏期末成绩");
int score = scan.nextInt();
if(score == 100) {
System.out.println("奖励一辆BMW");
// 如果将下面的条件表达式放在这里,不会对运行结果有影响
// else if(score >= 60 && score <=80)
}else if(score > 80 && score <= 99) {
System.out.println("奖励一部iPhone");
}else if(score >= 60 && score <=80) {
System.out.println("奖励一部iPad");
}else {
System.out.println("什么奖励也没有");
}
/* 上面的条件也可以改写为 但如果颠倒条件的顺序
score == 100 score == 100
score > 80 score >= 60
score >= 60 score > 80
执行结果还是正确的 则score > 80下的语句永远不会被执行
*/
}
}
从上面可以看到,如果多个表达式之间没有交集的关系,某个条件表达式放在前面还是后面都可以;但如果多个表达式之间有交集,那么就需要严格规定条件表达式的顺序;如果表达式之间有包含关系,最好将被包含的表达式写在前面,否则它就永远不会被执行
例题2
// 从键盘输入三个整数,用if-else if-else进行排序
import java.util.Scanner;
class IfTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个整数");
int num1 = scan.nextInt();
System.out.println("请输入第二个整数");
int num2 = scan.nextInt();
System.out.println("请输入第三个整数");
int num3 = scan.nextInt();
if(num1 >= num2) {
// if-else可以嵌套,但嵌套层数最多不要超过3层
// 当要执行的语句只有一句时,可以不加{},但最好加上
if(num3 >= num1)
System.out.println(num2 + "<=" + num1 + "<=" + num3);
else if(num3 <= num2)
System.out.println(num3 + "<=" + num2 + "<=" + num1);
else
System.out.println(num2 + "<=" + num3 + "<=" + num1);
}else {
if(num3 >= num2) {
System.out.println(num1 + "<=" + num2 + "<=" + num3);
}else if(num3 <= num1) {
System.out.println(num3 + "<=" + num1 + "<=" + num2);
}else {
System.out.println(num1 + "<=" + num3 + "<=" + num2);
}
}
}
}
练习1
class IfExer {
public static void main(String[] args) {
int x = 4;
int y = 1;
if(x > 2)
if(y > 2)
System.out.println(x + y);
else // 遵循就近原则,这个else与上一个if配对
System.out.println("x is " + x); // x > 2的条件满足就执行下面的if-else语句块,所以输出是这一行
}
}
练习2
import java.util.Scanner;
class DogAge {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("输入狗的年龄:");
int dogAge = scan.nextInt();
if(dogAge < 0) {
System.out.println("输入一个合法的整数");
}else if(dogAge <= 2) {
double dogAgeToH = dogAge * 10.5;
System.out.println("你的狗相当于人已经" + dogAgeToH + "岁了");
}else {
int dogAgeToH = 21 + (dogAge - 2) * 4;
System.out.println("你的狗相当于人已经" + dogAgeToH + "岁了");
}
}
}
switch-case
基本使用
class SwitchCaseTest {
public static void main(String[] args) {
int number = 2;
// 根据()中表达式的值依次匹配{}中的case,当匹配上了就执行这个case中的语句
// 执行完后如果紧接着有break关键字,switch语句执行完毕
// break是可选的,如果没有break,则向下一直执行直到遇到break或是switch语句末尾结束
// ()中的表达式,不能是条件表达式。它只能是byte、short、char、int、枚举(JDK5.0新增)、String(JDK7.0新增)中的一种
switch(number) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default: // 当所有case都不匹配时默认执行,default是可选的。可以放在前面,当case都不匹配时还是会被执行。但通常都是放在最后
System.out.println("other"); // 如果都不加break,输出two、three、other
// break; // 这个break可以省略,因为执行完末尾switch语句也执行完了
}
}
}
注意的点
class SwitchCaseTest {
public static void main(String[] args) {
/* 编译不通过,不能像这样想当然
boolean isHandsome = true;
switch(isHandsome) {
case true:
System.out.println("帅");
break;
case false:
System.out.println("丑");
break;
default:
System.our.println("输入有误");
}
*/
/* 编译不通过,case后面只能跟常量,不能写一个范围。
// 表达式是与case做==的判断,下面这个则变成了一个int类型与case中的布尔类型做==判断
int age = 18;
switch(age) {
case age > 18:
System.out.println("成年了");
break;
default:
System.out.println("未成年");
}
*/
// JDK7.0及以后支持String类型
String season = "summer";
switch(season) {
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎"); // 输出
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("白雪皑皑");
break;
default:
System.out.println("输入有误");
break;
}
}
}
例题1
import java.util.Scanner;
class SwitchCaseTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("输入abc中的一个:");
String letter = scan.next();
char letterChar = letter.charAt(0);
switch(letterChar) {
case 'a':
System.out.println("A");
break;
case 'b':
System.out.println("B");
break;
case 'c':
System.out.println("C");
break;
default:
System.out.println("other");
}
}
}
例题2
class SwitchCaseTest {
public static void main(String[] args) {
int score = 78;
// 判断成绩是否合格
switch(score / 60) {
case 0:
System.out.println("成绩不合格");
break;
case 1:
System.out.println("成绩合格");
break;
default:
System.out.println("输入有误");
}
// 当多个case要执行的语句相同时,可以像下面一样将它们合并
// 其实只是当表达式匹配到其中一个case时,要执行的为空且没有break,只能继续向下直到遇见有执行语句的case和break
switch(score / 20) {
case 0:
case 1:
case 2:
System.out.println("成绩不合格");
break;
case 3:
case 4:
case 5:
System.out.println("成绩合格");
break;
}
}
}