Java语言基础(选择与循环语句)
3.01Java语言基础(顺序结构语句)
流程控制语句:在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接 影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执 行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
- 顺序结构语句(最基本的结构语句,没有特定的结构)
- 选择结构语句(if、switch)
- 循环结构语句(for、while)
顺序结构语句:,按照代码的先后 顺序,依次执行,程序中大多数的代码都是这样执行的。
3.02Java语言基础(选择结构语句)
要点提示:程序可以基于条件执行哪些语句
选择结构:也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运 算进行判断,逻辑运算的结构有两个,所以产生选择,按照不同的选择执行不同的代码。 (有两种语句,if和switch)
1.if语句: - 单分支if语句(适合做单个判断)
要点提示: if 语句是一个结构,允许程序确定执行的路径。
if(布尔表达式){ 语句体 }
执行流程:
- 首先判断布尔表达式的值是true还是false;
- 如果是true就执行语句体;
- 如果是false就不执行语句体。
案例:
/*需求:找出公约数是5的数,再找出公约数是2的数*/ import java.util.Scanner; class SimplelfDemo{ public static void main(String[] args){ Scanner scanner=new Scanner(System,in); System.out.print("Enter an integer:"); int number=scanner.nextInt(); if(number%5==0){ System.out.println("HiFive"); } if(number%2==0){ System.out.println("HiEven"); } } }
提示:如果if语句中只有一条语句,则可以省略花括号。如下所示:
/*需求:找出公约数是5的数,再找出公约数是2的数*/ import java.util.Scanner; class SimplelfDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter an integer: "); int number = scanner.nextlnt(); if (number%5==0) System.out.printlnC'HiFive"); if (number%2==0) System.out.println("HiEven"); } }
注意:省略括号可以让代码更加简短,但是容易产生错误。
- 双分支语句if-else语句(适合做两个判断)
要点提示: if-else 语句根据条件是真或者是假,决定执行的路径。
if(布尔表达式){ 语句体1 }else{ 语句体2 }
执行流程:
- 首先判断布尔表达式的值是true还是false
- 如果是true执行语句体1
- 如果是false执行语句体2
案例:
/*判断是否是闰年*/ import java.util.Scanner; class RunDemo00{ public static void main(String[] args){ /* 数据:输入年份 指令: 1.输入年份 2.判断是否闰年 3.程序结束 */ Scanner scanner=new Scanner(System.in); System.out.print("请输入年份:"); int year=scanner.nextInt(); if((year%4==0&&year%100!=0)||(year%400==0)){ System.out.println("闰年"); }else{ System.out.print("不是闰年"); } } }
注意:双分支结构如果语句体只有一句话,也可以像单分支结构一样省略大括号。
- 多分支if-else语句(适合做多个判断)
if(布尔表达式1){ 语句体1 }else if(布尔表达式2){ 语句体2 } ... else{ 语句体n+1 } ...
执行流程:
- 首先判断布尔表达式1的结果
- 如果是true就执行语句体1
- 如果是false就继续判断布尔表达式2的结果
- 如果是true就执行语句体2
- 如果是false就继续判断布尔表达式…
- …
- 如果没有任何布尔表达式的值是true,就执行语句体n+1
案例:
/*需求:彩票问题*/ import java.util.Scanner; class IfDemo01{ public static void main(String[] args){ /* 数据:随机数 输入的两位数 指令: 1.获取一个随机数 2.随机数×100 3.强制转换 4.输入一个两位数 5.取出随机数的各位数a1 b1和两位数的各位数a2 b2 6.判断各位数字 6.1判断a1==a2&&b1==b2 6.2判断a1==b2&&a2==b1 6.3判断a1==b1||a1==b2||b1==a2||b1==b2 7.程序结束 */ int num1=(int)(Math.random()*100); System.out.println(num1); int a1=num1%10; num1/=10; int b1=num1; Scanner scanner=new Scanner(System.in); System.out.print("Enter the num2:"); int num2=scanner.nextInt(); int a2=num2%10; num2/=10; int b2=num2; if(a1==a2&&b1==b2){ System.out.println("恭喜您中了10000美金!"); }else if(a1==b2&&a2==b1){ System.out.println("恭喜您中了3000美金!"); }else if(a1==a2||a1==b2||b1==a2||b1==b2){ System.out.println("恭喜您中了1000美金!"); }else{ System.out.println("谢谢惠顾!"); } } }
/*需求:BMI*/ import java.util.Scanner; class BMIDemo00{ public static void main(String[] args){ /* 数据:体重(千克) 身高(米) 年龄 指令: 1.输入年龄age 2.判断年龄age>=20; 3.输入体重,身高 4.计算BMI 5.判断BMI的范围 6.程序结束 */ Scanner scanner=new Scanner(System.in); System.out.print("请输入年龄:"); int age=scanner.nextInt(); if(age>=20){ System.out.print("请输入体重和身高(千克、米):"); double weight=scanner.nextDouble(); double height=scanner.nextDouble(); double BMI=weight/(height*height); if (BMI<18.5){ System.out.println("偏瘦"); }else if (BMI<25.0){ System.out.println("正常"); }else if (BMI<30.0){ System.out.println("超重"); }else{ System.out.println("过胖"); } }else{ System.out.println("年龄过小!!!"); } } }
- if语句的嵌套使用
if(布尔表达式1){ if(布尔表达式2){ 语句体2 ... } }
执行过程:
- 判断布尔表达式1
- 如果是true就继续,继续判断布尔表达式2
- 如果是false就结束
- …
案例:
/*需求:当x和y大于2时,求和*/ import java.util.Scanner; class Demo00{ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int x=scanner.nextInt(); int y=scanner.nextInt(); int z; if (x > 2) { if (y > 2) { z=x + y; System.out.println("z is "+z); } } } }
if语句常见错误和陷阱
错误:
-
忘记必要的括号;
-
在if行出现错误的分号;
-
对布尔值的冗余测试;
-
悬空else出现的歧义;
-
两个浮点数值的相等测试。
陷阱: -
简化布尔变量赋值;
-
避免不同情形中的重复代码;
双分支if-else语句与三目运算符的转换
我们前面讲解过三元运算符,它根据比较判断后,给出的也是两个结果,所以,这种情 况和if语句的第二种格式很相似,他们在某些情况下应该是可以相互转换的。 三元运算符的操作都可以使用if语句改进,反之不成立 当if语句控制的语句体是一条输出语句时,就不成立,因为三元运算符是一个运算符, 必须要求有一个结果返回。而输出语句不能作为一个返回结果。
2.switch语句
要点提示:switch 语句基于变量或者表达式的值来执行语句。 -
switch语句格式
switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2; break; ....... default: 语句体n+1; break; }
执行过程:
- 首先计算表达式的值
- 其次,和case依次比较,一旦有对象的值,就会执行相应的语句,在执行的过程 中,遇到break就会结束。
案例:
/*需求:输出几天后是星期几*/ import java.util.Scanner; class Demo3_3{ public static void main(String[] args){ /* 数据:今天周几,未来几天后,这天星期几 指令: 1.输入今天周几(0 1 2 3 4 5 6 ) 2.输入几天后 3.判断几天后是周几 4.输出 */ Scanner scanner=new Scanner(System.in); System.out.print("Enter today's day:"); int today=scanner.nextInt(); System.out.print("Enter the number of days elapsed since today:"); int future=scanner.nextInt(); int week=(today+future)%7; String todayStr=""; String weekStr=""; switch(week){ case 0: weekStr="Sunday"; break; case 1: weekStr="Monday"; break; case 2: weekStr="Tuesday"; break; case 3: weekStr="Wednesday"; break; case 4: weekStr="Thursday"; break; case 5: weekStr="Friday"; break; case 6: weekStr="Saturday"; break; } switch(today){ case 0: todayStr="Sunday"; break; case 1: todayStr="Monday"; break; case 2: todayStr="Tuesday"; break; case 3: todayStr="Wednesday"; break; case 4: todayStr="Thursday"; break; case 5: todayStr="Friday"; break; case 6: todayStr="Saturday"; break; } System.out.println("Today is "+todayStr+" and the future day is "+weekStr); } }
注意事项:
不要忘记在需要的时候使用 break 语句。一旦匹配其中一个 case, 就从匹配的case 处开始执行,直到遇到 break 语句或到达 switch 语句的结束。这种现象称为落空行为(fall-through behavior)。
switch和if各自使用的场景
if使用场景:
- 针对结果是boolean类型的判断
- 针对一个范围的判断
- 针对几个常量值的判断
switch使用场景:
- 针对几个常量值的判断
3.03Java语言基础(循环结构语句)
要点提示: 循环可以用于让一个程序重复地执行语句。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码 被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为 false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环四要素
- 循环初始化:一条或多条语句,这些语句完成一些初始化操作,让循环开始执行 。
- 循环继续条件:控制循环是否继续或结束的条件。
- 循环体:需要被循环执行的代码。
- 循环步长(间距,周期):当前循环和下一次循环之间的差量。
1.for语句
***要点提示:***:for 循环具有编写循环的简明语法。
- for语句格式
for(初始化语句;继续条件;步长){ 循环体 }
执行过程:
- 执行初始化语句
- 执行继续条件判断,如果是true,继续执行;如果是false,循环结束 。
- 执行循环体语句
- 执行步长
- 回到第二条继续
案例
/*需求:求最大公约数*/ import java.util.Scanner; class MaxDemo{ public static void main(String[] args){ /* 数据:两个整数 最大公约数 指令: 1.输入两个整数 2.取出最小的开始进入循环,并判断 3.输出 4.程序结束 */ Scanner scanner=new Scanner(System.in); System.out.print("请输入两个整数:"); int num1=scanner.nextInt(); int num2=scanner.nextInt(); for(int i=Math.min(num1,num2);i>=1;i--){ if(num1%i==0&&num2%i==0){ System.out.printf("gcd=%d",i); break; } } } }
/*需求:打印空心菱形*/ class KongLingXing{ public static void main(String[] args){ /* k i j 5 1 1 4 2 1 2 3 3 1 3 2 4 1 4 1 5 1 5 0 6 1 6 1 7 1 5 2 8 1 4 3 9 1 3 4 10 1 2 5 11 1 k的规律是绝对值|6-i| i j 的规律是j<=i&&i+j<=12 空心的规律:j==1||j==i||i+j==12 */ for(int i=1;i<=11;i++){ for(int k=1;k<=Math.abs(6-i);k++){ System.out.print(" "); } for(int j=1;j<=i&&i+j<=12;j++){ if(j==1||j==i||i+j==12){ System.out.print("* "); }else{ System.out.print(" "); } } System.out.println(); } } }
提示
1.控制变量必须在循环控制结构体内或循环前说明。如果循环控制变量只在循环内使 用而不在其他地方使用,那么在 for 循环的初始动作中声明它是一个很好的编程习慣。如果在循环控制结构体内声明变量,那么在循环外不能引用它。
注意事项
- 循环继续条件语句的结果是一个boolean类型;
- 循环体语句如果是一条语句,大括号可以省略;
- 有左大括号就没有分号,有分号就没有左大括号;
- for 循环中的初始动作可以是0 个或是多个以逗号隔开的变量声明语句或賦值表达式;
- for 循环中每次迭代后的动作可以是 0个或多个以逗号隔开的语句;
- 如果省略 for循环中的循环继续条件,則隐含地认为循环继续条件为 true。
2.while语句
要点提示: while 循环在条件为真的情况下,重复地执行语句。 - while语句格式
while(循环继续条件){ 循环体语句 } 或 循环初始化语句 while(循环继续条件){ 循环体语句 步长 }
执行流程:
- 执行初始化语句
- 执行继续条件判断,如果是true,继续执行;如果是false,循环结束 。
- 执行循环体语句
- 执行步长
- 回到第二条继续
案例
class Demo3_14{ public static void main(String[] args){ /* 需求:遍历一个平方大于12000的最小正整数 */ int n=1; while(true){ if(n*n>12000){ System.out.println("n="+n); break; } n++; } n=1; /*遍历一个n^3>12000的最小正整数*/ while(true){ if(n*n*n>12000){ System.out.println("n="+(n-1)); break; } n++; } } }
提示: 循环继续条件应该总是放在固括号内。只有当循环体只包含一条语句或不包含语句 时,循环体的花括号才可以省略。
警告
- 要保证循环继续条件最终可以变为 false,以便程序能够结束。
- 程序员经常会犯的错误就是使循环多执行一次或少执行一次。
for与while的对比
区别:
- for循环针对一个范围判断进行操作
- while循环适合判断次数不明确操作
死循环:
- while(true){}
- for(;😉{}
3.04Java语言基础(控制跳转语句)
要点提示: 关键字 break 和 continue 在循环中提供了額外的控制。
break关键字
作用:
- 跳出单层循环
- 跳出多层循环:带标签跳出,标签名:循环语句
使用场景:
- 在选择结构switch语句中
- 在循环语句中
- 离开使用场景的存在是没有意义的
continue关键字
作用:
- 退出当前循环,开启下一次循环,也可带标签。(不建议使用标签)
使用场景:
- 在循环语句中
- 离开使用场景的存在是没有意义的
注意: continue 语句总是在一个循环内。在 while 和 do-while 循环中,continue 语句之 后会马上计算循环继续条件;而在 for 循环中,continue 语句之后会立即先执行每次迭代 后的动作,再计算循环继续条件。
警告: 过多使用 break 和 continue 会使循环有很多退出点,使程序很难阅读。
- Java语言基础——循环控制语句while for
- java语言基础-控制循环语句-break- continue-return的区别
- java基础学习总结四(控制语句<顺序、选择、循环>、方法)
- 初学java语言与选择语句与循环语句
- Java语言基础(四) : 选择结构之 if 语句
- JAVA选择结构语句和witchi和for循环判断语句jj基础介绍
- Java语言基础(五) : 选择结构之 switch 语句
- Java基础之选择语句与循环语句
- 第二章(3)、java基础语法-选择语句和循环语句
- 黑马程序员——Java基础(流程控制语句、选择结构、循环结构、方法)
- 黑马程序员_java基础学习笔记02_选择结构和循环语句语句
- Java基础巩固(控制流程语句之---if 判断语句、switch选择判断语句、while循环语句、for循环语句的格式,转义字符、break关键字、continue关键字)
- Java基础(3)----选择与循环语句
- C#基础 条件语句、选择语句和循环语句
- java语言基础数组选择排序从小到大-作者:逝秋
- java第四天(选择、循环、跳转语句)
- 黑马程序员——Java语言基础——02.java语言基础组成(2)语句
- day1-Java基础语法--Java循环语句
- [零基础学JAVA]Java SE基础部分-04. 分支、循环语句
- Java基础---for循环语句