字體:小 中 大 | |
|
|
2021/03/18 20:34:35瀏覽1402|回應0|推薦0 | |
第四章 Java程式語言的語法:執行邏輯的控制 這一章介紹各式各樣控制程式進行流程的指令。本章一開始會先把結構化程式的概念先介紹給同學,認識所謂的循序結構、決策結構與迴圈結構,要了解一下,在Java中決策結構的指令有哪些,重覆結構的指令有哪些。 第二節開始先從決策結構類型指令介紹起。從最簡單的if條件指令、有else的if指令、到switch指令與巢狀if指令。 第三節講的是重覆結構,這一類指令有while、do while與for指令,while和do while是透過條件判斷來決定迴圈是否中止,而for指令則是利用變數的起始值和中止值來控制迴圈的執行次數。 在第四節,提供了兩個程式作為綜合應用的練習,在練習中需要綜合前面所學得的各種指令語法將需要用到的指令都派上用場才能完成一個完整的程式。我們選了身分證號碼檢查程式和魔方陣程式來講解和練習。 結構化程式設計基本概念 為何要結構化程式設計? 程式的邏輯結構決定了一個程式的可讀性以及除錯的方便性。 早期程式語言的goto指令可任意跳到程式中指定的敘述去執行。 使用goto指令,容易造成程式執行流程的混亂,不易除錯。 結構化程式設計的特點: 程式的設計維持一個入口、一個出口。 將程式模組化:每個模組的功能獨立,模組間的相依關聯性低。 流程控制由以下三種結構組成: 循序結構(循序性)、決策結構(選擇性)、迴圈結構(重複性) 循序結構: 指令的執行是依序一個接一個往下執行。 決策結構: 指令的執行是依據決策條件的結果來決定要執行哪一條路線。 決策條件後的執行路線,單純的情況可能只有二條,如果遇到較複雜的情況時,亦有可能為多分支的岔路。 迴圈結構: 指令的執行,可以決策條件而重複執行很多次。
迴圈結構的變化: 迴圈可以先進行條件判斷後,再決定是否執行。 也可以先執行一次程序後 再進行條件判斷的情形。 Java的邏輯控制指令: 程式邏輯,在程式語言中,會有一系列的邏輯控制指令可以用來設計程式的執行流程;在Java中,一般指令具有循序性的執行特性,尚須有選擇結構與重複結構的指令才能提供較完整的流程控制 Java的選擇結構指令: if指令:是一種單選結構,決策條件成立時會選擇執行指定的程序,不成立時則直接跳過,循序 往下一個指令繼續執行。 ex. 媽媽請小明到雜貨店,如果有紅糖的話就買回來,如果沒有的話就不用買。 if/else指令:是二選一的結構,決策條件成立時會選擇執行指定的程序,不成立時會執行另一 個程序。 ex. 媽媽請小明到雜貨店,如果有紅糖的話就買紅糖,否則就買白糖。 switch指令:是多選一的結構,決策條件會依據條件式的結果,選擇其中一個程序來執行 ex. 小明星期一到星期五都從事不同的球類運動
Java的重複結構指令 while指令:一開始先進行決策條件的判斷,當條件式成立時,則執行指定的程序,直到條件不成立為止。由於while指令一開始就進行決策條件的判斷,所以有可能一次也執行不到指定的程序。小心無窮迴圈的當機陷阱! ex. 肚子餓的話,就吃一碗飯直到不餓為止。 do/while指令:一開始先執行指定的程序一次,再進行決策條件的判斷,當條件式成立時,則重 複執行指定的程序,直到條件不成立為止。由於一開始即執行了指定的程序一次,所以指定的程序至少會被執行一次。 ex. 先吃一碗飯,如果還覺得肚子餓的話,就再吃一碗飯直到不餓為止。 for指令:利用控制變數來決定迴圈要執行的次數,對於要使用變數來計算迴圈的執行與應用時特別便利。 ex. 小明做伏地挺身,每做一下就作一個記號,如果還沒滿十個記號就繼續做。 if 指令語法(1/2) : if指令是最簡單的選擇結構指令, 其語法為: if(決策條件)指令; 當決策條件成立時則執行其後的指令,不成立時則直接繼續執行後續的指令。 if 指令語法(2/2) : 如果決策條件後要執行的動作是多個指令時,可以使用一對大括號{ }把這些指令括在一起,那麼當決策條件成立時,這些指令就會一併被循序執行。 if(決策條件) { 指令1; 指令2;...;指令n;}
應用時機: 在寫程式的過程中,如果有需要因為某個特定條件而去執行額外的指令時,可以應用 if 指令來完成。 例如:列印成績單,成績單上不及格的成績前要多列印一個星號。 業績超過100萬的業務員,發10000元業績獎金。 注意事項: 決策條件的設定–決策條件是以邏輯判斷式來描述。 寫程式時應先仔細思考判斷的邏輯再將它翻譯成java的語法。所要執行的額外工作是什麼? 思考清楚後再將翻譯成java指令。 依據 if 指令的語法格式,決定程式的位置。 實例探討: 要寫一個程式判斷是否有投票權,如果有投票權的話,就列印出「您有投票權囉」的文字。 想法:投票權是用年齡來判斷的,設計一欄位age。 條件:年齡大於等於20歲有投票權。邏輯判斷式(age>=20)。 /* if 選擇結構 */ public class Ex4_1 { public static void main(String args[]) { int age=30; if (age>=20) System.out.println("您有投票權囉!"); } } 您有投票權囉! 動動腦: 如果把Ex4_1.java的第4行改為int age=18;想想看執行結果會變成如何? 由於條件判斷式(age>=20)將不會成立,所以不會列印出任何東西。 這樣的結果好嗎?(使用者得不到任何回應) 。 如何改善? (使用if/else) 。 /* if 選擇結構 */ public class Ex4_1b { public static void main(String args[]) { int age=18; if (age>=20) System.out.println("您有投票權囉!"); else System.out.println("您還沒有投票權!"); } } 您還沒有投票權! { } 的應用: 當條件成立時,要執行多條指令 /* if 選擇結構 使用大括號 */ public class Ex4_2 { public static void main(String args[]) { int eng=95, math=98, sum=0, avg=0; sum = eng + math; avg = sum/2; if (avg>=90) { System.out.println("恭喜您!這次考試平均超過90分"); System.out.printf("您的平均分數是%s分\n", avg); System.out.printf("您的總分是%s分\n", sum); } } } 恭喜您!這次考試平均超過90分 您的平均分數是96分 您的總分是193分 /* if 選擇結構 使用大括號 */ public class Ex4_2 { public static void main(String args[]) { int eng=75, math=98, sum=0, avg=0; sum = eng + math; avg = sum/2; if (avg>=90) System.out.println("恭喜您!這次考試平均超過90分"); System.out.printf("您的平均分數是%s分\n", avg); System.out.printf("您的總分是%s分\n", sum); } } 您的平均分數是86分 您的總分是173分 If / else 指令語法: If/else指令是指令是二選一的選擇結構指令,其語法為: if(決策條件)指令1; else 指令2; 當決策條件成立時執行指令1,不成立時則執行指令2。 可以使用一對大括號{ }把要執行的指令括在一 起,成為執行一連串指令構成的程序。 if(決策條件) {指令1;...;指令n;} else {指令2;...;指令m;}
應用時機: 當程式執行到某處,須依某決策條件來決定要執行的內容是A還是B時,也就是依決策條件有二選一的情形。 例如新開幕的餐廳正進行一項特惠活動,男顧客可以打八折,女顧客可以打六折。 空中書城周年慶,買3000元以下送海報,3000元以上送文具組。 注意事項: 想要得心應手地寫出各種符合需求的邏輯決策,熟悉各種資料型態的條件判斷方式十分地重要。 實例探討: 要寫一個程式判斷男顧客可以打八折,女顧客可以打六折。 想法要用性別(gender)來作為判斷條件。 儲存性別的資料如果設定為字串資料型態,那麼作條件比較時,就應該要知道字串比對的函數equals( ) 。邏輯判斷式(gender.equals(“男”))。 /* if/else 選擇結構 */ public class Ex4_3 { public static void main(String args[]) { String gender=new String("男"); int price=200; if (gender.equals("男")) { System.out.println("本餐廳今日男士八折優待"); System.out.printf("您的帳單原為%s元\n", price); System.out.printf("打八折後是%s元\n", price*0.8); } else { System.out.println("本餐廳今日女士六折優待"); System.out.printf("您的帳單原為%s元\n", price); System.out.printf("打六折後是%s元\n", price*0.6); } } } 本餐廳今日男士八折優待 您的帳單原為200元 打八折後是160.0元 動動腦: 如果餐廳的特惠價,只有在星期三才實施的話,那麼條件判斷式應該要如何修改呢? 條件判斷式必須先判斷是否為星期三,所以將形成一個兩層的判斷式,稱之為巢狀條件判斷式。 此部分在學完3-2-4將會知道如何撰寫。 /*巢狀if/else選擇結構*/ public class Ex4_3a { public static void main(String args[]) { String gender=new String("男"), day=new String("星期三"); int price=500; if (day.equals("星期三")) { if (gender.equals("男")){ System.out.println("本餐廳星期三男士八折優待"); System.out.printf("您的帳單原為%s元\n", price); System.out.printf("打八折後是%s元\n", price*0.8); } else{ System.out.println("本餐廳星期三女士六折優待"); System.out.printf("您的帳單原為%s元\n", price); System.out.printf("打六折後是%s元\n", price*0.6); } } else System.out.println("本餐廳今日無優待"); } } 本餐廳星期三男士八折優待 您的帳單原為500元 打八折後是400.0元 Switch指令語法: switch指令是多選一的選擇結構指令 其語法為: switch(條件參數) {case條件1:指令1; break; case條件2:指令2; break;...; default:指令n;} 一個switch指令其後要先接一對括弧( ),括弧中指定要用來進行條件判斷的變數。 其後則是一個大括弧{,大括弧後透過 case列出各種條件值用以作為選擇判斷的依據。 case條件後尾隨的是當 case指定的條件成立時要被執行的指令。指令後的 break 指令用來結束 switch指令,可以避免再繼續判斷後續的 case條件。 default 指令是用於當所有的case條件都不成立 時,要執行的指令。 如果沒有這一個需要,default 指令可以省略 。
應用時機: 在程式寫作需要進行多選一的判斷時,switch指令是一個很方便的工具。 透過case可以依需要列舉出各種條件狀況來選擇要進行的工作。 例如:要製作一個選單,利用 switch指令可以很方便地列出各個選項。 使用switch指令要思考條件變數和case後的比對條件的設定問題。 實例探討: 利用 switch指令,製作選單。想法: 選單有三個選項。 利用數字 1,2,3來選擇。 Switch後的條件變數:用一個整數變數 choice代表。 Case後條件: 三個case搭配 1,2,3等三個數字條件。 /* switch 選擇結構 */ public class Ex4_4 { public static void main(String args[]) { int choice=2; switch (choice) { case 1: System.out.println("選單一"); break; case 2: System.out.println("選單二"); break; case 3: System.out.println("選單三"); break; default: System.out.println("沒這個選項哦~"); } } } 選單二 動動腦 如果把 default 去掉會有何變化? 如果把 choice值改變為1,3,5,執行結果會如何? 可以使用 A, B, C 作為選單嗎? 程式要如何修改? /* switch 選擇結構 */ public class Ex4_4 { public static void main(String args[]) { char choice=A; switch (choice) { case A: System.out.println("選單一"); break; case B: System.out.println("選單二"); break; case C: System.out.println("選單三"); break; default: System.out.println("沒這個選項哦~"); } } } 選單一 巢狀if/else指令 學習動機: 在撰寫應用程式時,經常會遇到許多條件比較複雜的決策選擇情況。 此時不一定有辦法使用單純的 if/else或是 switch指令就可以應付得過來。 有經驗的程式設計師要能善用各種選擇結構的控制指令,加以組合來達成目標。 巢狀的 if/else指令組合方式是一種常用的複雜條件解決方式。其主要的概念是在 if/else指令中,又可以包含另外一個 if/else指令。 實例說明: 有一間吃到飽餐廳,男生18歲(含)以上一人要500元、18歲以下要300元。 女生18歲(含)以上一人要400元、18歲以下只要200元。 如果要進行條件判斷,由於總共有四個情況並且考慮兩個變數 (性別和年齡),使用 switch指令並不是非常合適,單純的 if/else指令又只能表示兩種情形。 把多重的 if/else指令組合起來,形成巢狀if/else指令可解決問題。 思考程序: 首先,先把條件判斷的邏輯想清楚再畫出流程圖。 假設先判斷性別,再判斷年齡: 一開始判斷性別是否為男生,如果是男生則第一個條件判斷結果為「成立」,再判斷年齡是否大於等於18歲,如果是的話,則設定價格為500元,否則設定價格為300元。 如果是女生的話,代表第一個條件判斷結果為「不成立」,再判斷年齡是否大於等於18歲,如果是的話,則設定價格為400元,否則設定價格為200元。
流程圖的重要性: 養成一個好習慣,在撰寫程式之前,先把流程圖畫出來。 當條件判斷的邏輯流程圖畫出來後,可以很容易依流程圖寫成程式。 好處: 有助於程式的邏輯思考與撰寫。未來在進行程式的除錯與維護亦有相當大的幫助。 /* 巢狀if/else 選擇結構 */ public class Ex4_5 { public static void main(String args[]) { String gender="男"; int age=16, price=0; if (gender.equals("男")) if (age>=18) price=500; else price=300; else if (age>=18) price=400; else price=200; System.out.printf("性別%s, 年齡%d的價格為%d元\n", gender, age, price); } } 性別男, 年齡16的價格為300元 動動腦 把程式中的 gender與 age分別改為女生與22 歲,看看執行結果如何? 判斷邏輯如果改為先判斷年齡再判斷性別,是否一樣可以達成目標?流程圖應如何畫?
/* * 巢狀if/else選擇結構,先判斷年齡再判斷性別 */ public class Ex4_5b { public static void main(String[] args){ int age = 20, price = 0; String gender = "女"; if(age >= 18) if(gender.equals("男")) price = 500; else price = 400; else if(gender.equals("男")) price = 300; else price = 200; System.out.printf("性別%s, 年齡%d的價格為%d元\n", gender, age, price); } } 性別女, 年齡20的價格為400元 while指令語法: while指令是一種以條件判斷迴圈是否執行的重複結構指,令其語法為:while(決策條件)指令; while指令執行時先判斷決策條件是否成立,成立的話則執行指令。執行完指令後再回頭重新判斷決策條件,成 立的話則再次執行指令。如此周而復始直到決策條件不成立為止。 如果迴圈內要執行的動作是多個指令時(也就是說是一個程序),可以使用一對大括號{}把這些指令括在一起。 while(決策條件) { 指令1; 指令2;...;指令n;}
應用時機: 在撰寫程式解決問題的過程中,經常會有需要讓指令被重複執行的時機。 讓指令重覆被執行,當然可以直接將指令重複寫在程式中,但是卻沒有人這樣做。 第一個原因是可能不知道指令應該被執行幾次或是指令應該被執行的條件是什麼? 第二個原因是即使知道指令要被執行的次數,如果這個數字很大,不但撰寫起來麻煩,也很有可能把次數算錯。 while指令提供程式設計者可以依據一個決策條件來決定指,令是否要被反覆執行。 實例討論: 某人身上有100元,想寫一個程式可以隨機讓他每次買一樣價格為10~30元之間的物品,直到把錢花到不夠買東西為止。想想看要如何設計這樣的程式? 一開始讓某人隨意買東西,由於物品最便宜的價格為10元,所以當某人把錢花到剩不到10元時,那麼整個採買也就結束了。
/* while 重複結構 */ public class Ex4_6 { public static void main(String args[]) { int money=100, item=0, total=0; while (money>=10) { item=(int)(Math.random()*20+10); if (money>=item) { money=money-item; System.out.printf("買了一樣價格%d元的物品\n", item); total++; } } System.out.printf("總共買了%d樣物品, 還剩%d元\n", total, money); } } 動動腦: 試著利用while迴圈寫一個計算。 1+2+…+99+100總和的程式 /*while重複結構,整數連加運算*/ public class SumOfInteger { public static void main(String[] args){ int a = 0, sum = 0; while (a <= 100="" font=""> sum += a ; a++; //System.out.printf("1+2+3+...+100的和= %4d\n" , sum ); } System.out.printf("1+2+3+...+100的和= %4d\n" , sum ); } } 1+2+3+...+100的和= 5050 試著利用 while迴圈寫一個可列印一個由*符號構成的三角形。 /*while重複結構,列印*構成的三角形*/ public class TriangleShape { public static void main(String[] args){ int i=0, length=10; while(i<=length){ font=""> int j = 1; while(j<=length-i){ font=""> System.out.print(" "); j++; } int k = 1; while(k<2*i-2){ font=""> System.out.print("*"); k++; } System.out.println(); i++; } } } * *** ***** ******* ********* *********** ************* *************** 請撰寫一個 Java 應用程式,可以列印九九乘法表, /*while重複結構,九九乘法*/ public class Ex4_6a { public static void main(String[] args){ int i=1; while (i<=9){ font=""> int j=1; while (j<=9){ font=""> System.out.printf("%d*%d=%2d\t", i,j,i*j); j++; } i++; System.out.printf("\n"); } } } 1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 do while指令語法: do while指令是一種以條件判斷迴圈是否執行的重複結構指令,在判斷前會先執行迴圈的內容一次其語法為: do(指令); while(決策條件); do while指令的特色是不管決策條件是否會成立,都會先執行一次迴圈內的指令。 如果迴圈內要執行的動作是多個指令時(也就是說是一個程序),可以使用一對大括號{}把這些指令括在一起。 do{指令1;指令2;...;指令n;} while(決策條件)
應用時機與注意事項: 指令須要先被執行一次,再依條件決定是否重複執行。 do while指令要應用得好,重點就在於是否能夠寫出合適的決策條件。 迴圈類的指令也必須注意防範成為無窮迴圈的可能,迴圈內的指令一定要有可以變化決策條件結果的指令。 實例討論: 寫一個猜數字遊戲,一開始由電腦亂數「想」一個數當作謎底,再來就是使用者要不斷地猜,直到猜中為止。 每猜一個數字,電腦會依據比對結果提示所猜的數字是比謎底大還是小。 這個例子需要不斷地讓使用者猜,直到猜中為止,且至少必須猜一次。 適用do while指令來解決問題。
/* do while 重複結構 */ import javax.swing.JOptionPane; public class Ex4_7 { public static void main(String args[]) { String strGuess; int ans=0, guess=0, guess_time=0; ans=(int)(Math.random()*99+1); do { strGuess=JOptionPane.showInputDialog("請猜一個數字:"); guess=Integer.parseInt(strGuess); if (ans>guess) JOptionPane.showMessageDialog(null, "你猜的數字太小了~"); if (ansshowMessageDialog(null, "你猜的數字太大了~"); guess_time++; } while (ans!=guess); JOptionPane.showMessageDialog(null, "答對了~答案是"+ans+",你總共猜了"+guess_time+"次"); System.exit(0); } } 程式講解: ans是利用電腦亂數產生的謎底。 JOptionPane.showInputDialog( )函數來讓使用者輸入要猜的資料,透過轉換函數將輸入資料轉換為數字並儲存於guess變數中。 guess_time變數用來記錄已經猜了幾次。 當猜中謎底時,do while 迴圈的條件就不成立,迴圈結束。 最後執行列印答案、猜的次數等資訊,透過 JOptionPane 物件讓列印結果以視窗的方式顯示出來。 for 指令語法: for指令是最常用的一種迴圈指令,其迴圈的執行次數是透過控制變數的變化來達成其語法為:for (控制變數的初值;迴圈的持續條件;控制變數的變化) 指令; for 關鍵字後的括弧內有三項資訊: 控制變數的初值。 迴圈的持續條件。 控制變數的變化。 for迴圈的執行,執行完第一項設定初值的指令後,即進行第二項的條件判斷。因此,如果一開始設定的初值就不滿足迴圈的持續條件, for迴圈連一次都不會執行迴圈內的指令。
應用時機: for迴圈是最常用的迴圈指令,大多數在寫程式過程中,最常遇到的就是要執行一定次數的迴圈。 for迴圈中的指令往往會搭配著控制變數的變化,學習 for迴圈一定要瞭解如何設計指令的執行與控制變數之間的關係。 實例討論: 要計算1加到100的值(1+2+3+..+99+100),要如何使用for迴圈達成呢? /* for 重複結構 */ public class Ex4_8 { public static void main(String args[]) { int i; int sum=0; for (i=1;i<=100;i++) sum="sum+i;</font"> System.out.printf("1+2+..+99+100=%d\n", sum); } } 動動腦: 所有的for迴圈可以用 while迴圈改寫,達到一樣的目的。 試以 while迴圈取代for迴圈執行1累加到100的程式。 雖然while迴圈本身只能設定迴圈的執行條件。 在寫程式時可以把變數i的初值設定放在迴圈之前。 /*while重複結構,整數連加運算*/ public class SumOfInteger { public static void main(String[] args){ int a = 0, sum = 0; while (a <= 100="" font=""> sum += a ; a++; //System.out.printf("1+2+3+...+100的和= %4d\n" , sum ); } System.out.printf("1+2+3+...+100的和= %4d\n" , sum ); } } 動動腦: (1+3+5+..+99),要如何使用for迴圈達成呢? /* for 重複結構 */ public class Ex4_8 { public static void main(String args[]) { int i; int sum=0; for (i=1;i<=100; i="" 2="" sum="sum+i;</font"> System.out.printf("1+3+5+..+99=%d\n", sum); } } 1+3+5+..+99=2500 身分證字號檢查程式 單元目標: 學會撰寫程式解決問題的構思流程。 瞭解繪製流程圖的概念。 學會和身分證檢查的相關java函數應用。 身分證字號檢查的原理: 一組身分證字號是由10個字碼所組成。其代表意義為: 第1碼為英文字母,代表地區。 第2碼字元為性別,1代表男性、2代表女性。 第3~9碼為流水號,由阿拉伯數字0~9構成。 第10碼為檢查碼,前9個字碼可以透過一個計算公式產生一個0~9之間的數字,此數字可以透過和檢查碼的驗證,檢查出身分證字號是不是一個符合規定身分證字號。 檢查公式的運作方式(一) 第1碼的英文字母分別可以對應到一組數字,轉換為數字才能套用數學公式,其對照如下:
檢查公式的運作方式(二) 先將英文字母對照得到的數字,十位數乘1加上個位數乘上9。 接著第2碼乘上8、第3碼乘上7、…、第9碼乘上 1。 全部累加後再加上檢查碼必須可以被10整除。 身分證字號檢查的重點: 身分證字號的長度必須是10個字元。 身分證字號的第1個字元必須是A~Z間的英文字母。 身分證字號的第2個字元必須是1或是2。 身分證字號的檢查碼和前9個字元經過公式計算的結果加總起來必須是可以被10整除。
/* 身分證字號檢查程式 */ import javax.swing.JOptionPane; public class Ex4_10 { public static void main(String args[]) { String strID; int intAreaNum[]= {10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27, 28,29,32,30,31,33}; int intChecksum=0; int i; char firstChar; strID=JOptionPane.showInputDialog("請輸入身分證字號:"); if (strID.length()!=10) JOptionPane.showMessageDialog(null, "您輸入的身分證字號長度不正確"); else { strID=strID.toUpperCase(); firstChar = strID.charAt(0); if (firstChar<A || firstChar>Z) JOptionPane.showMessageDialog(null, "您輸入的身分證字號第1個字不是英文字母"); else if (strID.charAt(1)!=1 && strID.charAt(1)!=2) JOptionPane.showMessageDialog(null, "您輸入的身分證字號第2個字錯誤"); else { intChecksum=(int) (intAreaNum[firstChar-A]/10) + (intAreaNum[firstChar-A]%10)*9; for (i=1;i<=8;i++) intchecksum="intChecksum" strid="" charat="" i="" -="" font="">0)*(9-i); intChecksum=(strID.charAt(9)-0+intChecksum)%10; if (intChecksum==0) JOptionPane.showMessageDialog(null, "您輸入的身分證字號正確"); else JOptionPane.showMessageDialog(null, "您輸入的身分證字號錯誤"); } } } } 重點整理 : 輸入身分證字號: 利用JOptionPane.showInputDialog(),讓使用者輸入字串(第11行)。 檢查身分證字號的長度: 字串類別有一個length()函數可使用,很容易就檢查出長度,如果不等於10就輸出錯誤訊息(第 12行),並結束程式。 檢查身分證字號的第1個字元是否為英文字母: 第15行toUpperCase()之作用是把字串中的英文字母轉換為大寫,這樣在後續的判斷條件撰寫較為精簡。 第16行利用charAt()函數將身分證字串中的第1 個字元取出來,請記得在java中所有計數的索引都是從0開始,因此字串中的第1個字元,其索引值為0。 檢查身分證字號的第2個字元是否為1或2:利用&&運算來判斷,當身分證字號的第2個字元不等於1也不等於2時,就是錯誤了(第19行)。 字元是可以比對其大小的,第17行利用比A小或是比Z大的判斷來排除不是A~Z之間的情形(別忘了||代表或的邏輯運算)。 最後的檢查公式判斷:這一部分可以分為兩段來處理 第一段先計算英文字母對照出來的數字與加權的結果。 這裡用了一個小技巧,我們在intAreaNum陣列中儲存了每一個字元對應到的數值(第6行),並利用第1個字元(至此已確定為大寫的英文字母,否則在第17行的判斷式中就被剔除了) 與字元A的差值作為存取intAreaNum陣列的索引(假設第1個字元為A,字元A減A的結果將得到0,於是intAreaNum陣列索引值為0的項目就被取出來了)。 數值取出後,計算其10位數可以將之除以10得知(取其商數)、計算其個位數可以用%運算,直接取餘數(第22行),此一技巧經常會使用到。 第二段為後續字元的加權計算,由於所作的計算極為類似,因此可設計一個for迴圈來完成: 後續總共有8個字元,故可設for迴圈重複8次。 要知道身分證字號中的字元取出來後,看起來雖然是數字,但其型態實為字元,因此讓它與字元0相減,便能轉換為數字,這和前面英文字母減去字元A以計算出索引值有著異曲同工之妙。 取出之數值要乘上權重,權重值剛好與迴圈控制變數有固定的關聯(可推得9-i為權重值,培養這種推算能力十分重要),因此可輕鬆完成相關的運算式。 完成運算後,再將最後一碼檢查碼加上,同樣要先轉換為數值,如果可以被10整除即為正確的身分證字號,否則即為錯誤的身分證字號。 魔術方陣 單元目標: 學會魔術方陣的程式設計與撰寫。 培養撰寫程式的經驗。 何謂魔術方陣: 一個連續的數列矩陣: 如 3x3或 5x5…等。 數字由1開始逐次累加,填滿整個矩陣。 特殊條件: 矩陣的直向、橫向與對角線加總皆相等。 排列方法:魔術方陣的數列可以從1開始,依照特定規則逐項填入,可以達成魔術方陣的條件。 魔術方陣的數字填列方式 以5x5魔術方陣為例: 程式撰寫: 建立陣列物件: int square [ ] [ ]= new int [size] [size]; 開始填列數字: 設定起點。 進入迴圈: 依公式前往左上方儲存格(記得儲存格的上下也是相接的)。 如遇已填入的格子則往下走。 填滿後印出結果。 /* 魔術方陣 */ public class Ex4_11 { public static void main(String args[]) { int col=0, row,i,j; int counter; int size=5; int square[][]=new int[size][size]; square[0][(size-1)/2]=1; i=0; j=(size-1)/2; for (counter=2;counter<=size*size;counter++) font=""> row=(i-1<0)?(size-1):(i-1); font=""> col=(j-1<0)?(size-1):(j-1); font=""> if (square[row][col]!=0) i=(++i) % size; else { i=row; j=(j-1<0)?(size-1):--j; font=""> } square[i][j]=counter; } System.out.println("\n"); for (i=0;i for(j=0;jout.printf("%2d ", square[i] [j]); System.out.println("\n"); } } } 語法固然重要,但很多人學會了指令的語法後往往還是不知如何運用,因此,應用時機部分,一定要仔細看、了解清楚。 在練習的時候,可以先從教材中所舉的範例開始,把人腦當電腦推演一次,推演的結果要和電腦執行的結果一致。接著,改改範例中的相關參數,再推演一次,再和電腦執行的結果相驗證。 先學會指令只能算是微觀的部分。也就是說了解了指令的語法結構與如何執行的細節,要應用指令來寫出能解決問題的程式,須有整體的概念,也就是巨觀的部分。 撰寫一個程式,要先了解要解決的問題是什麼、你要電腦幫你做的事是什麼,先分析問題,下一步再來繪製流程圖,接下來就可以按部就班把程式一一寫出。寫好了之後,就是進行執行測試,要有能力發現錯誤並修正錯誤。 |
|
( 知識學習|隨堂筆記 ) |