您的位置:首页 > 编程语言 > Java开发

Java语言基础(选择与循环语句)

2019-01-23 15:09 120 查看

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 会使循环有很多退出点,使程序很难阅读。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: