1、概述
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。
流程控制语句分类:
- 顺序结构
- 分支结构
- 循环结构
2、顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
顺序结构执行流程图:
例子:
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
语句
格式1:
if (关系表达式) {语句体;
}
【注意】
- 如果大括号中的语句体只有一条,那么大括号可以省略不写;但是不建议省略
- 大括号开头可以另起一行书写(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是闰年
格式2:
if (关系表达式) {语句体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
结束
格式3:
if (关系表达式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 (表达式) {case 值1:语句体1;break;case 值2:语句体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;}}}
}