03 - 程式控制結構
阿新 • • 發佈:2022-01-08
一、順序控制
程式從上到下逐行地執行,中間沒有任何判斷和跳轉。
順序控制舉例和注意事項:
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課程
Record Our Mind