複習算術運算式 條件運算式 臺北市立大學資訊科學系 ( 含碩士班 ) 賴阿福
搶答 Q1: debug int x=9, y=8, z; if (y=x+1) z=3; if (x-1=y+8) z=4;
搶答 Q1: debug (answer) int x=9, y=8, z; if (y==x+1) z=3; if (x-1==y+8) z=4; int x=9, y=8, z; if (y==x+1) z=3; if (x-1==y+8) z=4; int x=9, y=8, z; if (y==x+1) { z=3; } if (x-1==y+8) { z=4; }
條件 Q2: 邏輯運算式 ( 立即搶答 ) if (nn>=100 && nn<=999) && : and ( 及 ) 符合條件數值範圍? If (nn>=100 nn<=999) : or ( 或 ) 符合條件數值範圍?
條件 Q3: 邏輯運算式 ( 立即搶答 ) If (nn<100 nn>999) 符合條件數值範圍? If (nn<100 && nn>999) 符合條件數值範圍? If (!(nn>=100 && nn<=999))! : not ( 反 ) 符合條件數值範圍?
條件 Q2/3: 邏輯運算式 (answer) if (nn>=100 && nn<=999) && : and ( 及 ) 交集 符合條件數值範圍? 100<= nn <=999 If (nn>=100 nn<=999) : or ( 或 ) 聯集 符合條件數值範圍? unlimited If (nn<100 nn>999) 符合條件數值範圍? 100~999 之外 If (nn<100 && nn>999) 符合條件數值範圍? 無此 if (!(nn>=100 && nn<=999))! : not ( 反 ) 100 999 符合條件數值範圍? Same as (nn<100 nn>999)
搶答 Q4 int x, y, z = 5; x = y = z + 5; z = x + y + z; System.out.println("z = " + z);
搶答 Q5 int x1 = 9, y1 = 8, z1 = 7; x1 = x1 % z1; if (x1 < 5) y1 = y1 + 1; else y1 = x1 + 1; System.out.println("y1 = " + y1);
搶答 Q6 x1 = 9; y1=8; z1=7; x1 = x1 % z1; if (!(x1<=5)) y1 = y1 + 1; else y1 = x1 + 1; System.out.println("y1 = " + y1);
搶答 Q7 int w=7, p = 4; x = 3; p = w / x * 2; if (p<18 && p>8) x = (x*x)%2; else x = x % 3; System.out.println("x = " + x);
搶答 Q8 w = 7; p = 4; x = 3; p = w / x * 2; if (p<18 p>8) x = (x*x)%2; else x = x % 3; System.out.println("x = " + x);
搶答 Q9 w = 8; p = 6; x = 4; x++; //x = x + 1; if( w+1 == p+3) x=x+1; System.out.println("x = " + x);
搶答 Q10 w = 8; p = 4; x = 2; x--; //x = x-1; if (w+1!=p+3) x = x--; else x = x++; System.out.println("x = " + x);
Q4~Q10 Answer Please download test_if.java, compile & run Then try to revise and test
Assignment statement x=x+1; x++; x=x-1; x--; ++x; --x; x+=1; x-=1;
再談分支 (selection, branch) III 程式如何轉彎? 臺北市立大學資訊科學系 ( 含碩士班 ) 賴阿福
Review BMI 診斷 : 分成三層次 ( 簡化 )
多分支流程圖 循序 SEQUENCE 輸入身高 ( 公尺 ) 輸入體重 ( 公斤 ) 計算 BMI 可交換 BMI<=18.5 BMI<18.5 False BMI>=18.5 && BMI<24 False 分支 (SELECTION) True True Status= 過輕 Status= 正常 Status= 過重 印出 status End
多分支流程圖 輸入身高 ( 公尺 ) SEQUENCE 輸入體重 ( 公斤 ) 計算 BMI BMI<18.5 False BMI<24 False 分支 (SELECTION) True True Status= 過輕 Status= 正常 Status= 過重 印出 status End
BMI 診斷 完整 BMI 診斷需要分支? 流程圖如何畫?
猜數字遊戲 解題方法 : 運用亂數函數 ( 亂數類別 ) 產生整數隨機數值 猜數字 : 讓使用者輸入數值 判斷答對與否, 且輸出回饋信息
產生整數隨機數值 猜數字遊戲 flow chart Nested if 輸入數值 輸入值等於亂數 No yes 印 猜對 輸入值大於亂數 yes No 印 太大 印 太小
猜數字遊戲 (1): 運用亂數設計猜數字遊戲程式 多重分支 Multi-way if
產生 1~100 亂數 建立亂數類別 SecureRandom 之物件, 再以此類別 nextint 函數 ( 方法 ) 產生 1~100 隨機整數 Secure: 安全,Random: 亂數 隨機 SecureRandom sr = new SecureRandom(); a = sr.nextint(100)+1; new SecureRandom() 以建立 sr 物件, 再用.nextInt(100) 方法 /method 產生 0~99 隨機整數 sr.nextint(100) +1 import java.security.securerandom; 如何產生 10~90 隨機整數?
猜數字遊戲 (2): 運用亂數設計猜數字遊戲程式 巢狀分支 Nested if
猜數字遊戲 (3): 運用亂數設計猜數字遊戲程式 巢狀分支 Nested if
不同分支, 相同結果 多重 Multi-way if 三個分支 巢狀分支 Nested if
巢狀分支 Nested if 第一層 : 二個分支 第二層 : 二個分支
猜數字遊戲之反思 目標 : 讓初學者熟悉巢狀分支 Nested if 多重分支 Multi-way if 邏輯變化 分支結構 缺點 : 無法讓使用者依據太大 太小的回饋訊息再次輸入數字, 應重複直至使用者答對或不想玩 Loop ( 迴圈 ) can do it
System.out.print("Please input a 3-digit decimal:"); Scanner ipt = new Scanner(System.in); int nn = ipt.nextint(); int n1=nn%10; int n2=nn/10; System.out.print("You input nn="+nn+"; first digit="+n1+";"); System.out.println("higher digit="+n2);
判斷閏年 (leap year) 平年 (common year)
閏年 平年 閏年 : 閏年是比普通年分多出一段時間的年分, 目的是為了彌補人為規定的紀年與地球公轉產生的差異 格里高利曆 (Calendarium Gregorianum) 閏年規則如下 : 4 的倍數是可能的 100 的倍數是不可能的 400 的倍數是可能的 每逢閏年,2 月分有 29 日, 平年的 2 月分為 28 日 公元前之閏年出現在 1, 5, 9, 13,... BC, 須將年份值減 1 再以 除以 4 計算 ( 因為沒有公元 0 年這一年, 所以公元前 1, 2, 3, 4,... 年應該是公元 0, -1, -2, -3,... 年, 而公元前 1, 5, 9, 13,... 年為公元 0, -4, -8, -12,... 年, 為 4 的倍數 ) https://zh.wikipedia.org/wiki/%e9%97%b0%e5%b9%b4
判斷閏年 (leap year) 平年 (common year) 流程圖條件式調整順序, 是否正確? year 被 400 整除 Not 多重 Multi-way if yes 印 閏年 year 被 100 整除 Not yes 印 平年 year 被 4 整除 yes 印 閏年 Not 印 平年
巢狀分支 Nested if year 被 400 整除 Not yes 印 閏年 Year 不被 100 整除 yes Not year 被 4 整除 yes Not 印 平年 印 閏年 印 平年
year 被 400 整除 No Yes 印 閏年 Year 不可被 100 整除且可被 4 整除 No Yes 印 閏年 印 平年 二分支都可得閏年 : 或 (or)
(year 被 400 整除 ) 或 (Year 不可被 100 整除且可被 4 整除 ) No Yes 印 閏年 印 平年
閏年規則轉成條件 閏年規則如下 : 是 4 的倍數 不是 100 的倍數 是 400 的倍數 if ((year%4==0 && year%100!=0) year%400==0) { status = " 閏年 (leap year)!"; } else status = " 平年 (common year)!";
迴圈 (loop) 概念 : 讓程式繞圈圈
迴圈 (loop) 應用 : 讓猜數字重複執行 猜到對為止 繼續猜 但何時結束? 結束條件 重複計算 BMI 重複判斷 leap year( 閏年 )
迴圈 (loop) 概念 重複不斷執行, 直到條件不符合為止 常見型態 :for while do while 一開始條件須符合, 才能進入迴圈內部執行 無窮迴圈 : 條件永遠符合 有些環境必須是無窮迴圈 : O.S( 作業系統 ) *CPU 特性 : 重複執行 ( 耐性 ) S1; while ( 條件 ) { S2; } S3; S1; 條件 S2; S3; True False
猜數字遊戲 讓猜數字重複執行 猜到對為止 繼續猜 但何時結束? 結束條件 建立亂數類別 SecureRandom 之物件以此類別 nextint 函數 ( 方法 ) 產生 1~100 隨機整數猜數字 : 讓使用者輸入數值判斷答對與否, 且輸出回饋信息
產生第一個亂數 繼續玩 / 猜? 輸入數值 印 答錯了 False 輸入值 == 亂數 True 印 答對了 下一個亂數值
讓猜數字重複執行
程式與流程圖對應
import java.security.securerandom; import java.util.scanner; public class GuessN_3 { public static void main(string[] args) { SecureRandom sr = new SecureRandom(); Scanner input = new Scanner(System.in); int a = 0; int b = 0; a = sr.nextint(100)+1; while (b>0) { System.out.print(" 猜數字 (1~100):"); b = input.nextint(); if (a!= b) { //nested if if (a > b) System.out.println(" 猜的太小囉 "); else System.out.println(" 猜的太大囉 "); } //if else { System.out.println(" 恭喜猜對!\n"); a = sr.nextint(100)+1; }//else }//while }//main }//class 迴圈會執行? Why?
習題 習題 1: 輸入矩形長 寬 ( 整數 ) 資料, 求面積及邊長 判斷為正方形或長方形, 但須能重複執行, 直到長或寬輸入為 <=0 正方形或長方形條件? 如何解決? 請規畫其過程 ( 解法 ) 且畫流程圖 習題 2: 輸入民國幾年, 判斷該年是閏年或平年, 須能重複執行, 直到輸入年份為 <=-100