分支结构
分支结构的概念
- 当需要进行条件判断并做出选择时,使用分支结构。
if分支结构
if(条件表达式) {
语句块;
}
-
判断条件表达式是否成立
=> 若成立,则执行语句块
=> 若不成立,则跳过语句块
案例题目
- 提示用户输入两个整数,使用if分支结构找到最大值并打印出来。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入两个整数
System.out.println("请输入两个整数:");
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
// 使用if分支结构找到最大值并打印出来
int max = num1;
if (num2 > max) {
max = num2;
}
System.out.println("最大值是:" + max);
}
}
if else分支结构
if(条件表达式) {
语句块1;
} else {
语句块2;
}
-
判断条件表达式是否成立
=> 若成立,则执行语句块1 => 若不成立,则执行语句块2
案例题目
- 提示用户输入一个整数,使用if else分支结构判断该整数是负数还是非负数并打印。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入一个整数
System.out.println("请输入一个整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
// 使用if else分支结构判断该整数是负数还是非负数并打印
if (num >= 0) {
System.out.println(num + "是非负数");
} else {
System.out.println(num + "是负数");
}
}
}
- 使用if else分支结构判断该整数是正数、负数、还是零。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入一个整数
System.out.println("请输入一个整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
// 使用if else分支结构判断该整数是正数、负数、还是零
if (num >= 0) {
if (num > 0) {
System.out.println(num + "是正数");
} else {
System.out.println(num + "是零");
}
} else {
System.out.println(num + "是负数");
}
}
}
if else if else 分支结构
if(条件表达式1) {
语句块1;
} else if (条件表达式2) {
语句块2;
} else {
语句块n;
}
-
判断条件表达式1是否成立
=> 若成立,则执行语句块1
=> 若不成立,则判断表达式2是否成立
----- => 若成立,则执行语句块2
----- => 若不成立,则执行语句块n
案例题目
-
根据用户输入的薪水计算个人所得税并打印出来,其中个税起征点为:
5000元,具体规则如下:
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入个人的薪水
System.out.println("请输入您的薪水:");
Scanner sc = new Scanner(System.in);
int salary = sc.nextInt();
// 使用if else if else分支结构判断薪水的范围并计算对应的个人所得税
// 个人所得税公式:本月应纳税所得额 * 对应税率 - 速算扣除数
double salaryPrice = 0.0;
if (salary <= 5000) {
System.out.println("无需纳税");
} else if (salary <= 8000) {
salaryPrice = (salary - 5000) * 0.03;
} else if (salary <= 17000) {
salaryPrice = (salary - 5000) * 0.1 - 210;
} else if (salary <= 30000) {
salaryPrice = (salary - 5000) * 0.2 - 1410;
}
// 打印最终的计算结果
System.out.println("最终个人所得税是:" + salaryPrice);
}
}
-
出租车计费方式:由里程钱数和等候时间钱数相加得出。
里程数前3公里13元,超过3公里到15公里部分每公里2元,15公里以上部分每公里3元。
等候时候每2分钟1元,不足部分不要钱。
输入公里数和等候秒数,输出车费。
16公里,等候290秒,车费 = 13 + (15-3)*2 + (16-15)*3 + 1 = 41
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入公里数和等待的秒数
System.out.println("请输入公里数和等待的秒数:");
Scanner sc = new Scanner(System.in);
int km = sc.nextInt();
int sec = sc.nextInt();
// 根据公里数计算对应的里程费
int kmPrice = 0;
if (km <= 3) {
kmPrice = 13;
} else if (km < 15) {
kmPrice = 13 + (km - 3) * 2;
} else {
kmPrice = 13 + (km - 3) * 2 + (km - 15) * 3;
}
// 根据等待的秒数来计算对应的等待费
int secPrice = sec / 150;
// 计算总费用并打印
int sumPrice = kmPrice + secPrice;
System.out.println("本次出租车的总费用是:" + sumPrice);
}
}
-
提示用户输入考试的成绩,使用if-else if-else分支结构判断所在等级并打印。
[90 ~ 100] - 等级A
[80 ~ 89] -- 等级B
[70 ~ 79] -- 等级C
[60 ~ 69] -- 等级D
[0 ~ 59] --- 等级E
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入考试的成绩
System.out.println("请输入考试成绩:");
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
// 使用if-else if-else分支结构判断所在等级并打印
if (score >= 90 && score <= 100) {
System.out.println("等级A");
} else if (score >= 80) {
System.out.println("等级B");
} else if (score >= 70) {
System.out.println("等级C");
} else if (score >= 60) {
System.out.println("等级D");
} else {
System.out.println("等级E");
}
}
}
switch case分支结构
switch(变量/表达式) {
case 字面值1:
语句块1;
break;
case 字面值2:
语句块2;
break;
...
default:
语句块n;
}
- switch()中支持的数据类型有:byte、short、char、int,从jdk1.5开始支持枚举类型,从jdk1.7开始支持String类型。
循环结构
循环结构的概念
- Java程序中若希望重复执行一段代码时,就需要使用循环结构。
for循环
for(初始化表达式;条件表达式;修改初始值表达式) {
循环体;
}
案例题目
- 使用for循环打印1-100的所有奇数,使用三种方式。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用for循环打印1-100的所有奇数
// 方式一
for (int i = 1; i <= 100; i++) {
if (i % 2 != 0) {
System.out.println("i = " + i);
}
}
System.out.println("---------------------");
// 方式二
for (int i = 1; i <= 100; i += 2) {
System.out.println("i = " + i);
}
System.out.println("---------------------");
// 方式三
for (int i = 1; i <= 50; i++) {
System.out.println("i = " + (2 * i - 1));
}
}
}
- 使用for循环实现累加:1+2+...+10000=?最后打印出来。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用for循环实现累加:1+2+...+10000=?最后打印出来
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
System.out.println("sum = " + sum);
}
}
-
使用for循环打印三位数中所有水仙花数。
“水仙花数”一个整数其值等于各个数位的立方和。
如:153=1^3+5^3+3^3
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用for循环打印三位数中所有水仙花数
for (int i = 100; i <= 999; i++) {
// 拆分百位数
int num1 = i / 100;
// 拆分十位数
int num2 = i % 100 / 10;
// 拆分个位数
int num3 = i % 10;
// 判断该数是否等于各个数位的立方和
if ((num1*num1*num1 + num2*num2*num2 + num3*num3*num3) == i) {
System.out.println("i = " + i);
}
}
}
}
continue关键字
- continue语句用在循环体中,结束本次循环而开始下一次循环。
案例题目
- 使用for循环打印1-20之间的整数,若遇到5的倍数则跳过不打印。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用for循环打印1-20之间的整数,若遇到5的倍数则跳过不打印
for (int i = 1; i <= 20; i++) {
if (i % 5 == 0) {
// 跳过本次循环
continue;
}
System.out.println("i = " + i);
}
}
}
break关键字
- break用于退出当前语句块,break在循环体中用于退出循环。
- for(;;)-这种没有循环条件的循环叫做无限循环,俗称“死循环”。
案例题目
- 不断的提示用户输入聊天内容并输出,直到用户输入“bye”结束聊天。
/*
流程控制
*/
import java.util.Scanner;
public class ProcessControlTest {
public static void main(String[] args) {
// 不断的提示用户输入聊天内容并输出,直到用户输入“bye”结束聊天
Scanner sc = new Scanner(System.in);
for (;;) {
System.out.println("请输入聊天内容:");
String str = sc.next();
// 判断输入的内容是否为”bye“
if (str.equals("bye")) {
System.out.println("聊天结束");
break;
}
System.out.println("聊天内容是:" + str);
}
}
}
-
猜数字游戏
随机生成数字n(1-100),等待用户输入猜测数据,根据用户的输入 比较输出猜大了,猜小了,猜对了,如果用户猜对就结束游戏。
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 随机生成数字(1-100)
Random ra = new Random();
int temp = ra.nextInt(100) + 1;
Scanner sc = new Scanner(System.in);
for (;;) {
// 提示用户输入猜测的数字
System.out.println("请输入猜测的数字");
int num = sc.nextInt();
if (num > temp) {
System.out.println("猜大了");
} else if (num < temp) {
System.out.println("猜小了");
} else {
System.out.println("猜对了");
// 结束循环
break;
}
}
}
}
双重for循环的格式
for(初始化表达式1;条件表达式2;修改初始值表达式3) {
for(初始化表达式4;条件表达式5;修改初始值表达式6) {
循环体;
}
}
双重for循环的特点
- 外层循环用于控制打印的行数,内层循环用于控制打印的列数,外层循环改一下,内层循环从头到尾跑一圈。
案例题目
-
使用双重for循环分别打印以下图案
* * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 图案一
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("* ");
}
System.out.println();
}
System.out.println("---------------------");
// 图案二
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
System.out.println("---------------------");
// 图案三
for (int i = 0; i < 5; i++) {
for (int j = 5; j > i; j--) {
System.out.print("* ");
}
System.out.println();
}
System.out.println("---------------------");
// 图案四
for (int i = 0; i < 5; i++) {
for (int j = 4; j > i; j--) {
System.out.print(" ");
}
for (int k = 0; k < (i * 2 + 1); k++) {
System.out.print("* ");
}
System.out.println();
}
}
}
- 使用for循环打印九九乘法表。
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用for循环打印九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i*j + " ");
}
System.out.println();
}
}
}
break关键字跳出多层循环
- 退出外层循环体,需要使用标号的方式。
label:for(...) {
for(...) {
break label;
}
}
案例题目
-
使用双重for循环打印2-100之间的所有素数
当一个数只能被1和它本身整除时,这个数就叫做素数或质数。
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用双重for循环打印2-100之间的所有素数
for (int i = 2; i <= 100; i++) {
// 声明一个布尔类型变量标记是否为素数
boolean flag = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flag = false;
break;
}
}
// 打印素数
if (flag) {
System.out.println("i = " + i);
}
}
}
}
while循环
while(条件表达式) {
循环体;
}
案例题目
- 使用while循环计算调和数列的和并打印,即:1/1 + 1/2 + ... + 1/n。
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 使用while循环计算调和数列的和并打印,即:1/1 + 1/2 + ... + 1/n
// 提示用户输入一个整数
System.out.println("请输入一个整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
double sum = 0.0;
int i = 1;
while (i <= num) {
sum += 1.0/i;
i++;
}
// 打印计算结果
System.out.println("计算结果是:" + sum);
}
}
while循环和for循环比较
- while循环适合明确循环条件但不明确循环次数的场合中。
- for循环适合明确循环次数或范围的场合。
- while(true) 等价于for(;;) 都表示无限循环。
案例题目
- 提示用户输入任意位数的正整数然后反向输出。
/*
流程控制
*/
import java.util.Scanner;
import java.util.Random;
public class ProcessControlTest {
public static void main(String[] args) {
// 提示用户输入任意位数的正整数然后反向输出
System.out.println("请输入一个任意位的正整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
// 反向输出
int res = 0;
int temp = num;
while (temp > 0) {
res = res * 10 + temp % 10;
temp /= 10;
}
// 打印结果
System.out.println(num + "反向输出的结果是:" + res);
}
}
do while循环
do {
循环体;
} while(条件表达式);
- do-while循环主要用于至少执行一次循环体的场合中。