java的流程控制
用户交互的Scanner
实现人机交互,通过Scanner类来获取用户的输入
基本语法:
Scanner s = new Scanner(System.in)
通过Scanner类的next()与nextLine()方法来获取输入的字符串,在读取前我们一般需要,使用hasNext()与hasNextLine()判断是否还有输入的数据
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
//创建scaner对象,用于接收键盘数据
/*
使用next()与nextline()方法接收是有区别的
1.next(): 一定要读取到有效字符才可以结束输入
对输入的有效字符之前遇到的空白,next()方法1会自动将其去掉
只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
next()不能得到带有空格的字符串
2.nextLine() : 以enter为结束符,也就是说nextline()方法返回的是输入回车前的所有字符
可以获得空白
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请用nextline()接收:");
if (scanner.hasNext()){
String str = scanner.nextLine();
System.out.println("输出内容为:"+ str);
}
//一般使用scanner对象后,需要使用scaner.close()方法关闭
scanner.close();
}
}
//Scanner的进阶使用
import java.util.Scanner;
public class Demo07{
public static void main(String[] args) {
//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车键确认,通过输入非数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
int m = 0;
//通过输入循环判断是否还有输入,并在里面对每一次进行求和与统计
while (scanner.hasNextDouble()){
double x = scanner.nextDouble();
m = m+1;
sum = sum + x;
System.out.println("你输入了第"+m+"个数据,然后当前结果sum="+sum);
}
System.out.println(m+"个数的和为:"+sum);
System.out.println(m + "个数的平均值是" + (sum/m));
}
}
在
while
循环中,scanner.hasNextDouble()
和scanner.nextDouble()
的配合使得每次循环读取到的double
值会被累加到sum
中,并且m
变量会记录输入的数据个数。这样,每次循环的累积结果会影响到下一次循环的输出。具体原因如下:
- 变量作用域:在
while
循环体内声明和修改的变量(如sum
和m
)是循环外部变量的引用,这意味着它们在每次循环迭代中会保持上一次迭代的值。- 累加机制:
sum
用于累加输入的所有double
值,因此每次读取新的double
值后,它都会被加到sum
上,更新了sum
的值。m
记录了输入的数据个数,每次循环时m
增加 1,以保持对输入数据数量的跟踪
选择结构
if(布尔表达式){
//如果布尔表达式为true则执行语句
}
if的多选择结构
if(布尔表达式){
//如果布尔表达式为true则执行语句
}else if(布尔表达式){
//如果布尔表达式为true则执行语句
}else{
}
switch选择结构
switch(expression){
case value :
//语句
break;
case value :
break;
//你可以选择任意数量的case语句
default : //可选
//语句
}
循环结构
while循环
while(布尔表达式){
//循环内容
}//只要布尔表达式为true,循环就会一直循环下去
do while循环
do{
//布尔表达式
}while(布尔表达式);
while与do while 的区别
- while 先判断后执行,do while是先执行后判断
- do while z总是保证循环体被执行一次
for 循环
for(初始化值;布尔表达式;更新){
//代码语句
}
for循环的快捷输入,直接输入要循环的次数,比如100.for输入就能自动帮你形成循环100次的语句体
可以尝试以下练习:
public class Demo11 {
public static void main(String[] args) {
//练习1:计算0到100之间的奇数和与偶数和
int oddSum = 0;
int evenSum = 0;
for(int i = 0;i<=100;i++){
if(i%2 != 0){
//奇数和
oddSum += i;
}else{
//偶数和
evenSum += i;
}
}
System.out.println("奇数和:"+ oddSum);
System.out.println("偶数和:"+evenSum);
}
}
public class Demo12 {
public static void main(String[] args) {
int count = 0; // 计数器,用于每行输出的数目
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
count++;
if (count % 3 == 0) {
System.out.println();
}
}
}
}
}
/**
public class Demo12 {
public static void main(String[] args) {
//用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个
for (int i = 0; i < 1000; i++) {
if (i % 5 == 0){
System.out.print(i + "\t");
}
if (i%(5*3)==0){
System.out.println();
}
}
}
}*/
- 变量
count
用于跟踪每行输出的数字数量。if (i % 5 == 0)
检查数字是否能被 5 整除。- 每当
count
达到 3 的倍数时,打印一个换行符以开始新的一行。
用for循环打印99乘法表
public class Demo13 {
public static void main(String[] args) {
//打印行数
for (int j = 1; j<= 9; j++) {
//打印列
for (int i = 1; i <= j; i++) {
System.out.print(i+"*"+j+"="+(j*i) + "\t");
}
System.out.println();
}
}
}
解释:先用外循环for打印行数,再用内循环打印列数,当j=1时,进入第一次循环,执行内循环
- 初始化:
j
被初始化为 1,开始外循环。
- 第一层循环(外循环):
- 当
j = 1
时,进入内循环。
- 当
- 第二层循环(内循环):
i
在这里被初始化为 1。- 判断条件
i <= j
(此时i = 1
,j = 1
)为真。 - 执行乘法运算并输出结果,即
1*1=1
。 - 内循环结束后,
i
自增 1,此时i = 2
。
- 退出内循环:
- 检查
i <= j
的条件,现在i = 2
和j = 1
,条件为假。 - 由于
i
不再小于或等于j
,内循环结束。
- 检查
- 执行换行:
- 完成内循环的输出后(也就是一行的输出),执行换行语句以开始下一行的输出。
每次退出内循环,i都会从1重新开始
练习
public class Demo14 {
public static void main(String[] args) {
//打印1011到150之间的所有质数
//质数是指在大于1,除了1和它本身以外不再有其他因数的自燃数
int count = 0;
outer:for (int i =101;i<150;i++){
for (int j = 2; j < i/2; j++) {
if (i % j ==0){
continue outer;
}
}
System.out.println(i+" ");
}
}
}
//外层循环遍历101到149之间的每个数字。
//内层循环检查当前数字i是否可以被2到i/2之间的任何数字整除。如果能整除,则i不是质数,跳过当前循环的外层循环继续下一个i。
//如果i不能被2到i/2之间的任何数字整除,则i是质数,打印出来。
//注意:i < i/2 应改为 j <= i/2 以确保能正确判断质数。
打印三角形练习
public class Demo15 {
public static void main(String[] args) {
for (int i = 1; i <= 50; i++) {
for(int j = 50;j>=i;j--){
System.out.print(" " );
}
for (int j = 1;j <=i;j++){
System.out.print("*");
}
for (int j =1;j<i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
这段代码打印了一个由星号(
*
)组成的三角形图案。具体来说:
- 外层的
for
循环控制行数,共有 50 行。- 第一个内层
for
循环打印前导空格,使星号居中对齐。- 第二个内层
for
循环打印前半部分的星号。- 第三个内层
for
循环打印后半部分的星号。因此,它在控制台输出的将是一个左右对称的三角形图案。
增强for循环
增强
for
循环(也称为 “for-each” 循环)是一种简化遍历集合或数组的方式。它的语法如下:
for (type variable : collection) {
// 使用 variable
}
public class Example {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}
}
}
在这个例子中,number
变量依次取 numbers
数组中的每个值,从而打印出数组的所有元素。增强 for
循环简化了遍历过程,但不允许在遍历过程中修改集合或数组。
break continue
- break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句
- continue语句用于循环体中,用于终止某次循环过程,即跳过循环体中未执行的语句,接着进行下一次是否执行循环的语句
break:
public class BreakExample {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当 i 等于 5 时,退出循环
}
System.out.println(i);
}
System.out.println("Loop exited.");
}
}
输出
continue:
public class ContinueExample {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过当前迭代,继续下一次循环
}
System.out.println(i);
}
}
}
输出
}
}
**输出**
[外链图片转存中...(img-LNEZeDjV-1726315891613)]
**continue:**
```java
public class ContinueExample {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过当前迭代,继续下一次循环
}
System.out.println(i);
}
}
}
输出