循环

Java 有三种循环: for, while, do while.

for

基本语法:

for (循环变量初始化; 循环条件; 循环变量迭代) {
循环语句;
}

程序示例:

public static void main(String[] args) {
for (int i = 0, j = 0; i < 3; i++, j--) {
System.out.println("Hello World");
}
}

循环变量初始化可以定义多个变量, 循环变量迭代可以有多个.

程序示例:

// 需求: 从键盘录入两个数字, 表示一个范围, 统计这个范围中, 既能被 3 整除, 又能被 5 整除的数字有多少个?
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入第一个整数: ");
int num1 = sc.nextInt();
System.out.print("请输入第二个整数: ");
int num2 = sc.nextInt();
int min = num1 < num2 ? num1 : num2;
int max = num1 > num2 ? num1 : num2;
int count = 0;
for (int i = min; i <= max; i++) {
if (i % 3 == 0 && i % 5 == 0)
++count;
}
System.out.print("从" + min + "到" + max + "既能被3整除又能被5整除的数字有" + count + "个. ");
}
}

执行结果 1:

请输入第一个整数: 1
请输入第二个整数: 20
从1到20既能被3整除又能被5整除的数字有1个.

执行结果 2:

请输入第一个整数: 20
请输入第二个整数: 1
从1到20既能被3整除又能被5整除的数字有1个.

错误程序示例 1:

public class Test6 {
public static void main(String[] args) {
int i = 9;
for (int i = 0, j = 0; i < 3; i++, j--) { // 报错: Variable 'i' is already defined in the scope
System.out.println("Hello World");
}
}
}

错误程序示例 2:

public class Test6 {
public static void main(String[] args) {
for (int i = 0, j = 0; i < 3; i++, j--) {
int i = 9; // 报错: Variable 'i' is already defined in the scope
System.out.println("Hello World");
}
}
}

错误程序示例 3:

public class Test6 {
public static void main(String[] args) {
int i = 9;
for (int a = 0, j = 0; a < 3; i++, j--) {
int i = 9; // 报错: Variable 'i' is already defined in the scope
System.out.println("Hello World");
}
}
}
// 正确
public static void main(String[] args) {
for (int i = 0, j = 0; i < 3; i++, j--) {
System.out.println("Hello World");
}
for (int i = 0, j = 0; i < 3; i++, j--) {
System.out.println("Hello World");
}
}

主 scope 和子 scope 不能重复定义, 两个子 scope 可重复定义. 即定义域不能覆盖.

循环条件返回一个 boolean 值.

for 循环头的三个表达式都可以省略, 但是分号不能省略, 省略循环条件表示一直为真.

快速书写 for 循环的方法:

先输入 50.fori, 然后回车:


图 1

自动生成了一个 for 循环, 起始为 0, 终止为 50, 循环变量是自动的, 且会保证不会发生作用域冲突:


图 2

while

基本语法:

循环变量初始化;
while (循环条件) {
循环体;
循环变量迭代;
}

图 1

图 2

while 循环也有四个要素, 只是放置的位置不一样.

练习:

// 需求: 世界最高山峰是珠穆朗玛峰 (8844.43 米 = 8844430 毫米) ,
// 假如我有一张足够大的纸, 它的厚度是 0.1 毫米.
// 请问, 我折叠多少次, 可以折成珠穆朗玛峰的高度?
public static void main(String[] args) {
int HEIGHT = 8844430;
double init = 0.1;
int count = 0;
while (init <= HEIGHT) {
init *= 2;
++count;
}
System.out.println(init);
System.out.println(count);
}

执行结果:

1.34217728E7
27

练习:

// 回文数:
// 需求: 给你一个整数 x.
// 如果 x 是一个回文整数, 打印 true, 否则, 返回 false.
// 解释: 回文数是指正序 (从左向右) 和倒序 (从右向左) 读都是是一样的整数.
// 例如, 121 是回文, 而 123 不是.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
int tmp = num;
int sum = 0;
while (tmp != 0) {
int tail = tmp % 10;
sum = sum * 10 + tail;
tmp = tmp / 10;
}
if (sum == num) {
System.out.println("是回文数");
} else {
System.out.println("不是回文数");
}
}
}

执行结果:

请输入一个整数:
12321
是回文数

练习:

// 需求: 给定两个整数, 被除数和除数 (都是正数, 且不超过 int 的范围) .
// 将两数相除, 要求不使用乘法、除法和 % 运算符.
// 得到商和余数.
import java.util.Scanner;
public class whileTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入被除数: ");
int dividend = sc.nextInt();
System.out.print("请输入除数: ");
int divisor = sc.nextInt();
int count = 0;
while (dividend >= divisor) {
dividend -= divisor;
++count;
}
System.out.println("商为" + count + ", 余数为" + dividend);
}
}

执行结果:

请输入被除数: 13
请输入除数: 3
商为 4, 余数为 1

循环条件返回一个 boolean 值.

程序示例:

public class While {
public static void main(String[] args) {
int i = 0;
while (i) {
System.out.println("Hello");
}
}
}

报错: 不兼容的类型: int 无法转换为 boolean

for 和 while 的对比:

相同点: 运行规则都是一样的.

区别: for 循环中, 循环控制变量归属于 for 循环的语法结构中, 在 for 循环结束后, 就不能再次被访问了. while 循环中, 循环控制变量不归属于 while, 在 while 循环结束之后, 该变量还可以继续使用. 如果 for 循环的循环控制变量在 for 前面定义, 而不是在 for 循环头中定义, 则当 for 结束了该变量依旧可以使用.

能用 for 的地方一定能用 while 进行改写, 能用 while 的地方一定能用 for 进行改写.

一般如果知道循环次数或者循环范围, 就用 for, 否则用 while. 无限循环是不知道循环次数的, 因此无限循环一般都使用 while.

do while

基本语法:

循环变量初始化;
do {
循环体;
循环变量迭代;
} while (循环条件);

图 1

do while 是关键字.

也有四要素, 只是位置不一样.

循环条件返回一个 boolean 值.

无限循环

也叫死循环.

三种死循环:


图 1

最常用的是 while 形式的.

程序示例:

public class Test {
public static void main(String[] args) {
// 无限循环的下面不要再写其他的代码, 因为永远执行不到, 写了会报错
while (true) {
System.out.println("向女神表白");
}
System.out.println("女神答应了"); // 报错: Unreachable statement
}
}

break

程序示例:

// 产生一个位于 [1, 100] 范围内的随机数, 统计产生 100 所需要的次数
public static void main(String[] args) {
// Math.random() // [0,1)
// Math.random() * 100 // [0,100)
// (int) (Math.random() * 100) // [0,99]
// (int) (Math.random() * 100) + 1 // [1,100]
int count = 0;
while (true) {
int a = (int) (Math.random() * 100) + 1;
System.out.println(a);
++count;
if (a == 100)
break;
}
System.out.println(count);
}

对于位于循环内部的 break, 默认情况下都是结束当前最近位置的循环, 但是可以用标签修改这一默认设置, 明确指定想要结束的循环. 如果外部循环结束了, 那么内部循环当然也就结束了.

程序示例:

public static void main(String[] args) {
abc1:
for (int i = 1; i <= 10; i++) {
abc2:
for (int j = 0; j <= 10; j++) {
if (j == 2)
break abc1; // 结束外层 for
System.out.println(j);
}
}
}

执行结果:

0
1

程序示例:

public static void main(String[] args) {
int n = 0;
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
if (sum >= 20) {
n = i;
break;
}
}
System.out.println("sum = " + sum);
System.out.println("n = " + n); // 如果在定义 n 时不赋值初始值, 则此处会报错: 可能尚未初始化变量 n
}

执行结果:

sum = 21
n = 6

程序示例:

import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String name;
String ps;
for (int chance = 3; chance > 0; chance--) {
System.out.println("输入姓名:");
name = sc.next();
System.out.println("输入密码:");
ps = sc.next();
if ("小李".equals(name) && "899".equals(ps)) {
System.out.println("登录成功");
break;
}
System.out.println("输入错误,还有 " + (chance - 1) + " 次机会.");
}
}
}

程序示例:

// 求平方根
// 需求: 键盘录入一个大于等于 2 的整数 ×, 计算并返回 x 的平方根.
// 结果只保留整数部分, 小数部分将被舍去.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个整数: ");
int number = sc.nextInt();
for (int i = 1; i <= number; i++) {
if (i * i == number) {
System.out.println(i + "是" + number + "的平方根");
break;
} else if (i * i > number) {
System.out.println((i - 1) + "是" + number + "的平方根的整数部分");
break;
}
}
}
}

程序示例:

// 需求: 键盘录入一个正整数 x, 判断该整数是否为一个质数.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.print("请输入一个正整数: ");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
boolean flag = true;
for (int i = 2; i * i <= number; i++) {
if (number % i == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(number + "是质数. ");
} else System.out.println(number + "不是质数. ");
}
}

程序示例:

// 需求: 程序自动生成一个 [1, 100] 之间的随机数字, 使用程序实现猜出这个数字是多少?
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int random_number = (int) (Math.random() * 100 + 1);
System.out.print("请猜这个数是多少: ");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
while (number != random_number) {
if (number < random_number) {
System.out.print("猜小了, 再来: ");
number = sc.nextInt();
} else {
System.out.print("猜大了, 再来: ");
number = sc.nextInt();
}
}
System.out.println("猜对了");
}
}

执行结果:

请猜这个数是多少: 50
猜小了, 再来: 75
猜小了, 再来: 85
猜小了, 再来: 90
猜小了, 再来: 95
猜小了, 再来: 97
猜大了, 再来: 96
猜对了

另一种写法:

// 需求: 程序自动生成一个 [1, 100] 之间的随机数字, 使用程序实现猜出这个数字是多少?
import java.util.Random;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 利用 Random 类获取随机数
Random r = new Random();
// 左闭右开区间
int random_number = r.nextInt(100) + 1;
// 生成任意范围内的值的方法:
// 1. 左右区间都减去左区间
// 2. 右区间加 1
// 3. 这个右区间的值, 就是 nextInt() 里面要输进去的值
// 4. 将 nextInt() 外面加原来的左区间
// 比如, 要生成 [7, 15]
// 先减去左区间, 得到 [0, 8]
// 右区间加 1, 得到 [0, 9]
// 最终的写法为 r.nextInt(9) + 7
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("猜这个数字是多少: ");
int guessNum = sc.nextInt();
if (guessNum > random_number)
System.out.println("猜大了, 再来. ");
else if (guessNum < random_number)
System.out.println("猜小了, 再来. ");
else {
System.out.println("猜中了");
break;
}
}
}
}

对于 for 循环, break 结束后, 直接执行 for 循环后面的语句, 不会执行 for 循环头中的表达式 3. 对于 while 循环, break 结束后, 执行 while 循环后面的语句.

continue

程序示例:

public class Continue {
public static void main(String[] args) {
abc1:
for (int i = 0; i < 2; i++) {
abc2:
for (int j = 0; j < 5; j++) {
if (j == 2)
// continue; // 等价于 continue abc2;
continue abc1; // 结束外层 for 循环
System.out.println(j);
}
}
}
}

执行结果:

0
1
0
1

对于 for 循环, continue 结束后, 执行 for 循环头中的表达式 3, 再执行判断条件, 判断是否继续循环. 对于 while 循环, continue 结束后, 执行 while 循环头的判断表达式.

posted @   有空  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示