Language Basics Lecturer: 曾學文
Outline 變數 Variables 運算子 Operators 運算式(Expressions)、敘述(Statements)與程式區塊(Blocks) Your Turn 程式流程 Control Flow Statements Decision making statement if-else statements switch statements
變數 Variables 定義 變數宣告(Declaration) 範例: int x = 6; double y; 儲存資料的單位 每個變數都有各自的名稱(name)與資料型態(data type) 變數宣告(Declaration) 意義:告知電腦我的程式要使用變數,請配置記憶體以供存放。 變數必須在第一次使用前宣告! 語法:DataType VarName [= InitialValue]; 範例: int x = 6; double y;
變數 Variables 基本資料型態(Primitive Data Types) byte short int long float 型態名稱 大小 / 格式 範圍 說明 整數型態 負數: 二進位數型態首位為1時(11110111 → 先減1 → 11110110 → 取補數 → 00001001 → 9 → 真正的值 → -9) byte 8 bit / 二補數方式 -128 ~ 127 位元組整數 (Byte Integer) short 16 bit / 二補數方式 -32768 ~ 32767 短整數 (Short Integer) int 32 bit / 二補數方式 -2147483648 ~ 2147483647 整數 (Integer) long 64 bit / 二補數方式 -9223372036854775808 ~ 9223372036854775807 長整數 (Long Integer) 實數型態 (以近似表示任意某個實數;a = m * be) float 32 bit / IEEE 754 格式 七位小數 單精度浮點數 double 64 bit / IEEE 754 格式 十五位小數 雙精度浮點數 其它型態 char 16 bit / Unicode 格式 \u0000 ~ \uffff (0 ~ 65535) 字元 boolean true / false true, false 布林值
變數 Variables 變數宣告完畢後可以給定初值。 給初值的方法: int x; x = 7; int x = 7; int x = 7, y; y=x; x y 記憶體
變數 Variables 變數初始值(Initialization) 型態名稱 初值設定 整數型態 byte byte x = 3; short short x = 3; int int x = 3; long long x = 3L; 實數型態 float float x = 1.234F; float x = 1.234e-4F; double double x = 1.234; double x = 1.234D; double x = 1.234e-4; double x = 1.234e-4D; 其它型態 char char x = ‘a’; boolean boolean x = true;
變數 Variables 溢位(Overflow) Example: IntOverflow.java 一種當數值超過資料型態範圍的錯誤 int int_i = Integer.MAX_VALUE; System.out.println("int_i= " + int_i++);
變數 Variables 變數存取型態 基本型態(Primitive Type)- 直接存取 整數、浮點數、字元、或布林值 參考型態(Reference Type)- 間接存取 由物件所組成的型態
變數 Variables 基本型態與參考型態在記憶體中的不同 基本型態 參考型態 x 38 0x1234 s 0x5678 0x1234 int x = 38; 參考型態 String s; x 38 0x1234 s 0x5678 0x1234 0x5678 此變數資料 存放之位置
變數 Variables 變數參考型態(Reference Data Type) Class 內含各種屬性,方法,事件。也就是說,可以是任何基本型態的組合。 Interface 類似 Class,但是所有屬性,方法,事件都沒有實作的程式碼,只是一個空殼子。 Array 可以是一群相同型態的集合。如:整數陣列就是一群整數的集合。
變數 Variables 變數名稱 大小寫不同,可用 A-Z, a-z, 0-9, _ (底線), $,長度不限制 第一個字不可以是數字。 不能是關鍵字(keyword)或稱保留字 (null)、布林字(true、false)命名慣例 變數名稱以小寫開頭,類別名稱由大寫開頭 如果名稱由不同字組成,必須將字組相連,建議後面字的首字元大寫,例:myParameter 常數(constant)通常全部大寫,且使用底線(_)分開字組,例:CURRENT_USER_NUM
變數 Variables 關鍵字 Java 保留給本身所使用的文字,也有人稱為 “保留字” (Reserved Words) Keyword: abstract default if private this boolean do implements protected throw break double import public throws byteelse instanceof return transient case extends int short try catch final interface static void char finally long strictfp volatile class float native super while const for new switch continue goto package synchronized
變數 Variables 常數 語法:final DataType VarName = InitialValue; 若程式欲更改 final 變數的值將造成編譯時期錯誤(compile-time error) 範例: final double PI = 3.1416; PI = 2.345; // 會發生錯誤,因為 PI 是常數
變數 Variables 轉換變數型態 型態相容時 型態不相容時 相容時,Java 會自動加以轉換 int a; long b = a; (相容會自動轉換) 型態不相容時 兩種不相容的型態要轉換,必須使用強制轉換 語法: (target-type) value b = (byte) a; (縮小轉換)- 將會被縮減成byte範圍的餘數 char x = (char) 65;
變數 Variables 變數有效範圍(Scope) 變數有效範圍 = 宣告處 ~ 所屬下大括號為止 主類別 方法 例外處理 class HelloWorld { int x; public static void Count (int x) { … catch (int x) { } 主類別 方法 例外處理 成員變數 方法參數 區域變數 例外處理器參數
變數 Variables
變數 Variables Example: Area.java /* 程式目的: 計算圓的面積 */ public class Area { public static void main (String args []) { final double PI = 3.1416; //pi,近似值 double r, area; r = 10.8; //圓的半徑 area = PI * r * r; //計算面積 System.out.println(“Area of circle is: ” + area); } }
運算子(Operators) 運算子可對一個、兩個或三個運算元(operands)執行動作 依照所需的運算元數目,可分為 一元運算子(unary operator),例:a++、--a 二元運算子(binary operator),例:a = 2 三元運算子(ternary operator),例:(x>0) ? x-1 : (x+1) 依照運算子擺放位置,可分為 前置(prefix)運算子:運算子擺放在運算元之前,例:++i 後置(postfix)運算子:運算子擺放在運算元之後,例:i++ 中置(infix)運算子:運算子擺放在中間,例:a + b 運算子執行動作後將回傳值,其值之型態視運算元而定
運算子(Operators) 算術運算子(Arithmetic Operators) 單一運算子 用法 說明 + + X 正 X - – X 二元運算子 用法 說明 + X + Y X 加上 Y - X – Y X 減去 Y * X * Y X 乘以 Y / X / Y X 除以 Y % X % Y 取 X 除以 Y 的餘數
運算子(Operators) 算術運算子(Arithmetic Operators) 前置式:加 / 減後再取用變數 單一增減運算子 用法 說明 ++ (前置式) ++X X = X +1 -- (前置式) -- X X = X -1 (後置式) ++ X++ (後置式) -- X-- 前置式:加 / 減後再取用變數 後置式:取用變數後再加 / 減 X = 3; System.out.println(X++); System.out.println(X); X = 3; System.out.println(++X); System.out.println(X)
運算子(Operators) Example: PrefixPostfix.java x = 3; System.out.println("Before Prefix X = " + ++x); System.out.println("After Prefix X = " + x); System.out.println("Before Postfix X = " + x++); System.out.println("After Postfix X = " + x);
運算子(Operators) 指定運算子(Assignment Operators) 功能:將運算完的結果指定給另外一個變數保存起來 用法 相當於 = X = Y += X += Y X = X + Y -= X -= Y X = X – Y *= X *= Y X = X * Y /= X /= Y X = X / Y %= X %= Y X = X % Y
運算子(Operators) 位元運算子(Bit Operators) 功能:將數字拿來作一個 bit 一個 bit 的運算。 TruthTable.txt 位元運算子 用法 功能 & X & Y X 與 Y 以 bit 為單位,做 AND 運算 | X | Y X 與 Y 以 bit 為單位,做 OR 運算 ~ ~ X X 做補數運算 ^ X ^ Y X 與 Y 以 bit 為單位,做 XOR 運算 >> X >> Y 將 X 向右移動 Y 個位元 << X << Y 將 X 向左移動 Y 個位元 >>> X >>> Y 將 X 向右移動 Y 個位元,不含正負號
運算子(Operators) 位元運算子加上指定運算子 指定運算子 用法 相當於 &= X &= Y X = X & Y |= X |= Y ^= X ^= Y X = X ^ Y >>= X >>= Y X = X >> Y <<= X <<= Y X = X << Y >>>= X >>>= Y X = X >>> Y
運算子(Operators) 關係運算子 Relational Operators 功能:比較兩個變數的大小。比較的結果是一個布林值 (true / false) 關係運算子 用法 傳回 true 的條件 < X < Y X 小於 Y <= X <= Y X 小於等於 Y == X == Y X 等於 Y != X !=Y X 不等於 Y >= X >= Y X 大於等於 Y > X > Y X 大於 Y
運算子(Operators) 條件運算子(Conditional Operators) 功能:將兩個條件合併起來的運算子,運算結果仍為布林值。 條件運算子 用法 傳回 true 的條件 && X && Y X 與 Y 必須同時為 true X, Y不一定進行求值 || X || Y X 與 Y 之一為 true 即可 ! ! X X 為 false
檢查 X 是否為 Y 的個體 (Instance) 運算子(Operators) 其他運算子 其它運算子 用法 功能 ? : X ? Y : Z 如果 X 為 true,傳回 Y 如果 X 為 false ,傳回 Z [] a[0] 用來存取陣列元素 . Object.Property 用來存取物件內的屬性或方法 (參數, 參數, …) f(X, Y, Z) 用來接收一系列的參數 (型態) (int) 3.5F 將某數值強制轉型 new new Object 建立物件或陣列 instanceof X instanceof Y 檢查 X 是否為 Y 的個體 (Instance)
運算子(Operators) ? : 語法:op1 ? op2 : op3 唯一的三元運算子 簡略的 if-else 敘述 例:(x>0) ? (x-1) : (x+1) 即 if (x > 0) return x-1; else return x+1;
運算子(Operators) 運算子優先權 高 運算子分類 運算子 分隔運算子 () [] {} , . 單一運算元 () [] {} , . 單一運算元 ++ -- + (正號) - (負號) ~ ! 建造 / 轉型運算子 new (type)expr 乘除 * / % 加減 + - 位移運算子 << >> >>> 關係運算子 < <= => > instanceof 相等運算子 == != 高
運算子(Operators) 運算子優先權 低 位元 AND & 位元 XOR ^ 位元 OR | 邏輯 AND && 邏輯 OR || 條件運算子 ? : 指定運算子 = += -= *= /= %= &= ^= |= >>= <<= >>>= 低
Expressions、Statements & Blocks 範例 int x = 3 * 4 – 1; double y = -100 / x; ambiguous vs. unambiguous 擅用括號避免曖昧不明(ambiguous)的運算式 例如: x + y / 100 (x + y) / 100 x + (y / 100) 運算子 3 * 4 運算元
Expressions、Statements & Blocks 類似人們說話的語言( natural language ) 敘述由多個運算式構成一個完整的執行動作,並以分號(;)作結尾 下列運算式可構成敘述 Assignment Expressions,例:a = 2; Any Use of ++ or --,例:a++; Method Calls,例:System.out.println(“Hi!”); Object Creation Expressions,例:Integer intObject = new Integer(4);
Expressions、Statements & Blocks 除了由運算式構成,另有兩種敘述 Declaration Statement,例:int x = 2; Control Flow Statement 程式區塊 Blocks 由大括號包覆,且內含零個以上的敘述 例: if (a > 2) { … }
Your Turn Practice 請撰寫一程式,輸入姓名、身高、體重,您的程式會計算出身材比例係數。 身材比例係數公式為:(體重Kg)/(身高m)2。 鍵入“java SlimBody Tsai 172 68” 印出 “Tsai 的身材比例係數為 22.9853…”
Your Turn Hint: SlimBody.java 參數讀取範例 String name = args[0]; double height = Double.parseDouble(args[1]); public class SlimBody { public static void main ( String[] args ) { … }
程式流程 循序結構 程式敘述
程式流程 選擇結構 如:if-else, switch 程式敘述 條件
程式流程 重複結構 前測式,如:for, while 程式敘述 條件 false true
程式流程 重複結構 後測式,如:do-while 程式敘述 條件 false true
程式流程 呼叫方法時 … Rubby.start(); Lisa.start(); public void run(){ … } 控制權會轉換 … Rubby.start(); Lisa.start(); public void run(){ … } public void run(){ … }
Control Flow Statements Why do we need control flow statements? Control Flow Statements
Control Flow Statements – if-else if/else statements 語法: 使用 ? : 運算子代替簡單的 if-else 較複雜的情況,我們常使用巢狀 if-else 敘述 if (expression){ statements… } else if (expression){ … else{
Control Flow Statements – if-else 例如: 如果 (考試成績 < 60) 印出 “你不及格” 印出 “糟糕!” 否則 印出 “你及格了” 在 Java 中 if (Score < 60) { System.out.println (“你不及格”); System.out.println (“糟糕!”); } else { System.out.println (“你及格了”);
Control Flow Statements – if-else 結合關係運算子 功能:比較兩個變數的大小。比較的結果是一個布林值 (true / false) if (x <= y) … 關係運算子 用法 傳回 true 的條件 < X < Y X 小於 Y <= X <= Y X 小於等於 Y == X == Y X 等於 Y != X !=Y X 不等於 Y >= X >= Y X 大於等於 Y > X > Y X 大於 Y
Control Flow Statements – if-else 結合條件運算子 功能:將兩個條件合併起來的運算子,運算結果仍為布林值。 if((x<y) && (y < z)) … if((x<y) || (y < z)) … 條件運算子 用法 傳回 true 的條件 && X && Y X 與 Y 必須同時為 true X, Y不一定進行求值 || X || Y X 與 Y 之一為 true 即可 ! ! X X 為 false
Control Flow Statements – if-else 定義: if-else 之內還夾了別的 if-else 範例:以下的例子就需要用到巢狀 if-else if 90 分以上同學印出 “Grade A” else if 80 分以上同學印出 “Grade B” else if 70 分以上同學印出 “Grade C” else if 60 分以上同學印出 “Grade D” else 60 分以下同學印出 “Grade F”
Control Flow Statements – if-else Example: Grading.java public class Grading { public static void main (String[] args) { int Score = Integer.parseInt(args[0]); if (Score >= 60) System.out.println (“pass!"); else System.out.println (“fail!"); }
Control Flow Statements – if-else Example: Age.java public class Age { public static void main (String[] args) { int x = Integer.parseInt(args[0]); if(x>=20 && x<=29) System.out.println("二年級"); else if(x>=30 && x<=39) System.out.println("三年級"); else System.out.println("四年級"); }
Control Flow Statements – switch-case switch statement 適用場合:多重if-then-else敘述 case 文數字: case 後方只能接字元或整數 如:case 1: 或 case ‘a’: 不可填入一個範圍 break; break 指令可以阻止程式繼續往下執行,並跳出整個 switch-case 結構 switch(expression){ case value1: statements… break; case value2: … default: }
Control Flow Statements – switch-case Example: SwitchDemo.java switch (month) { case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: System.out.println("March"); break; … case 10: System.out.println("October"); break; case 11: System.out.println("November"); break; case 12: System.out.println("December"); break; default: System.out.println("Not a month!"); break; }
Control Flow Statements – switch-case Example: GetMonthDays.java public class GetMonthDays { public static void main (String[] args) { int Year = Integer.parseInt(args[0]); int Month = Integer.parseInt(args[1]); switch (Month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println("31 days"); break; 執行:java GetMonthDays 2004 10 結果:31 days
Control Flow Statements – switch-case case 11: System.out.println("30 days"); break; case 2: if ( ((Year%4 == 0) && (Year%100 != 0)) || (Year%400 ==0) ) System.out.println("29 days"); else System.out.println("28 days"); } // end of switch } // end of main method }
Your Turn Basic Practice 請製作一個程式,輸入身高與體重,並告知是否合乎身材比例,例如,170公分65公斤重, 輸入:java SlimBody2 170 65 輸出:下列四者之一 體重kg / (身高m)2 < 18.5 過輕 18.5<= 體重kg / (身高m)2 <24 標準體重 24 <= 體重kg / (身高m)2 < 27 過重 BMI 體重kg / (身高m)2 > 27 肥胖 (注意:身高在公式中的單位為公尺)
Your Turn Hint: SlimBody2.java public class SlimBody2 { public static void main(String[] args) { … // 肥胖 System.out.println("You are too fat!!"); // 過重 System.out.println("You are over weight."); // 標準體重 System.out.println("Good Shape! Keep going!"); // 過輕 System.out.println("Poor baby! Don't you eat something?"); }
Your Turn Advanced Practice 請寫出一個程式讀入三個整數,找出最大和最小的數。 例如,java Compare 25 23 67 輸出:最大67; 最小23 例如,java Compare 54 43 21 輸出:最大54; 最小21
Your Turn Hint: Compare.java 慢的版本 if(a>b && b>c) system.out.println(“Max= ”+a+” Min=”+c) else if(a>b && b<c) … 快的版本 int max, min; if(a>b){max = a, min = b;}