1. 三种循环结构
三种循环 ▶ while结构:在指定条件为真时重复执行某个代码块的循环结构 while循环只有一个循环条件,当条件为真时循环执行代码块,直到条件为假为止 ▶ do…while结构:在指定条件为真时重复执行某个代码块的循环结构 do-while循环至少会执行一次代码块,然后再判断循环条件 ▶ for结构:在指定条件满足时重复执行某个代码块的循环结构 |
2. while循环
(1) while循环结构
语法:while (条件语句) {语句体}
while循环三要素: 1. 循环变量的初始化;
2. 循环条件;
3. 循环变量的改变
- 执行示例
- 格式
// 循环变量初始化
while (循环条件) {
// 循环执行的代码块;
// 条件控制语句;
}
- 代码演示
package bases;
import java.util.Random;
import java.util.Scanner;
public class Demo04_Loop {
public static void main(String[] args) {
/*
* while循环
*/
Scanner scanner = new Scanner(System.in);
int times = 5;
int num = 0;
while (num < times) {
System.out.println("循环第" + (num + 1) + "次");
num++;
}
// 判断一个数是否为素数
System.out.print("请输入需要判断的数:");
int nums = scanner.nextInt();
boolean isPrime = true;
int i = 2;
while (i <= nums / 2) {
if (nums % i == 0) {
isPrime = false;
break;
}
i++;
}
if (isPrime) {
System.out.println(nums + " 是素数");
} else {
System.out.println(nums + " 不是素数");
}
// 案例:猜数
Random random = new Random();
// 生成一个随机数
int hide = random.nextInt(101);
// 用户输入所猜的数
System.out.print("请输入要猜的数:");
int guess = scanner.nextInt();
while (guess != hide) {
String flag = guess > hide ? "猜大了" : "猜小了";
System.out.println(flag);
guess = scanner.nextInt();
}
System.out.println("恭喜你,猜对了");
}
}
(2)do…while循环结构
语法:do {
循环体语句;
条件控制语句;
} while (条件判断语句);
do…while特点: 先无条件执行一次代码块,再进行条件判断
- 执行示例
- 格式
do {
// 循环执行的代码块
} while (循环条件);
- 代码演示(三元运算符版本)
package bases;
import java.util.Random;
import java.util.Scanner;
public class Demo04_Loop {
public static void main(String[] args) {
/*
* do…while循环
*/
// do…while猜数
Random random = new Random();
// 生成一个随机数(1~100)
int hide = random.nextInt(101);
// 用户输入所猜的数
System.out.print("请输入要猜的数:");
int guess = scanner.nextInt();
do {
String flag = guess > hide ? "猜大了" : "猜小了";
System.out.println(flag);
guess = scanner.nextInt();
} while (guess != hide);
// 猜对语句在循环外
System.out.println("恭喜你,猜对了");
}
}
- 代码演示(if版本)
package bases;
import java.util.Random;
import java.util.Scanner;
public class Demo04_Loop {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 案例:猜数
Random random = new Random();
// 生成一个随机数
int hide = random.nextInt(101);
/*
* do…while循环
*/
int guess;
do {
System.out.print("请输入要猜的数:");
guess = scanner.nextInt();
if (guess > hide){
System.out.println("猜大了");
} else if (guess < hide) {
System.out.println("猜小了");
} else {
// 猜对语句在循环内
System.out.println("恭喜你,猜对了");
}
} while (guess != hide);
}
}
- 区别
- while和do…while的区别
while:先做判断再执行(可能不执行语句块)
do…while:先执行在判断,(语句块必须执行一次)
3. for循环结构
语法:for (初始化语句;条件判断语; 更新语句) {
功能语句体;
}
执行流程:
1.执行初始语句
2.执行条件判断语句
false,循环结束
true,循环执行
3.执行循环体语句
4.执行条件控制语句
5.返回第二步
- 执行示例
- 格式
for (初始化语句; 条件判断语; 更新语句) {
// 循环执行的代码块
}
- 代码演示
package bases;
import java.util.Random;
import java.util.Scanner;
public class Demo04_Loop {
public static void main(String[] args) {
/*
* for循环
*/
// 1到100之间的所有偶数的总和
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
sum += i;
}
}
System.out.println("偶数总和为:" + sum);
// 计算5的阶乘
int factorial = 1;
for (int i = 1; i <= 5; i++) {
factorial *= i;
}
System.out.println("5的阶乘为:" + factorial);
// 输出乘法表
int mul;
for (int x = 1; x <= 9; x++) {
for (int y = 1; y <= x; y++) {
mul = x * y;
String equation = String.format("%d × %d = %d", x, y, mul);
System.out.print(equation + "\t");
}
System.out.println();
}
}
}
4. 循环结构的选择
循环嵌套 ▶ while结构:循环的初始量和循环的更新改变不同 ▶ do…while结构:循环的初始量和循环的更新改变相同 ▶ for结构:一般与次数有关,即已知需要循环的次数 |
5. 循环的嵌套结构
是否与次数有关 ▶ 循环中嵌套循环,多行多列(外层控制行,内层控制列)时使用 ▶ 执行规则:外层执行一次时,内层执行一遍 ▶ 建议:嵌套越少越好(能用一层不用两层,能用两层不用三层) ▶ break和continue:break默认只能跳出当前一层,continue用于跳过循环体中剩下的语句,进而执行下一次循环 |
- 代码演示(小学+,-,*,/随机计算题,随机出题)
package bases;
import java.awt.geom.QuadCurve2D;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;
public class Demo04_Loop {
public static void main(String[] args) {
/*
* 循环嵌套
*/
Random random = new Random();
Scanner scanner = new Scanner(System.in);
// 随机运算出题
int score = 0;
System.out.print("请输入第一个数最大范围:");
int num = scanner.nextInt();
System.out.print("请输入第二个数最大范围:");
int nums = scanner.nextInt();
System.out.print("请输入出题数:");
int number = scanner.nextInt();
// 错题统计
int f = 1;
// 四舍五入保留一位小数decimalFormat.format(number);
DecimalFormat decimalFormat = new DecimalFormat("#.#");
System.out.print("提示:除法除不尽的保留一位小数,如4.55,保留后为4.6");
for (int a = 1; a <= number; a++) {
double n = random.nextInt(num);
// 0不作除数
double m = random.nextInt(nums) + 1;
// 随机类型出题
int types = random.nextInt(4) + 1;
double result = 0.0;
// 除法结果
switch (types) {
case 1:
System.out.printf("第%d题 题目:%s + %s = ? ", a, decimalFormat.format(n), decimalFormat.format(m));
result = n + m;
break;
case 2:
System.out.printf("第%d题 题目:%s - %s = ? ", a, decimalFormat.format(n), decimalFormat.format(m));
result = n - m;
break;
case 3:
System.out.printf("第%d题 题目:%s × %s = ? ", a, decimalFormat.format(n), decimalFormat.format(m));
result = n * m;
break;
case 4:
System.out.printf("第%d题 题目:%s ÷ %s = ? ", a, decimalFormat.format(n), decimalFormat.format(m));
result = Double.parseDouble(decimalFormat.format((n / m)));
break;
}
System.out.print("请输入当前题目的答案:");
double answer = scanner.nextDouble();
if (result == answer) {
System.out.println("恭喜你答对了!");
score += 10;
System.out.println("当前得分:" + score);
} else {
f += 1;
System.out.println("哦!答错了哟,别灰心继续答下一个题");
System.out.println("正确答案:" + result);
System.out.println("f=" + f + "n=" + number);
if (f > number) {
System.out.println("最后一题正确答案:" + result);
System.out.println("哦!竟然一个题都没答对");
}
}
}
System.out.println("本次得分:" + score);
}
}