流程控制

发布于 2026-07-29 08:29 更新于 2026-07-29 08:29 1798 字 9 min read ... 访问量

文章介绍了Java中Scanner工具类的使用方法,包括如何读取用户输入、处理输入时的常见问题(如行结束符残留),以及基本的条件表达式、if-else和switch语句的语法与应用场景。同时详细讲解了for、while和do-while循环的使用场景、执行流程及控制关键字(break、continue),并提供了循环问题的分析思路(穷举法、递推法),以及图形题和质数判断等实际应用示例,最后说明了如何通过Math工具类判断整数是否为完全平方数。

流程控制

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 ifelse 必须跟在 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 支持 byteshortcharint 及对应包装类,也支持枚举和 String,不支持 longfloatdoubleboolean

匹配某个 case 后,如果没有执行 breakreturn 或抛出异常,程序会继续执行后续分支,这称为贯穿。多个 case 共用一段逻辑时可以有意利用贯穿。

循环语句

for 循环

当循环次数较明确时,通常使用 for 循环。

for (int i = 1; i <= 5; i++) {
    System.out.println("Hello World");
}

执行顺序如下:

  1. 初始化表达式执行一次。

  2. 判断循环条件。

  3. 条件为 true 时执行循环体。

  4. 执行更新表达式,然后回到条件判断。

常见示例:

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);
}

计算 110 的和:

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 ? "是质数" : "不是质数");

判断到平方根即可,因为如果一个合数存在大于平方根的因数,就一定同时存在一个小于平方根的对应因数。

输出 100200 之间的质数:

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);

喜欢的话,留下你的评论吧~

... 访问量
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka