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

3.01Java语言基础(顺序结构语句)
流程控制语句:在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接 影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执 行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。

  • 顺序结构语句(最基本的结构语句,没有特定的结构)
  • 选择结构语句(if、switch)
  • 循环结构语句(for、while)
    顺序结构语句:,按照代码的先后 顺序,依次执行,程序中大多数的代码都是这样执行的。
    3.02Java语言基础(选择结构语句)
    要点提示:程序可以基于条件执行哪些语句
    选择结构:也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运 算进行判断,逻辑运算的结构有两个,所以产生选择,按照不同的选择执行不同的代码。 (有两种语句,if和switch)
    1.if语句:
  • 单分支if语句(适合做单个判断)
    要点提示: if 语句是一个结构,允许程序确定执行的路径。
if(布尔表达式){
	语句体
}

Java语言基础(选择与循环语句)_第1张图片
执行流程:

  • 首先判断布尔表达式的值是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
 }

Java语言基础(选择与循环语句)_第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
    Java语言基础(选择与循环语句)_第3张图片
    案例:
/*需求:彩票问题*/
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就会结束。
    Java语言基础(选择与循环语句)_第4张图片
    案例:
/*需求:输出几天后是星期几*/
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,循环结束 。
  • 执行循环体语句
  • 执行步长
  • 回到第二条继续
    Java语言基础(选择与循环语句)_第5张图片
    案例
/*需求:求最大公约数*/
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,循环结束 。
  • 执行循环体语句
  • 执行步长
  • 回到第二条继续

Java语言基础(选择与循环语句)_第6张图片

案例

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语言基础(选择与循环语句))