Java程序逻辑控制详谈

逻辑控制

1.1顺序结构

顺序结构比较简单. 像我们之前写过的代码就是顺序结构的,程序是按照代码书写的顺序一行一行来执行。

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
// 运行结果
aaa
bbb
ccc

如果调整代码的书写顺序,则执行顺序也会发生变化
System.out.println("aaa");
System.out.println("ccc");
System.out.println("bbb");
// 运行结果
aaa
ccc
bbb

1.2 分支结构

1.2.1 if 语句

基本语法格式1:

//注意,java中最好第一个花括号跟在if语句后面
if(布尔表达式){
    
    
    //条件满足时执行代码
}

基本语法格式2:

if(布尔表达式){
    
    
    //条件满足时执行代码
}else{
    
    
    //条件不满足时执行代码
}

基本语法格式3:

if(布尔表达式){
    
    
    //条件满足时执行代码
}else if(布尔表达式){
    
    
    //条件满足时执行代码
}else{
    
    
    //条件都不满足时执行代码
}
注意事项1:悬垂else问题
int x = 20;
int y = 10;
if (x == 10) 
 	if (y == 10)
 		System.out.println("aaa");
else
 	System.out.println("bbb");

 //猜一猜最终会打印出 aaa 还是 bbb?
 //答案是什么都不打印,这段代码最终的样子是这样的。
int x = 20;
int y = 10;
if (x == 10)  //第一层条件不满足,所以后面直接不看
 	if (y == 10)
 		System.out.println("aaa");
	else
 		System.out.println("bbb");

结论:

  1. if / else 语句中可以不加 大括号。但是也可以写语句(只能写一条语句)。
  2. 如果 if 语句不加大括号,此时 else 是和最接近的 if 匹配。但是实际开发中我们不建议这么写,最好加上大括号。
注意事项2:布尔表达式写法问题
//比如说判断一个数num是否小于20大于10
//有的同学可能会这么写:
if(10 <= num <= 20)
//这样写是不行的,正确做法是:
if(num >= 10 && num <= 20)
注意事项3:代码风格问题
// 风格1
int x = 10;
if (x == 10) {
    
    
    // 满足条件
} else {
    
    
    // 不满足条件
}
// 风格2
int x = 10;
if (x == 10)
{
    
    
    // 满足条件
}
else
{
    
    
    // 不满足条件
}

虽然两种方式都是可取的,但是在java中更推荐使用风格1,{ 放在 if / else 同一行。

注意事项4:分号问题
int x = 20;
if (x == 10); {
    
    
    System.out.println("hehe");
}
// 运行结果
hehe
//可以看成这样
int x = 20;
if (x == 10); //这一句已经结束了

{
    
    
    System.out.println("hehe");
}

结论:
分号在java中表示的一个语句的结束,此处多写了一个分号,导致分号成了 if 语句的语句体,而 { } 中的代码已经成为了一个和 if 语句无关的代码块,所以不管怎么样,这句代码都会执行。

1.2.2 switch 语句

基本语法:

switch(整数|枚举|字符|字符串){
    
    
 case 内容1 : {
    
    
// 内容满足时执行语句;
 break;
 }
 case 内容2 : {
    
    
 //内容满足时执行语句;
 break;
 }
 ...
 default:{
    
    
 //内容都不满足时执行语句;
 break;
 } 
}
  1. switch 语句中参数最大只能是整型,也就是 int 、char 、byte 、short类型可以做参数,而double 、float 、boolean 、long类型不能做参数。
  2. 根据 switch 中值的不同, 会执行对应的case 语句。遇到 break 就会结束该 case 语句。
  3. 如果 switch 中的值没有匹配的 case, 就会执行 default 中的语句。建议一个 switch 语句最好都要带上 default
注意事项1:break 不要遗漏, 否则会失去"多分支选择的结果"
int day = 1;
switch(day) {
    
    
    case 1:
        System.out.println("星期一");
    case 2:
        System.out.println("星期二");
        break; }
// 运行结果
星期一
星期二

结论:
可以发现,如果不写 break,case 语句会依次向下执行,从而失去了多分支的效果。

注意事项2:switch 中的值只能是 整数|枚举|字符|字符串类型
double num = 1.0;
switch(num) {
    
    
    case 1.0:
        System.out.println("hehe");
        break;
    case 2.0:
        System.out.println("haha");
        break; }
// 编译出错
Test.java:4: 错误: 不兼容的类型: 从double转换到int可能会有损失
                switch(num) {
    
    
                        ^ 
1 个错误
注意事项3:switch 不能表达复杂的条件
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示. 
if (num > 10 && num < 20) {
    
    
 System.out.println("hehe");
}
注意事项4:switch 虽然支持嵌套, 但是很丑~
int x = 1; 
int y = 1; 
switch(x) {
    
     
 	case 1: 
 		switch(y) {
    
     
 			case 1: 
 				System.out.println("hehe"); 
 				break; 
 } 
 		break; 
 	case 2: 
 		System.out.println("haha"); 
 		break; 
}

代码的美观程度也是一个重要标准,综上可以发现,switch 的使用局限性是比较大的。

1.3 循环结构

1.3.1 while 循环

基本语法格式:

while(循环条件){
    
     
	循环语句; 
}
循环条件为true ,则执行循环语句,否则结束循环。注意这里循环条件也必须为布尔表达式
代码示例1:计算5的阶乘
int n = 1; 
int result = 1; 
while (n <= 5) {
    
     
 	result *= n; 
 	n++; 
} 
System.out.println(result); 
// 执行结果
120
代码示例2:计算 1!+2!+3!+4!+5!的和
//此时就需要用到循环嵌套
	int n = 1; 
	int sum = 0;
	while(n <= 5) {
    
    
		int result = 1; 
		int i = 1;
		while (i <= n) {
    
     
			result *= i; 
			i++; 
		}
		sum += result;
		n++;
	}
		System.out.println(sum);
//运行结果:
153

注意事项:

  1. 和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }。
  2. 和 if 类似, while 后面的 { 建议和 while 写在同一行。
  3. 和 if 类似, while 后面不要多写 分号, 否则可能导致循环不能正确执行。
代码示例:
int num = 1; 
while (num <= 10); {
    
     
 System.out.println(num); 
 num++; 
} 
// 执行结果
[无任何输出, 程序死循环]

此时 ; 为 while 的语句体(这是一个空语句), 实际的 { } 部分和循环无关。此时循环条件 num <= 10 恒成立, 导致代码死循环了。

1.3.2 break

break 的功能是让循环提前结束。
代码示例:
找到 100 - 200 中第一个 3 的倍数。

int num = 100; 
while (num <= 200) {
    
     
 	if (num % 3 == 0) {
    
     
		 System.out.println("找到了 3 的倍数, 为:" + num); 
 		 break; 
 } 
 	num++; 
} 
// 执行结果
找到了3的倍数,为:102
1.3.3 continue

continue 的功能是跳过这次循环, 立即进入下次循环。
代码示例:
找到100 - 200 中所有3的倍数。

int num = 100; 
while (num <= 200) {
    
     
 	if (num % 3 != 0) {
    
     
 		num++; // 这里的 ++ 不要忘记! 否则会死循环. 
 		continue;  //跳过本次循环,继续下一次循环
 } 
 	System.out.println("找到了 3 的倍数, 为:" + num); 
 	num++; 
}

可以发现,执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件),从而不会执行下方的打印语句。

1.3.4 for 循环

基本语法:

for(表达式1;表达式2;表达式3){ 
循环体; 
}
表达式1: 用于初始化循环变量.
表达式2: 循环条件
表达式3: 更新循环变量.
相比于 while 循环, for循环将这三个部分合并在一起,写代码时不容易遗漏。
代码示例1:计算5的阶乘
int result = 0; 
for (int i = 1; i <= 5; i++) {
    
     
	 result *= i; 
} 
System.out.println("result = " + result);
代码示例2:计算 1! + 2! + 3! + 4! + 5!
int sum = 0; 
for (int i = 1; i <= 5; i++) {
    
     
	 int tmp = 1; 
 for (int j = 1; j <= i; j++) {
    
     
 		tmp *= j; 
 } 
	 sum += tmp; 
} 
System.out.println("sum = " + sum);
注意:(和while循环类似)
  1. 和 if 类似, for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句.,建议还是加上 { }。
  2. 和 if 类似, for 后面的 { 建议和 while 写在同一行。
  3. 和 if 类似, for 后面不要多写分号,否则可能导致循环不能正确执行。
1.3.5 do while 循环

基本语法:

do{
    
     
循环语句; 
}while(循环条件);
先执行循环语句,在判定循环条件。
代码示例:
int num = 10;
do {
    
    
	System.out.println("666");
}while(num <= 1);
//运行结果 666,可见虽然条件不成立,但是已经执行了一次

注意:

  1. do while 循环最后的分号不要忘记。
  2. 一般 do while 很少用到, 更推荐使用 for 和 while。

1.4 输入输出

基本语法:

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出

注意:

  1. println 输出的内容自带 \n, print 不带 \n。
  2. printf 的格式化输出方式和 C 语言的printf是基本一致的。
代码示例:
System.out.println("hello world"); 
int x = 10; 
System.out.printf("x = %d\n",x);
格式化字符串:

如图所示:
在这里插入图片描述

这个表格没必要记住,用到的时候根据需要查一下就行。

1.4.2 从键盘输入(了解会使用就行)

就目前来看最适合的方法就是使用 Scanner 读取字符串/整数/浮点数。

代码示例:
import java.util.Scanner; // 需要导入 util 包
Scanner sc = new Scanner(System.in); 
System.out.println("请输入你的姓名:"); 
String name = sc.nextLine();  //读取一行,读入上一个回车
System.out.println("请输入你的年龄:"); 
int age = sc.nextInt(); 
System.out.println("请输入你的工资:"); 
float salary = sc.nextFloat(); 
System.out.println("你的信息如下:"); 
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary); 
sc.close(); // 注意, 要记得调用关闭方法

// 执行结果
请输入你的姓名:
张三
请输入你的年龄:
18 
请输入你的工资:
1000 
你的信息如下:
姓名: 张三
年龄:18 
工资:1000.0
使用Scanner循环读取 N个数字:
Scanner sc = new Scanner(System.in); 
double sum = 0.0; 
int num = 0; 
while (sc.hasNextDouble()) {
    
     
 double tmp = sc.nextDouble(); 
 sum += tmp; 
 num++; 
}
ystem.out.println("sum = " + sum); 
System.out.println("avg = " + sum / num); 
sc.close(); 
// 执行结果
10 
40.0 
50.5 
^Z 
sum = 150.5 
avg = 30.1

注意:
当循环输入多个数据的时候, 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl +d)。

猜你喜欢

转载自blog.csdn.net/weixin_46078890/article/details/108947765