流程控制
Scanner 工具类
Scanner 可以从控制台读取用户输入。控制台输入本质上是字符数据,Scanner 会根据调用的方法把字符解析为指定类型。
基本使用
Scanner scanner = new Scanner(System.in);
int number1 = scanner.nextInt();
System.out.println(number1 + 1);
int number2 = scanner.nextInt();
System.out.println(number2 + 1);
读取输入时,程序会等待用户输入并确认。
常用方法
| 方法 | 作用 |
|---|---|
nextInt() | 读取并解析一个 int |
nextDouble() | 读取并解析一个 double |
next() | 读取下一个以空白分隔的字符串 |
nextLine() | 读取当前行剩余内容,不包含行结束符 |
调用 nextInt()、nextDouble() 后紧接着调用 nextLine() 时,需要注意前一个方法可能留下行结束符。
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
scanner.nextLine();
String name = scanner.nextLine();
读取单个字符时,可以先读取字符串,再获取第一个字符。
String text = scanner.next();
char value = text.charAt(0);
条件表达式
条件表达式也称三元表达式,语法如下:
布尔表达式 ? 值1 : 值2
布尔表达式为 true 时,结果是值 1;否则结果是值 2。
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
条件表达式适合简单的二选一赋值,不适合包含大量业务逻辑。
条件语句
if 语句
if 根据布尔表达式结果选择执行分支。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入星期(1~7):");
int week = scanner.nextInt();
if (week == 1) {
System.out.println("升旗仪式");
} else if (week == 2) {
System.out.println("下午放假");
} else if (week == 3 || week == 5) {
System.out.println("上体育课");
} else if (week == 4) {
System.out.println("上科学课");
} else {
System.out.println("放假");
}else if 和 else 必须跟在 if 分支之后。分支从上到下判断,某个条件成立后,其余分支不再执行。
switch 语句
switch 适合根据一个值匹配多个离散分支。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入星期(1~7):");
int week = scanner.nextInt();
switch (week) {
case 1:
System.out.println("升旗仪式");
break;
case 2:
System.out.println("下午放假");
break;
case 3:
case 5:
System.out.println("上体育课");
break;
case 4:
System.out.println("上科学课");
break;
default:
System.out.println("放假");
}传统 switch 支持 byte、short、char、int 及对应包装类,也支持枚举和 String,不支持 long、float、double 和 boolean。
匹配某个 case 后,如果没有执行 break、return 或抛出异常,程序会继续执行后续分支,这称为贯穿。多个 case 共用一段逻辑时可以有意利用贯穿。
循环语句
for 循环
当循环次数较明确时,通常使用 for 循环。
for (int i = 1; i <= 5; i++) {
System.out.println("Hello World");
}
执行顺序如下:
-
初始化表达式执行一次。
-
判断循环条件。
-
条件为
true时执行循环体。 -
执行更新表达式,然后回到条件判断。
常见示例:
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
for (int i = 5; i >= 1; i--) {
System.out.println(i);
}
for (char value = 'a'; value <= 'z'; value++) {
System.out.println(value);
}计算 1 到 10 的和:
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
计算偶数和时可以直接让循环变量每次增加 2。
int sum = 0;
for (int i = 2; i <= 10; i += 2) {
sum += i;
}
空条件可以形成无限循环。
for (;;) {
System.out.println("hello");
}
实际代码应设计明确的退出条件。
嵌套循环
循环体中再次包含循环称为嵌套循环。
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 4; j++) {
System.out.println(i + "," + j);
}
}
如果外层循环执行 n 次,且每次内层循环都执行 m 次,则内层循环体总计执行 n * m 次。
while 循环
只明确继续条件、不明确具体次数时,通常使用 while。
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}
do…while 循环
do...while 先执行循环体,再判断条件,因此循环体至少执行一次。
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 5);
它适合“先执行一次,再决定是否继续”的场景,例如菜单交互或重新生成不符合条件的随机位置。
循环控制关键字
break
break 立即结束当前循环。
for (int i = 1; i <= 5; i++) {
if (i == 2) {
break;
}
System.out.println(i);
}
标签可以指定结束外层循环,但应谨慎使用,避免流程难以理解。
outer:
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 2) {
break outer;
}
System.out.println(i + "," + j);
}
}continue
continue 结束当前这一轮循环,并进入下一轮。它也可以与标签配合跳到指定循环的下一轮。
for (int i = 1; i <= 5; i++) {
if (i == 2) {
continue;
}
System.out.println(i);
}
循环问题的分析思路
穷举法
列出所有可能值,再根据条件筛选符合要求的结果。适用于搜索范围有限的问题。
递推法
从已知状态出发,按照固定关系逐步计算后续状态,包括顺推和逆推。
图形题
图形题通常使用嵌套循环。外层循环控制行数,内层循环控制每行输出的内容。
直角三角形
for (int row = 1; row <= 5; row++) {
for (int column = 1; column <= row; column++) {
System.out.print("*");
}
System.out.println();
}
菱形
Scanner scanner = new Scanner(System.in);
int size = scanner.nextInt();
for (int row = 1; row <= size; row++) {
for (int space = 0; space < size - row; space++) {
System.out.print(" ");
}
for (int star = 1; star <= 2 * row - 1; star++) {
System.out.print("*");
}
System.out.println();
}
for (int row = size - 1; row >= 1; row--) {
for (int space = 0; space < size - row; space++) {
System.out.print(" ");
}
for (int star = 1; star <= 2 * row - 1; star++) {
System.out.print("*");
}
System.out.println();
}质数判断
质数是大于 1,且只有 1 和自身两个正因数的整数。
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
boolean prime = number >= 2;
for (int divisor = 2; divisor <= number / divisor; divisor++) {
if (number % divisor == 0) {
prime = false;
break;
}
}
System.out.println(prime ? "是质数" : "不是质数");判断到平方根即可,因为如果一个合数存在大于平方根的因数,就一定同时存在一个小于平方根的对应因数。
输出 100 到 200 之间的质数:
for (int number = 100; number <= 200; number++) {
boolean prime = true;
for (int divisor = 2; divisor <= number / divisor; divisor++) {
if (number % divisor == 0) {
prime = false;
break;
}
}
if (prime) {
System.out.println(number);
}
}获取整数的各位数字
下面的代码从个位开始依次输出一个非负整数的各位数字。
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
if (number == 0) {
System.out.println(0);
} else {
number = Math.abs(number);
while (number != 0) {
System.out.println(number % 10);
number /= 10;
}
}Math 工具类
int value = -10;
System.out.println(Math.abs(value));
System.out.println(Math.sqrt(16));
System.out.println(Math.pow(3, 5));
System.out.println(Math.round(3.5));
System.out.println(Math.round(-3.5));
Math.sqrt() 返回 double。判断整数是否为完全平方数时,可以先取整平方根,再检查乘积是否等于原数,避免直接依赖浮点取余。
int number = 16;
int root = (int) Math.sqrt(number);
boolean perfectSquare = root * root == number;
System.out.println(perfectSquare);
喜欢的话,留下你的评论吧~