臺北市立大學 資訊科學系(含碩士班) 賴阿福 複習算術運算式、條件運算式 臺北市立大學 資訊科學系(含碩士班) 賴阿福
搶答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 (反) 符合條件數值範圍? Same as (nn<100 || nn>999) 100 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) else 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)) else 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) else 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) else 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) 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-1; x++; x--; ++x; --x; x+=1; x-=1;
再談分支 (selection, branch) III 程式如何轉彎? 臺北市立大學 資訊科學系(含碩士班) 賴阿福
Review BMI診斷:分成三層次(簡化)
多分支流程圖 輸入身高(公尺) 可交換 輸入體重(公斤) 循序 SEQUENCE 計算BMI BMI<=18.5 False False True True 分支 (SELECTION) Status=“過輕” Status=“正常” Status=“過重” 印出status End
多分支流程圖 輸入身高(公尺) 輸入體重(公斤) SEQUENCE 計算BMI BMI<18.5 BMI<24 False True True 分支 (SELECTION) Status=“過輕” Status=“正常” Status=“過重” 印出status End
BMI診斷 完整BMI診斷需要分支? 流程圖如何畫?
猜數字遊戲 解題方法: 運用亂數函數(亂數類別)產生整數隨機數值 猜數字:讓使用者輸入數值 判斷答對與否,且輸出回饋信息
猜數字遊戲flow chart Nested if 產生整數隨機數值 輸入數值 No 輸入值等於亂數 yes No 輸入值大於亂數 印“猜對” yes 印“太大” 印“太小”
猜數字遊戲(1):運用亂數設計猜數字遊戲程式 多重分支 Multi-way if
產生1~100亂數 建立亂數類別SecureRandom之物件 ,再以此類別 nextInt函數(方法)產生1~100隨機整數 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)閏年規則如下: 每逢閏年,2月分有29日,平年的2月分為28日 閏年:閏年是比普通年分多出一段時間的年分,目的是為了彌補人為 規定的紀年與地球公轉產生的差異 格里高利曆(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)流程圖 條件式調整順序,是否正確? 多重Multi-way if Not year被400整除 yes Not year被100整除 印“閏年” yes Not year被4整除 印“平年” yes 印“平年” 印“閏年”
巢狀分支Nested if Not year被400整除 yes Not Year不被100整除 印“閏年” yes Not 印“平年” yes 印“平年” 印“閏年”
No year被400整除 ※ Yes Year不可被100整除 且可被4整除 No 印“閏年” Yes 印“閏年” 印“平年” 二分支都可得閏年:或(or)
(year被400整除 )或 (Year不可被100整除 且可被4整除) No Yes 印“閏年” 印“平年”
閏年規則轉成條件 閏年規則如下: if ((year%4==0 && year%100!=0)|| year%400==0) { 是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; 條件 False True S2; S3;
猜數字遊戲 讓猜數字重複執行 猜到對為止 繼續猜 但何時結束? 結束條件 建立亂數類別SecureRandom之物件 以此類別nextInt函數(方法)產生1~100隨機整數 猜數字:讓使用者輸入數值 判斷答對與否,且輸出回饋信息
產生第一個亂數 繼續 玩/猜? 輸入數值 印“答錯了” 輸入值==亂數 False True 印“答對了” 下一個亂數值
讓猜數字重複執行
程式與流程圖對應
import java. security. SecureRandom; import java. util 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"); }//else }//while }//main }//class 迴圈會執行? Why?
習題 習題2:輸入民國幾年,判斷該年是閏 年或平年,須能重複執行,直到輸入 年份為<=-100 正方形或長方形條件? 習題1:輸入矩形長、寬(整數)資料,求面積及邊長、判 斷為正方形或長方形,但須能重複執行,直到長或寬 輸入為<=0 正方形或長方形條件? 如何解決? 請規畫其過程 (解法)且畫流程圖 習題2:輸入民國幾年,判斷該年是閏 年或平年,須能重複執行,直到輸入 年份為<=-100