03 - 程序控制结构

一、顺序控制

程序从上到下逐行地执行,中间没有任何判断和跳转。

顺序控制举例和注意事项:
Java中定义变量时采用合法的前向引用。

//正确形式
public class Test{
    int num1=12;
    int num2=num1+2;
}

//错误形式:
public class Test{
    int num2=num1+2;//num1还未声明
    int num1=12;
}

二、分支控制

1. 单分支 if

基本语法

if(条件表达式){
            执行代码块;(可以有多条语句.)
}

案例

//编写一个程序,输入人的年龄,如果年龄大于 18 岁,
//则输出 "你年龄大于 18,要对自己的行为负责,送入监狱"
import java.util.Scanner;//导入Scanner包

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("请输入年龄");
	int age = myScanner.nextInt();
    if(age > 18) {
        System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱");
    }
    	System.out.println("单分支if程序结束...");
    }
}

单分支if的说明

当条件表达式为true时,就会执行{}的代码。如果为false,就不执行。

如果{}中只有一条语句,则可以不用{},建议写上{}

2. 双分支 if-else

基本语法

if(条件表达式){
	执行代码块1;
} else {
	执行代码块2;
}

案例

//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁,
//则输出 "你年龄大于 18,要对自己的行为负责, 送入监狱"。
//否则 ,输出"你的年龄不大这次放过你了."
import java.util.Scanner;//导入Scanner包

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("请输入年龄");

	int age = myScanner.nextInt();
	if(age > 18) {
		System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱");
	} else {//双分支 
		System.out.println("你的年龄不大这次放过你了");
	}
}

双分支if-else的说明

当条件表达式成立,就会执行代码块1,否则执行代码块2。
如果执行代码块中只有一条语句,则{}可以省略,否则,不能省略。

3. 多分支 if-else if -....-else

基本语法

if(条件表达式1){
    执行代码块1;
} else if (条件表达式2) {
	执行代码块2;
}
......
else {
    执行代码块n;
}

案例

/* 输入信用分: 如果:
信用分为 100 分时,输出 信用极好;
信用分为(80,99]时,输出 信用优秀;
信用分为[60,80]时,输出 信用一般;
其它情况 ,输出 信用不及格
请从键盘输入信用分,并加以判断
假定信用分数为 int
*/
import java.util.Scanner;

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);//接收用户输入
	System.out.println("请输入信用分(1-100):");
	int grade = myScanner.nextInt();
	
	//先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
	if(grade >=1 && grade <= 100) {
		//因为有 4 种情况,所以使用多分支
        if(grade == 100) {
            System.out.println("信用极好");
		} else if (grade > 80 && grade <= 99) {
			//信用分为(80,99]时,输出 信用优秀;
			System.out.println("信用优秀");
		} else if (grade >= 60 && grade <= 80) {
			//信用分为[60,80]时,输出 信用一般
			System.out.println("信用一般");
		} else {
			//其它情况 ,输出 信用 不及格
			System.out.println("信用不及格");
		}
	} else {
		System.out.println("信用分需要在 1-100,请重新输入:)");
	}
}

多分支的说明

多分支可以没有else,如果所有条件表达式都不成立,则一个执行入口都没有

如果有else,如果里面所有条件表达式都不成立,则默认执行else代码块。

4. 嵌套分支

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支。

建议: 不要超过 3 层 (可读性不好)

基本语法

if() {
    if() {
        //if-else...
    } else {
        //if-else...
    }
}

案例

/*
参加歌手比赛,如果初赛成绩大于 8.0 进入决赛,否则提示淘汰。
并且根据性别提示进入男子组或女子组。输入成绩和性别,进行判断和输出信息。
提示: double score; char gender;
接收字符:
char gender = scanner.next().charAt(0)
*/

import java.util.Scanner;

public static void main(String[] args) {

	Scanner myScanner = new Scanner(System.in); 
	System.out.println("请输入该歌手的成绩"); 
	double score=myScanner.nextDouble();

    if( score > 8.0 ) {
        System.out.println("请输入性别");
        char gender = myScanner.next().charAt(0);
            if( gender == '男' ) {
                System.out.println("进入男子组");
			} else if (gender == '女') {
				System.out.println("进入女子组");
			} else {
				System.out.println("你的性别有误,不能参加决赛~");
			}
	} else {
		System.out.println("sorry ,你被淘汰了~");
    }
}

5. switch 分支结构

基本语法

switch(表达式) {
	case 常量1: //当...
		语句块1;
		break;
	case 常量2;
		语句块2;
		break;
	...
	case 常量n;
		语句块n;
		break;
	default:
		default语句块;
		break;
}

案例

/*
请编写一个程序,该程序可以接收一个字符
比如:a,b,c,d,e,f,g
a 表示星期一,b 表示星期二 … 
根据用户的输入显示相应的信息。
要求使用 switch 语句完成
*/
import java.util.Scanner;

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("请输入一个字符(a-g)");
	char c1 = myScanner.next().charAt(0);
	
	switch(c1) {
		case 'a' :
			System.out.println("今天星期一,猴子穿新衣");
			break;

		case 'b' :
			System.out.println("今天星期二,猴子当小二"); 
			break;

		case 'c' :
			System.out.println("今天星期三,猴子爬雪山.."); 
			break;

		default:
			System.out.println("你输入的字符不正确,没有匹配的");
	}
}

Switch分支注意事项

(1)switch关键字,表示switch分支
(2)表达式对应一个值
(3)case 常量1:当表达式的值等于常量1,就执行 语句块1
(4)break:表示退出switch
(5)如果和case 常量1 匹配,就执行语句块1,如果没有继续匹配case 常量2
(6)如果一个都没有匹配上,执行default
(7)表达式数据类型,应和case后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是int
(8)switch(表达式)中表达式的返回值必须是:(byte、short、int、char、enum[枚举]、String)
	比如:
	double c = 1.1;
	switch(c){//错误
		case 1.1://错误
		System.out.println("ok3");
		break;
(9)case子句中的值必须是常量(1,'a')或者常量表达式,而不能是变量
(10)default子句是可选的,当没有匹配的case时,执行default。如果没有default子句,又没有匹配任何常量,则没有输出
(11)break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾,除非遇到break;

6. switch和if的区别

(1)如果判断的具体数值不多,而且符合 byte、 short  、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。

(2)其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广

三、循环控制

1. for循环控制

基本语法

for(循环变量初始化; 循环条件; 循环变量迭代) {
	循环操作(可以多条语句);
}

案例

//打印 1~100 之间所有是 9 的倍数的整数,统计个数及总和.
public static void main(String[] args) {
	int count = 0; //统计 9 的倍数个数 变量
	int sum = 0; //总和 int start = 10;
	int end = 200;
	int t = 5; // 倍数
	for(int i = start; i <= end; i++) { 
		if( i % t == 0) {
			System.out.println("i=" + i);
			count++;
			sum += i;//累积
		}
	}
	System.out.println("count=" + count); 
	System.out.println("sum=" + sum);
}

for循环注意事项

(1)for 关键字,表示循环控制

(2)for 有四要素: 1-循环变量初始化 2-循环条件 3-循环操作 4-循环变量迭代

(3)循环操作,这里可以有多条语句,也就是我们要循环执行的代码

(4)如果循环操作(语句)只有一条语句,可以省略 {}, 建议不要省略

(5)循环条件是返回一个布尔值的表达式

(6)for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。

(7)循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。

2. while循环控制

基本语法

循环变量初始化;
while(循环条件) {
	循环体(语句);
	循环变量迭代;
}

案例

// 打印 1—100 之间所有能被 3 整除的数 [使用 while]
public static void main(String[] args) {
	int i = 1;
	int endNum = 100;

	while( i <= endNum) {
    	if( i % 3 == 0) {
        	System.out.println("i=" + i);
        }
    }
}

while循环注意事项

(1)while循环也有四要素

(2)只是四要素放的位置和for不一样

(3)循环条件是返回一个布尔值的表达式

(4)while 循环是先判断再执行语句

3. do..while循环控制

基本语法

循环变量初始化;
do {
	循环体(语句);
	循环变量迭代;
} while(循环条件);

案例

//统计 1---200 之间能被 5 整除但不能被 3 整除的 个数

public static void main(String[] args) {
	int i = 1;
	int count = 0; //统计满足条件的个数 
	do {
		if( i % 5 == 0 && i % 3 != 0 ) { 
			System.out.println("i=" + i); 
			count++;
		} i++;
	} while(i <= 200);
	System.out.println("count=" + count);
}

do...while循环注意事项

(1)循环条件是返回一个布尔值的表达式

(2)do..while 循环是先执行,再判断, 因此它至少执行一次

4. 跳转控制语句-break

break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环 [for , while , do-while] 中。

基本语法

{
	......
	break;
	......
}

案例

//1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for + break】

public static void main(String[] args) {
	int sum = 0; //累积和
	//注意 i 的作用范围在 for{}
	int n = 0;
	for(int i = 1; i <= 100; i++) { 
		sum += i;//累积
		if(sum > 20) {
			System.out.println("和>20 时候 当前数 i=" + i);
			n = i;
			break;
		}
	}
	System.out.println("当前数=" + n);
}

跳转控制语句-break注意事项

(1)break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一句语句块。

(2)标签的基本使用
label1:{	......
label2:		{	......
label3:			{	......
							break;
						......
					}
				}
		}

解读:
(1)break语句可以指定退出哪层
(2)label1是标签,名字由程序员指定。
(3)break后指定到哪个label就退出到哪里
(4)在实际的开发中,尽量不要使用标签
(5)如果没有指定break,默认退出最近的循环体

5. 跳转控制语句-continue

基本语法

{
	......
	continue;
	......
}

案例

public static void main(String[] args) {
	int i = 1;
	while( i <= 4) {
		i++;
		if( i == 2) {
			continue;
		}
	System.out.println("i=" + i);
	}
}

跳转控制语句-continue注意事项

(1)continue 语句用于结束本次循环,继续执行下一次循环。

(2) continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 ,  这个和前面的标签的 使用的规则一样.

6. 跳转控制语句-return

return 使用在方法中,表示跳出所在的方法.

注意:如果 return 写在 main 方法,则退出程序。

注:本博客引用韩顺平老师Java课程

posted @ 2022-01-08 20:44  SpockC  阅读(39)  评论(0)    收藏  举报