Java语言基础-流程控制语句

243 阅读3分钟

分支结构

分支结构的概念

  • 当需要进行条件判断并做出选择时,使用分支结构。

条件.png

if分支结构

    if(条件表达式) {
        语句块;
    }

条件表达式.png

  • 判断条件表达式是否成立

    => 若成立,则执行语句块

    => 若不成立,则跳过语句块

案例题目

  • 提示用户输入两个整数,使用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;
    }

条件表达式.png

  • 判断条件表达式是否成立

    => 若成立,则执行语句块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.png

  • 判断条件表达式1是否成立

    => 若成立,则执行语句块1

    => 若不成立,则判断表达式2是否成立

    ----- => 若成立,则执行语句块2

    ----- => 若不成立,则执行语句块n

案例题目

  • 根据用户输入的薪水计算个人所得税并打印出来,其中个税起征点为:

    5000元,具体规则如下:

全月应纳税所得额.png

/*
	流程控制
*/
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()中支持的数据类型有:byteshortcharint,从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循环主要用于至少执行一次循环体的场合中。