欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【JavaSE-4】程序逻辑控制

【JavaSE-4】程序逻辑控制

2025/4/18 9:40:35 来源:https://blog.csdn.net/m0_49005434/article/details/146006116  浏览:    关键词:【JavaSE-4】程序逻辑控制

1、概述

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。

流程控制语句分类:

  • 顺序结构
  • 分支结构
  • 循环结构

2、顺序结构

顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。

顺序结构执行流程图:

image.png

例子:

public class Main{public static void main(String[] args){System.out.println("aaa");System.out.println("bbb");System.out.println("ccc");}
}

运行结果是aaa bbb ccc,如果调整打印顺序,则结果也不同。

3、分支结构

3.1、if语句

格式1if (关系表达式) {语句体;	
}

【注意】

  • 如果大括号中的语句体只有一条,那么大括号可以省略不写;但是不建议省略
  • 大括号开头可以另起一行书写(C语言格式),但是建议写在第一行末尾(java格式)。

执行流程图:

例子1:

判断一个年份是否是闰年。

1、能被 4 整除且不能被 100 整除

2、能被 400 整除

【代码示例】

import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入年份:");int year = scanner.nextInt();if((year % 4 == 0 && year % 400 != 0) || year % 400 == 0){System.out.println(year + "是闰年");//字符串的拼接}}
}

【运行结果】

请输入年份:
2024
2024是闰年

格式2if (关系表达式) {语句体1;	
} else {语句体2;	
}

执行流程图:

例子2:

判断两个值的大小

【代码示例】

public class Main{public static void main(String[] args) {System.out.println("开始");		//定义两个变量int a = 10;int b = 20;//需求:判断a是否大于b,如果是,在控制台输出:a的值大于b,否则,在控制台输出:a的值不大于bif(a > b) {System.out.println("a的值大于b");} else {System.out.println("a的值不大于b");}		System.out.println("结束");}
}

【运行结果 】

开始
a的值不大于b
结束

格式3if (关系表达式1) {语句体1;	
} else if (关系表达式2) {语句体2;	
}else {语句体n+1;
}

执行流程图:

例子3:

判断一个数字是正数,负数,还是零。

【代码示例】

import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个数字:");int num = scanner.nextInt();if(num > 0){System.out.println(num + "是一个正数");}else if(num < 0){System.out.println(num + "是一个负数");}else {System.out.println(num + "是零");}}
}

3.1.1、悬垂 else 问题

例子4:

public static void main(String[] args) {int x = 10;int y = 10;if (x == 10)if (y == 10)System.out.println("aaa");elseSystem.out.println("bbb");
}

【运行结果】

aaa

上述代码实际的样子应该如下所示:

public static void main(String[] args) {int x = 10;int y = 10;if (x == 10){if (y == 10)System.out.println("aaa");elseSystem.out.println("bbb");}
}

如果遇到不加括号情况,也就是悬空else,此时的else和最近if匹配在一起。

例子5:

public static void main(String[] args) {int x = 10;int y = 10;if (x > 10)if (y == 10)System.out.println("aaa");elseSystem.out.println("bbb");
}

此时运行结果为空。

3.2、switch语句

格式:
switch (表达式) {case1:语句体1;break;case2:语句体2;break;...default:语句体n+1;break;
}

执行流程:

  • 首先计算出表达式的值
  • 其次,和case后的值依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

不能做switch 后括号表达式的数据类型有哪些?

1、floot

2、double

3、long

4、boolean

但是字符串也可以作为参数

例子:

String a = "hello";
switch(a){case "1":System.out.println(a);break;case "2":System.out.println(a);break;case "3":System.out.println(a);break;default:System.out.println(a);break;
}

【运行结果】

注意事项

  • 多个case后的常量值不可以重复。
  • switch括号内只能是以下类型表达式:
    • 基本数据类型:byte char short int
    • 引用数据类型:String 常量串,枚举类型
  • switch可以支持嵌套,但是一般不推荐。
  • default的位置可以在任意,不会影响代码执行,不过习惯写在最下面。
  • case有穿透,如果不写break会出现穿透现象。

JDK12中的新特性:

int number = 10;
switch (number) {case 1 -> System.out.println("一");case 2 -> System.out.println("二");case 3 -> System.out.println("三");default -> System.out.println("其他");
}

例子:

键盘输入星期数,输出工作日,休息日。

【代码示例】

import java.util.Scanner;
public class Main{public static void main(String[] args){//1.键盘录入星期数Scanner sc = new Scanner(System.in);System.out.println("请输入星期");int week = sc.nextInt();//3//2.利用switch进行匹配//利用case穿透简化代码switch (week){case 1:case 2:case 3:case 4:case 5:System.out.println("工作日");break;case 6:case 7:System.out.println("休息日");break;default:System.out.println("没有这个星期");break;}}}

用JDK12新特性进行编写

import java.util.Scanner;
public class Main{public static void main(String[] args){//键盘录入星期数Scanner sc = new Scanner(System.in);System.out.println("请输入星期");int week = sc.nextInt();//3switch (week) {case 1, 2, 3, 4, 5 -> System.out.println("工作日");case 6, 7 -> System.out.println("休息日");default -> System.out.println("没有这个星期");}}
}

4、循环结构

4.1、while循环

初始化语句;
while(条件判断语句){循环体;条件控制语句;
}

条件判断语句为true,则执行循环语句,否则结束循环


例子1:

打印1~10数字

【代码示例】

int num = 1;
while(num <= 10){System.out.print(num+" ");//print表示不换行,println表示换行num++;
}

【运行结果】

1 2 3 4 5 6 7 8 9 10 

例子2:

求1~100的和

【代码示例】

int sum = 0;
int num = 1;
while(num <= 100){sum += num;num++;
}
System.out.println(sum);

【运行结果】

5050

例子3:

求5!

【代码示例】

int num = 1;
int ret = 1;
while(num <= 5){ret *= num;num++;
}
System.out.println(ret);

【运行结果】

120

例子4:

求1!+2!+3!+4!+5!+6!

【代码示例】

int key = 1;//表示加到几的阶乘
int sum = 0;//表示最后的阶乘之和
while(key <= 6){int num = 1;int ret = 1;while(num <= key){ret *= num;num++;}key++;sum += ret;
}
System.out.println(sum);

【运行结果】

873

例子5:

需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围),将两数相除,要求不使用乘法、除法和 % 运算符。得到商和余数。

public static void main(String[] args) {/* 分析:被除数 / 除数 = 商 ... 余数int a = 100;int b = 10;100 - 10 = 9090 - 10 = 8080 - 10 = 7070 - 10 = 60...10 - 10 = 0 (余数)*///1.定义变量记录被除数int dividend = 100;//2.定义变量记录除数int divisor = 37;//3.定义一个变量用来统计相减了多少次int count = 0;//4.循环 while//在循环中,不断的用被除数 - 除数//只要被除数 是大于等于除数的,那么就一直循环while(dividend >= divisor){dividend = dividend - divisor;//只要减一次,那么统计变量就自增一次count++;}//当循环结束之后dividend变量记录的就是余数System.out.println("余数为:" + dividend);//当循环结束之后,count记录的值就是商System.out.println("商为:" + count);
}

4.2、for循环

for(初始化语句1;条件判断语句2;条件控制语句3){表达式4;
}
  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
  • 表达式2: 循环条件,满足则循环继续,否则循环结束
  • 表达式3: 循环变量更新方式

执行顺序:

1->2->4->3------2->4->3------2->4->3------2->4->3------2->4->3------

例子1:

求1!+2!+3!+4!+5!

【代码示例】

int ret = 0;
for (int i = 1; i <= 5; i++) {int sum = 1;for (int j = 1; j <= i; j++) {sum *= j;}ret += sum;
}
System.out.println(ret);//153

例子2:

键盘录入两个数字,表示一个范围。

统计这个范围中。既能被3整除,又能被5整除数字有多少个?

【代码示例】

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个数字:");int num1 = scanner.nextInt();System.out.println("请输入第二个数字:");int num2 = scanner.nextInt();int ret = 0;for(int i = num1;i <= num2;i++){if(i % 3 == 0 && i % 5 == 0){System.out.print(i + " ");ret++;}}System.out.println();System.out.println("总共符合条件的数字有:" + ret);
}

【运行结果】

请输入第一个数字:
1
请输入第二个数字:
100
15 30 45 60 75 90 
总共符合条件的数字有:6

【总结】:

  • 知道循环次数或者循环范围的时候,用for循环。
  • 不知道循环次数,也不知道循环范围,但知道循环的结束条件时,用while循环。

4.3、do while循环

初始化语句;
do{循环体;条件控制语句;
}while(条件判断语句);

先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束 。

先执行,后判断,至少会执行一次代码!!

4.4、break

break的功能是让循环提前结束。不能单独存在,可以用在switch和循环中

例子:

int num = 100;
while(num <= 300){if(num % 3 == 0){System.out.println("100~300的第一个3的倍数是:"+ num);break;}num++;
}

【运行结果】

100~300的第一个3的倍数是:102

4.5、continue

continue 的功能是跳过这次循环, 立即进入下次循环。不能单独存在的。只能存在于循环当中

例子:

//求出100~300既能被3整除,也能被4整除的数字
//方法1:
/*int num = 100;
while(num <= 300){if(num % 3 == 0 && num % 4 == 0){System.out.print(num+" ");}num++;
}*/
//方法2:
int num = 100;
while(num <= 300){if(num % 3 != 0 || num % 4 != 0){num++;continue;//说明num不满足,则进行下轮循环,不打印}System.out.print(num+" ");num++;
}

【运行结果】

108 120 132 144 156 168 180 192 204 216 228 240 252 264 276 288 300 

4.6、无限循环

也称死循环,即循环一直停不下来

for格式

for(;;){System.out.println("循环执行一直在打印内容");
}

解释:

初始化语句可以空着不写,表示循环之前不定义任何的控制变量。

条件判断语句可以空着不写,如果不写,默认表示true,循环一直进行。

条件控制语句可以空着不写,表示每次循环体执行完毕后,控制变量不做任何变化。

while格式

while(true){System.out.println("循环执行一直在打印内容");
}

解释:小括号里面就不能省略了,true一定要写出来,否则代码会报错。

do…while格式

do{System.out.println("循环执行一直在打印内容");
}while(true);

解释:小括号里面就不能省略了,true一定要写出来,否则代码会报错。

【注意事项】

  • 最为常用的格式:while
  • 无限循环下面不能再写其他代码了,因为永远执行不到。

5、输入 输出

5.1、输出到控制台

基本语法:

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出,和C语言相同

对于格式化输出的format可以参考下面表格:

5.2、从键盘输入

/*
输入需要导入包 import java.util.Scanner;
*/
Scanner scan = new Scanner(System.in);System.out.println("请输入你的姓名:");
String name = scan.nextLine();//nextLine读入一行,next是遇到空格结束
//String name = scan.next( );//遇到空格就结束
System.out.println("姓名:"+name);System.out.println("输入一个整数:");
int age = scan.nextInt();//读入一个int类型的整数
System.out.println("年龄:"+age);System.out.println("请输入您的工资:");
float salary = scan.nextFloat();//读入一个float类型的数据
System.out.println("工资"+salary);scan.close();//认为scan是一个资源

运行结果:

请输入你的姓名:
李明
姓名:李明
输入一个整数:
24
年龄:24
请输入您的工资:
8500
工资8500.0

但是因为nextLine()会读入回车,如果在其之前有输入,那么会直接跳过这个输入:

解决办法:可以在这之间增加一个nextLine()用来接收这个回车。

5.3、读取多组数据

public static void main(String[] args) {Scanner scan = new Scanner(System.in);while(scan.hasNextInt()){//是否有下一个整数int age = scan.nextInt();System.out.println(age);}//将多组输入停下来,在IDEA中使用ctrl+d
}

对应读取不同的数据类型需要使用不同的函数,读取整数使用scan.hasNextInt(),读取浮点数使用scan.hasNextFloat()

注意事项:

当循环输入多个数据的时候, 使用ctrl + z来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl +d)

6、猜数字游戏

游戏规则:

系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 “低了”, 如果输入的数字比该随机数大, 提示 “高了” , 如果输入的数字和随机数相等, 则提示 “猜对了” .

6.1、随机数的生成

java帮我们写好一个类Random,这个类可以生成一个随机数。

使用步骤:

1.导包

import java.util.Random;
导包的动作必须出现在类定义的上边。

2.创建对象

Random random = new Random ();
上面这个格式里面,只有random是变量名,可以变,其他的都不允许变。

3.生成随机数

int number = random.nextInt(随机数的范围);
上面这个格式里面,只有number是变量名,可以变,其他的都不允许变。
随机数范围的特点:从0开始,不包含指定值。比如:参数为10,生成的范围[0,10)

【注意】:

对于生成任意数到任意数的随机数方法

  • 让这个范围从头到尾减去一个值,使得范围从0开始。
  • 尾巴范围+1,作为参数放到类中。
  • 最终结果,加上第一步减去的值。

6.2、完整代码

import java.util.Random;
import java.util.Scanner;
public class Test02 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);Random random = new Random();//为了生成随机数int randNum = random.nextInt(101);//[0,101)//50-100的随机数生成,random.nextInt(51)--[0,51)+50--->[50,101)while(true){System.out.println("请输入你要猜的数字:");int num = scan.nextInt();if(num > randNum){System.out.println("猜大了");}else if(num < randNum){System.out.println("猜小了");}else{System.out.println("猜对了!!");break;}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com