流程控制语句
1 键盘录入
键盘输入(Scanner)使用的是引用数据类型
引用数据类型使用的一般步骤:
-
导包 import java.util.Scanner
-
创建变量 引用数据类型 变量名 = new 引用数据类型(参数);
-
使用变量 变量名.方法名();
public static void main(String[] args) { // 创建变量 Scanner s = new Scanner(System.in); System.out.println("请输入一个整数:"); // 使用变量 int a = s.nextInt(); // byte b = s.nextByte(); // s.nextDouble(); System.out.println(a); // String str = "哈哈"; System.out.println("请输入一个字符串:"); String string = s.next(); System.out.println(string); }
2 流程控制语句
2.1 概述
在一个程序执行的过程中,各条语句的执行顺序对程序的结果有直接的影响。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
-
分类
-
顺序结构
-
选择结构
-
循环结构
-
2.2 顺序结构
顺序结构是最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行。程序中大多数的代码都是这样执行的。
int a = 10; a = 30; a = 20; System.out.println(a);
-
顺序结构的流程图
2.3 选择结构
2.3.1 概述
-
选择结构也称之为分支结构
-
选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断。逻辑运算的结构有两个,所以产生选择,按照不同的选择执行不同的代码。
-
java语言提供了两种选择结构语句
-
if语句
-
switch语句
-
2.3.2 if语句
2.3.2.1 if语句格式一
-
格式
if (布尔表达式){ 语句体; }
-
执行流程
-
-
首选判断布尔表达式的结果是true还是false -
如果是true,就执行语句体
-
如果是false,就不执行语句体
-
-
流程图
-
注意:如果if语句的{}中只有一行代码,可以省略大括号
public static void main(String[] args) { System.out.println("一天晚上没事干,在大街上溜达"); System.out.println("走到一个成人娱乐场所"); System.out.println("请输入您的年龄:"); Scanner scanner = new Scanner(System.in); int age = scanner.nextInt(); if (age >= 18){ System.out.println("出示身份证"); System.out.println("上机"); System.out.println("上号"); System.out.println("开始打游戏"); System.out.println("挂机骂人"); System.out.println("下机"); } System.out.println("没意思,回家睡觉"); }
2.3.2.2 if语句格式二
-
格式
if (布尔表达式){ 语句体1; }else { 语句体2; }
-
执行流程
-
首先判断布尔表达式的结果是true还是false
-
如果是true,就执行语句体1
-
如果是false,就执行语句体2
-
-
流程图
public static void main(String[] args) { // 输入一个整数,判断是奇数还是偶数 Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); if (num % 2 == 0){ System.out.println(num + ":是偶数"); }else { System.out.println(num + ":是奇数"); } }
2.3.2.3 if语句格式三
-
格式
if (布尔表达式1){ 语句体1; }else if(布尔表达式2){ 语句体2; }else if(布尔表达式3){ 语句体3; }... else if(布尔表达式n){ 语句体n; }else{ 语句体n+1; }
-
执行流程
-
首先判断布尔表达式1的结果是true还是false
-
如果是true就执行语句体1
-
如果是false就继续判断布尔表达式2的结果是true还是false
-
如果是true就执行语句体2
-
如果是false就继续判断布尔表达式3的结果是true还是false
-
...
-
如果所有的布尔表达式全部都是false,执行语句体n+1
-
-
流程图
public static void main(String[] args) { // 根据用户的年龄,输出所在的阶段 Scanner scanner = new Scanner(System.in); System.out.println("请输入您的年龄"); int age = scanner.nextInt(); if (age > 0 && age <= 1){ System.out.println("婴儿"); }else if (age > 1 && age <= 7){ System.out.println("幼儿"); }else if (age > 7 && age <= 12){ System.out.println("儿童"); }else if (age > 12 && age <= 18){ System.out.println("少年"); }else if (age > 18 && age <= 35){ System.out.println("青年"); }else if (age > 35 && age <= 65){ System.out.println("中年"); }else if (age > 65 && age <= 110){ System.out.println("老年"); }else { System.out.println("您输入的年龄不合法"); } }
课堂练习:
-
x和y的关系满足如下:
x >= 3 y = 2x + 1; -1 < x < 3 y = 2x; x <= -1 y = 2x - 1;
根据给定的x的值,计算出y的值并输出
// 获取x的值 Scanner scanner = new Scanner(System.in); int x = scanner.nextInt(); int y; if (x >= 3){ y = 2 * x + 1; }else if (x > -1 && x < 3){ y = 2 * x; }else{ y = 2 * x - 1; } System.out.println("y的值是" + y);
-
根据用户输入的月份,输出正确的季节
public static void main(String[] args) { // 根据用户输入的月份,输出正确的季节 Scanner scanner = new Scanner(System.in); int month = scanner.nextInt(); if (month >= 3 && month <= 5){ System.out.println("春天去赏花"); }else if (month >= 6 && month <= 8){ System.out.println("夏天去游泳"); }else if (month >= 9 && month <= 11){ System.out.println("秋天去钓鱼"); }else if (month == 12 || month == 1 || month == 2){ System.out.println("冬天打雪仗"); }else { System.out.println("输入的月份不对"); } }
2.3.3 switch语句
-
格式
switch(表达式){ case 目标值1: 语句体1; break; case 目标值2: 语句体2; break; ... default: 语句体n+1; break; }
-
格式解释:
-
switch表示这是一个switch语句
-
表达式的类型:byte,short,int,char
-
JDK5之后可以是枚举
-
JDK7以后可以是String
-
case后面跟的是要和表达式进行比较的值
-
语句体是一条或者多条语句
-
break表示中断,结束的意思,可以立即结束switch语句
-
default语句表示所有情况都不匹配时执行的语句
-
-
流程图
-
-
注意事项:
-
switch中的语句,顺序不影响最终的结果
-
case具有穿透效果,如果没有break的影响,那么会一直向下执行
-
public static void main(String[] args) { int i = 2; switch (i){ case 3: System.out.println("3月下扬州"); break; case 6: System.out.println("6月小雨"); break; case 9: System.out.println("9月去喝啤酒"); break; default: System.out.println("来郑州玩方特"); break; } }
-
根据用户输入的数值,显示对应星期几
public static void main(String[] args) { // 获取用户输入的数值 Scanner scanner = new Scanner(System.in); int weekday = scanner.nextInt(); // 判断数字,输出星期几 switch (weekday){ case 1: System.out.println("周一"); break; case 2: System.out.println("周二"); break; case 3: System.out.println("周三"); break; case 4: System.out.println("周四"); break; case 5: System.out.println("周五"); break; case 6: System.out.println("周六"); break; case 7: System.out.println("周日"); break; default: System.out.println("输入有误"); break; } }
-
根据用户输入的月份,显示正确的季节
public static void main(String[] args) { // 根据用户输入的月份,显示正确的季节 Scanner scanner = new Scanner(System.in); int month = scanner.nextInt(); switch (month){ case 3: case 4: case 5: System.out.println("春天"); break; case 6: case 7: case 8: System.out.println("夏天"); break; case 9: case 10: case 11: System.out.println("秋天"); break; case 12: case 1: case 2: System.out.println("冬天"); break; default: System.out.println("输入有误"); break; } }
public static void main(String[] args) { // 根据用户输入的月份,显示正确的季节 Scanner scanner = new Scanner(System.in); int month = scanner.nextInt(); switch (month){ case 3,4,5: System.out.println("春天"); break; case 6,7,8: System.out.println("夏天"); break; case 9,10,11: System.out.println("秋天"); break; case 12,1,2: System.out.println("冬天"); break; default: System.out.println("输入有误"); break; } }
public static void main(String[] args) { // 获取用户输入的城市 Scanner scanner = new Scanner(System.in); String cityName = scanner.next(); String provinceName = switch (cityName){ case "郑州","洛阳","开封" -> { System.out.println("中原地带"); yield "河南省"; } case "武汉" -> "湖北省"; case "深圳" -> "广东省"; case "张家口" -> "河北省"; default -> "妈妈省的"; }; System.out.println(provinceName); }
2.4 循环结构
2.4.1 概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码就称之为循环体语句。
2.4.2 循环语句的组成
-
初始化表达式
-
一条或者多条语句,这些语句完成一些初始化操作
-
-
布尔表达式
-
这个表达式决定是否要执行循环体
-
-
循环体
-
就是我们要多次执行的事情
-
-
步进表达式
-
这个部分在一次循环体结束后,下一次循环判断条件执行前执行.通过用于控制循环条件中的变量,使得循环在合适的时候结束。
-
2.4.3 循环结构for
-
格式
for (初始化表达式1;布尔表达式2;步进表达式4){ 循环体3; }
-
执行顺序: 1 2 3 4 2 3 4 ....2不满足为止
-
流程图
练习:打印100次HelloWorld
// 打印100次HelloWorld for (int i = 1;i <= 100;++i){ System.out.println("HelloWorld" + i); }
-
打印输出5-1
// 打印输出5-1 for (int i = 5;i >= 1;i--){ System.out.println(i); }
-
求1-100之间的偶数和
// 求1-100之间的偶数和 // 获取1-100之间所有的偶数 // 定义变量代表和 int sum = 0; for (int i = 1;i <= 100;i++){ // 判断i是否是偶数 if (i % 2 == 0){ sum += i; } } System.out.println("和是" + sum);
-
统计所有的”水仙花数“有多少个
-
"水仙花数"是一个三位数,其个数的立方+十位的立方+百位的立方 等于其本身
-
153 = 3 * 3 * 3 + 5 * 5 * 5 + 1 = 126 + 27 = 153
-
// 定义变量,表示计数器 int count = 0; // 统计所有的”水仙花数“有多少个 for (int i = 100;i < 1000;i++){ // 求个位 十位和 百位 int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100; if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i){ System.out.println("水仙花数是" + i); count++; } } System.out.println("水仙花数有" + count + "个");
2.4.4 循环结构while
-
基本格式:
while (布尔表达式){ 循环体语句; }
-
扩展格式
初始化表达式1; while (布尔表达式2){ 循环体语句3; 步进表达式4; }
-
执行顺序: 1 2 3 4 2 3 4 ....2不满足为止
-
流程图
-
练习:
-
统计水仙花数有多少个
// 统计水仙花数有多少个 int i = 100; // 计数器 int count = 0; while (i < 1000){ int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100 % 10; if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i){ count++; } i++; } System.out.println("水仙花数有" + count + "个");
-
统计1-100之间所有的奇数和
// 求1-100之间的奇数和 int i = 1; // 定义变量,记录和 int sum = 0; while (i <= 100){ // 判断i是否是奇数 if (i % 2 != 0){ sum += i; } i++; } System.out.println("奇数和是" + sum);
public static void main(String[] args) { // 求1-100之间的奇数和 int i = 1; // 定义变量,记录和 int sum = 0; while (i <= 100){ sum += i; i += 2; } System.out.println("奇数和是" + sum); }
2.4.5 循环结构do-while
-
基本格式
do{ 循环体语句; }while(布尔表达式);
-
扩展格式
初始化表达式1; do{ 循环体3; 步进表达式4; }while(布尔表达式2);
-
执行流程:1 3 4 2 3 4...2不满足为止
-
流程图
-
// 打印1-100 int i = 1; do { System.out.println(i++); }while (i <= 100);
2.4.6 三种循环的区别
-
dowhile循环至少会执行一次循环体
Scanner scanner = new Scanner(System.in); // String str = "y"; // while ("y".equals(str)){ // System.out.println("石头"); // System.out.println("是否继续?y/n"); // str = scanner.next(); // } String str; do { System.out.println("剪刀"); System.out.println("是否继续?y/n"); str = scanner.next(); }while ("y".equals(str));
-
控制条件语句所控制的那个变量,在for循环结束后就不能再使用了,但是while循环结束后依然可以使用,所以for循环内存空间利用率更高
for (int i = 1;i > 100;i++){ System.out.println(i); } // 打印1-100 int i = 1; do { System.out.println(i++); }while (i > 100);
2.4.7 跳转控制语句
-
让循环在某一步的时候结束或者跳过某些数据。
-
break 中断
-
continue继续
-
-
break的使用场景
-
在switch中表示立即结束switch语句
-
在循环语句中表示立即结束循环
-
-
continue的使用场景
-
在循环语句中表示跳过当前循环,继续下一次循环
-
-
如果有多个循环嵌套,break和continue只作用于最近的循环
for (int i = 1;i < 10;i++){ System.out.println("i = " + i); for (int j = 1;j < 10;j++){ if (j == 3) break; System.out.println("j = " + j); } }
2.5 死循环
如果循环的条件一直满足,循环就不会停下来,产生了死循环,也称之为叫无限循环、永真循环
while (true){}// 推荐 // for (;true;){} // for (;;){}