請大家準時上課
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口) 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口) 公誠樓三樓 G316 電腦教室(資訊科學系) 可自行攜帶筆電 目標:協助習題、安裝java 環境、path設定 參加者:請email 給laiahfur@gmail.com 或直接到輔導地點 下次預定: 4/14 (星期六) 09:10~16:00
搶答 1.宣告w為整數變數請寫此敘述(指令)?宣告目的為何?
搶答 2.將w整數變數內容放入80;
搶答 3.將w整數變數原本內容再增加15?
搶答 4.將w的整數變數內容放入(set)z整數變數?
搶答 5.將w及z整數變數內容相乘後,放入y整數變數內容?
搶答 6.將w整數變數內容清除為0?
搶答 7.下列哪些變數名稱是不合法的?(複選) (1)x-y (2)x+y (3)3pig (4)x4B (5)x*y
搶答 8.那些變數的名稱不合法invalid? (1) a_2 (2) 123pp (3) p+q (4) f%3
搶答 9.x+3=z*k; 上述Bug在何處?如何修改才會正確?
解答 1.宣告w為整數變數,請寫此敘述(指令)?宣告目的為何? Ans: int w;宣告目的在於請求系統依資料型態配給一塊記憶體 Ans: w=80; 3.將w整數變數原本內容再增加15? Ans: w=w+15; 4.將w的整數變數內容放入(set)z整數變數?(z已宣告) Ans: z=w; 5.將w及z整數變數內容相乘後,放入y整數變數內容? (y已宣告) Ans: y=w*z; 6.將w整數變數內容清除為0? Ans: w=0;
解答 7.下列哪些變數名稱是不合法的?(複選) (1)x-y (2)x+y (3)3pig (4)x4B (5)x*y Ans: 1, 2, 3, 5 8.那些變數的名稱不合法(invalid)? (1) a_2 (2) 123pp (3) p+q (4) f%3 Ans: 2, 3,4 9.x+3=z*k; 上述Bug在何處?如何修改才會正確? Ans: x_3=z*k;或 x3=z*k;或 x=z*k;
搶答: 變數內容追蹤, 印出結果? int X=10, Y=4, Z=15; X=X+1; X=X+Y; Z=(Y*Y)%(X-1); System.out.println(“X=“+X+”, Z=“+Z); 思考三分鐘後,請在ADOBE connect 右下角聊天區作答!
分支 (selection,branch) 程式會轉彎 臺北市立大學 資訊科學系(含碩士班) 賴阿福
變數(variable)概念複習 何謂變數?執行時,變數存在何處? 變數有何用途? 變數有哪些型態(data type)? 為何需有不同型態? 變數如何宣告?為何要宣告? 變數內容如何給初值? 變數內容如何存、取:存入(store, set)、取出(get, retrieve)
變數概念複習 何謂變數?變數存在何處? 變數有何用途? 變數有哪些型態? 為何需有不同型態? 變數如何宣告? 變數內容如何給初值? 變數代表程式要使用一塊RAM,存在RAM 變數有何用途? 紀錄、存放變動資料 變數有哪些型態? 整數、浮點數、字串、boolean、char 為何需有不同型態? 不同型態有不同用途、值域 變數如何宣告? int p,q,r; 變數內容如何給初值? int p=9,q; 變數內容如何存、取:存入(透過=)、取出 存入 p=100; 取出 System.out.print(“p=“+p); int p; int q; int r;
比較 (連連看) Math x=x+1 y=x+1 x-1=y+8 Java x=x+1; If (y==x+1) 比較 (連連看) Math x=x+1 y=x+1 x-1=y+8 Java x=x+1; If (y==x+1) If (x-1==y+8) 方程式 指定運算 條件式(等於) 不存在(bug)
變數內容互換(swap, exchange) int p=50, q=70; p=q; q=p; 50 70 p p p q q q 思考三分鐘!將每敘述造成改變,填入RAM CORRECT? INCORRECT?
變數內容互換1(swap, exchange) int p=50, q=70, t1,t2; t1=p; t2=q; p=t2; q=t1; 50 70 p p p q q q t1 t1 t1 t2 t2 t2 思考三分鐘!將每敘述造成改變,填入RAM CORRECT? INCORRECT? p p q q t1 t1 t2 t2
變數內容互換2(swap, exchange) int p=50, q=70, t; t=p; p=q; q=t; 50 70 p p p q q q t t t p 思考三分鐘!將每敘述造成改變,填入RAM CORRECT? INCORRECT? q t
少,是王道!The less, the better! 變數用得越少越好? 敘述(code)寫得越少越好,Why? 資源: CPU time, RAM For Portable devices
從循序(sequence)結構到分支/選擇 (Branch/selection)結構: 程式會轉彎 再談分支/選擇
條件式 判斷成績(SC)及格與否: 條件為真(true),印出”及格” 否則,印出”不及格” sc>=60條件式是屬於關係運算式 false 判斷成績(SC)及格與否: 條件為真(true),印出”及格” 否則,印出”不及格” sc>=60條件式是屬於關係運算式 if (sc>=60) 印出”及格” else 印出”不及格” true 印出”及格” 印出”不及格”
條件式 條件為真(true),印出”及格” 否則,印出”不及格” if !(sc<60) 印出”及格” else 印出”不及格” false 條件為真(true),印出”及格” 否則,印出”不及格” !(sc<60) 條件式 (sc<60)是關係運算式 !是反向邏輯(not) if !(sc<60) 印出”及格” else 印出”不及格” true 印出”及格” 印出”不及格”
條件式 條件為真(true),印出”不及格” 否則,]印出” 及格” sc<60條件式是屬於關係運算式 if (sc<60) false 條件為真(true),印出”不及格” 否則,]印出” 及格” sc<60條件式是屬於關係運算式 if (sc<60) 印出”不及格” else 印出” 及格” true 印出”不及格” 印出” 及格”
分支靠”條件” 條件 條件 關係運算式 邏輯運算式 結果: == 等於 != 不等於 >、<、<=、>= && :and且 || :or 或 ! :not反/非 結果: True:真 False:偽
判斷偶數、奇數? 如果條件為真(true),印出”偶數” 否則,印出”奇數” n%2==0條件式是屬於關係運算式 if (n%2==0) false 如果條件為真(true),印出”偶數” 否則,印出”奇數” n%2==0條件式是屬於關係運算式 if (n%2==0) 印出”偶數” else 印出”奇數” true 印出”偶數” 印出”奇數”
判斷偶數、奇數? import java.util.Scanner; public class evennumber { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("輸入數值:"); int n = input.nextInt(); if (n%2==0) System.out.println(n+"是偶數!"); else System.out.println(n+"是奇數!"); }
判斷偶數、奇數?改變條件式 如果條件為真(true),印出”奇數” 否則,印出”偶數” n%2==1條件式是屬於關係運算式 false 如果條件為真(true),印出”奇數” 否則,印出”偶數” n%2==1條件式是屬於關係運算式 if (n%2==1) 印出”奇數” else 印出” 偶數” true 印出”奇數” 印出”偶數”
邏輯運算式 A B A and B A && B A or B A || B Not A !A F T
條件:邏輯運算式 (立即搶答) if (nn>=100 && nn<=999) && : and (及) 符合條件數值範圍? If (nn>=100 || nn<=999) || : or (或) If (nn<100 || nn>999) If (nn<100 && nn>999) if !(nn>=100 && nn<=999) ! : not (反)
條件:邏輯運算式 (立即搶答) 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
不只算BMI,再探討條件式判斷體位BMI
判斷體位是否標準? 健康體位 不標準體位 選擇/分支 (selection) BMI>=18.5 && BMI<24 選擇/分支 (selection) False if (BMI>=18.5 && BMI<24) System.out.print("健康體位 Normal\n\n"); else System.out.print("不標準體位\n\n"); //source file: BMI-2a True 健康體位 不標準體位
BMI診斷分成二層次 if (bmi>=18.5 && bmi < 24) status = "正常Normal"; else import java.util.Scanner; public class BMI_2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("輸入身高:"); double height = input.nextDouble(); System.out.print("輸入體重:"); double weight = input.nextDouble(); double bmi = Math.round((weight/ (height*height) )* 100) / 100.0; String status; if (bmi>=18.5 && bmi < 24) status = "正常Normal"; else status = "不標準體位"; System.out.println("BMI:"+bmi+",狀態: "+status); }//main }//class
將BMI診斷分成三層次(簡化)
比較 if (bmi < 18.5) status = "體重過輕Underweight"; else if (bmi>=18.5 && bmi < 24) status = "正常Normal (18.5<=BMI<24)"; else status = "過重Overweight"; if (bmi < 18.5) status = "體重過輕Underweight"; else if (bmi < 24) status = "正常Normal (18.5<=BMI<24)"; else status = "過重Overweight";
猜數字遊戲 運用亂數產生整數隨機數值 猜數字:讓使用者輸入數值 判斷答對與否
Nested if 輸入數值 No 輸入值等於亂數 yes No 輸入值大於亂數 印“猜對” yes 印“太大” 印“太小”
猜數字遊戲(1):運用亂數設計猜數字遊戲程式 多重分支 Multi-way if
亂數 運用亂數類別SecureRandom ,產生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、多重分 支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
Not year被400整除 yes Not year被100整除 印“閏年” yes Not year被4整除 印“平年” yes 印“平年” 印“閏年”
Not year被400整除 yes Not Year不被100整除 印“閏年” yes Not year被4整除 印“平年” 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)!";
習作:輸入收縮壓及舒張壓判斷血壓類型(依血壓定 義) 說明: 簡化題目(輸入收縮壓,判斷血壓類型) 輸入收縮壓(mmHg): 145 輸入舒張壓(mmHg): 95 診斷結果:第一期高血壓 輸入收縮壓(mmHg): 161 診斷結果:第二期高血壓 分類 收縮壓(mmHg) 舒張壓(mmHg) 正常 <120 和 <80 高血壓前期 120-139 或 80-89 第一期高血壓 140-159 90-99 第二期高血壓 160-179 100-109 第三期高血壓 >=180 >=110