Docstoc

第03章.ppt_647 KB _

Document Sample
第03章.ppt_647 KB _ Powered By Docstoc
					第3章
 • 語法入門
  – 第一個Java程式
  – 文字模式下與程式互動
  – 資料、運算
  – 流程控制
             第一個Java程式
•   定義類別(Class)
•   定義區塊(Block)
•   定義main()方法(Method)
•   撰寫陳述(Statement)
    /*範例程式*/
    public class HelloJava {
      public static void main(String[ ] args) {
        System.out.println("嗨!我的第一個Java程式!");
      }
    }
          第一個Java程式
• 定義類別(Class)- 物件的邏輯描述定義
class是Java用來定義類別的關鍵字
一個程式中可撰寫數個類別,但只能有一個公開
  (public)類別
範例程式中公開類別的名稱HelloJava必須與編輯存
  檔後的主檔名相同(HelloJava.java);類別首字母
  建議大寫及表明類別的作用
 public class HelloJava {
   public static void main(String[ ] args) {
     System.out.println("嗨!我的第一個Java程式!");
   }
 }
          第一個Java程式
• 定義區塊(Block)
Java程式中使用大括號” {”與” }”來定義區塊,兩
  兩成對,目的在區別定義的作用範圍
                        程式開始
                                     Main()方法
                                     的開始
 public class HelloJava {
   public static void main(String[ ] args) {
     System.out.println("嗨!我的第一個Java程式!");
   }         Main()方法
 }                               真正第一行程式的敘述句
             的結束
                               (Statement)
       程式結束
           第一個Java程式
• 定義main()方法(Method)-可以讓程式設計
  師將程式模組化,i.e. 程式設計師可以使用方
  法來完成一件事務
main()是Java程式的進入點(Entry point),程式執行由
 此開始
main()方法一定是個public、static成員;void表示
 main()執行結束後不傳回任何值;String[ ] args可以
 在執行程式時取得使用者指定的命令列引數
  public class HelloJava {
    public static void main(String[ ] args) {
      System.out.println("嗨!我的第一個Java程式!");
    }
  }
           第一個Java程式
• 撰寫陳述(Statement)- 一行指令
每一行指令結束都要用分號;
範例中使用了System類別的公開(public)成員out物件
 (out是一個PrintStream物件),使用了PrintStream
 所提供的println()方法,將指定的字串(String)輸出
 至文字模式上,且自動換行(試試printf()的差異)
  public class HelloJava {
    public static void main(String[ ] args) {
      System.out.println("嗨!我的第一個Java程式!");
    }
  }
  給C使用者的第一個Java 程式
                           J2SE 5.0版以後才有此功能

• 給了C使用者類似 printf() 的功能,它可以將字
  串與數字混合一起printf,並調整顯示的格式
  public class HelloJavaForC {                 換行
    public static void main(String[] args) {
      System.out.printf("%s! 這是您的第一個Java程式!\n",
                  "C語言Fan");
    }                         對應於第一個字串”C語言Fan”
  }   輸出結果: C語言Fan! 這是您的第一個Java程式!
    System.out.printf("%s! 這是您的第二個Java程式!",
                  "C語言Fan").println();

    System.out.printf("%s! 這是您的第 %d 個Java程式!\n",
                  "C語言Fan", 3);
                                 對應至數字3
            為程式加入註解
• 原始碼檔案中被標註為註解的文字,編譯
  器不會去處理它
/* 作者:良葛格 * 功能:示範printf()方法 * 日期:2005/4/30 */
public class ThirdJavaForC {
    public static void main(String[] args) {
        // printf() 是J2SE 5.0的新功能,必須安裝JDK 5.0才能編譯
        System.out.printf("%s! 這是您的第 %d 個Java程式!\n",
                           "C語言Fan", 3);
    }
}
            為程式加入註解
• 不能用巢狀方式來撰寫多行註解
 /*   註解文字1……bla…bla
      /*
         註解文字2……bla…bla
      */
 */


• 多行註解可以包括單行註解
/*    註解文字1……bla…bla
        //註解文字2……bla…bla
*/
        在文字模式下與程式互動
• 使用物件Scanner的工具取得使用者輸入文字
  (1a)System.in物件所提供的read()方法,但一次只能讀入一個
   位元組(Byte)資料,並傳回值
  (1b)在 J2SE 5.0後,可以使用java.util.Scanner類別取得使用者
   的輸入(通常為一個文字字串或一組數字);其中,java.util是
   Java SE的標準套件,需配合使用import來告訴編譯器,你要
   使用java.util套件(package)下的Scanner類別
  (2)可以使用這個物件的工具next()功能,來取得使用者的輸入
   字串
  import java.util.Scanner; // ref P.3-9
  public class ScannerDemo {
     public static void main(String[] args) {
       System.out.print("請輸入您的名字:");
       Scanner st = new Scanner(System.in);
       System.out.printf("哈囉! %s!\n", st.next() );
     }
                        將字串格式化輸出              換行
  }
   如P.3-9 範例3.5 ScannerDemo.java程式
import java.util.Scanner;
public class ScannerDemo {
  public static void main(String[] args) {
     System.out.print("請輸入您的名字:");
     Scanner s1 = new Scanner(System.in);
     System.out.printf("哈囉! %s!\n", s1.next());
  }
}
/*關鍵字new表示要新增一個Scanner物件,這個物
  件需要另一個物件System.in以便取得使用者的輸
  入;亦即,System.in取得使用者輸入後,交給
  Scanner 作一些處理。
  可以使用Scanner物件的工具next()功能,來取得
  使用者的輸入字串*/
• 使用物件Scanner的工具取得使用者輸入數字
 (1)可以使用工具nextInt()功能,會試著將取得的字串
    轉換為int型態的整數
import java.util.Scanner;
public class ScannerDemo2 {
  public static void main(String[] args) {
     Scanner scanner = new Scanner(System.in);
     System.out.print("請輸入一個數字: ");
     System.out.printf("您輸入了 %d !\n", scanner.nextInt());
  }
}
/*同理,還可以使用Scanner的nextFloat()、nextBoolean()等方
  法來取得使用者的輸入,並轉換為正確的資料型態*/
• 使用物件Scanner的工具取得使用者輸入數字
 前頁程式亦可以改寫如下
import java.util.Scanner;
public class ScannerDemo3 {
  public static void main(String[] args) {
     System.out.print("請輸入一個數字: ");
     Scanner s1 = new Scanner(System.in);
     int number = s1.nextInt();
     System.out.printf("您輸入了 %d !\n", number);
  }
                             以10進位整數方式輸出
} /*前頁程式(部分)
  Scanner scanner = new Scanner(System.in);
  System.out.print("請輸入一個數字: ");
  System.out.printf("您輸入了 %d !\n", scanner.nextInt());*/
  使用 BufferedReader 取得輸入
• BufferedReader建構時接受java.io.Reader物件
 – 可使用java.io.InputStreamReader來讀取標準輸入
   串流
 BufferedReader bR =
新增一個物件
             new BufferedReader(
                new InputStreamReader(System.in));
 System.out.print("請輸入一列文字,可包括空白: ");
 String text = bR.readLine(); //輸入字串
 System.out.println("您輸入的文字: " + text);
 /* 使用者宣告一個型態為BufferedReader的參考名稱(視為一個
 工具),這個工具還要加上一個InputStreamReader工具(實
 際的核心為System.in工具),此三個工具組合在一起,就可
 以讓使用者進行一段文字輸入的讀取 */
import java.io.*;   /*P3-12 範例3.7 BufferedReaderDemo.java程式*/
public class BufferedReaderDemo {
  public static void main(String[] args) throws IOException {
     BufferedReader bR =
                 new BufferedReader(
                   new InputStreamReader(System.in));
      System.out.print("請輸入一列文字,可包括空白: ");
      String text = bR.readLine();
      System.out.println("您輸入的文字: " + text);
  }
} /*此範例程式涉及到Java的輸入輸出(第14章)及例
   外(exception)處理(第10章)容後介紹。
readLine()方法會傳回使用者在按下enter鍵之前的所
  有輸入字元,但不包含最後按下的enter返回字元。
標準輸入輸出串流System.out參閱下頁說明*/
• 使用BufferedReader函數指令只能讀入字串,
  如果要輸入數字須再做字串與數字的轉換,如:
age = Integer.parseInt(line); //字串轉整數
balance = Double.parseDouble(line); //字串轉小數
• 所以,BufferedReader函數在使用上不很方便,
  一般多用在檔案資料的讀取。
• 另外可以使用JDK6的新功能,使用
  System.console()方法來取得一個java.io.Console
  物件,非常方便的來取得使用者的輸入與輸出
例如:你希望在文字模式主控台下的輸入有密碼隱藏
遮罩功能,則可以使用System類別上新增的console()
方法來傳回一個java.io.Console物件。
 使用Console物件的readLine()下方法可以直接取得文
 字模式的使用者文字輸入。
 使用readPassword()下方法,使用者輸入的文字將不
 會顯示在畫面中。
/*使用者在進入應用系統時,常會被要求輸入使用者ID
  及密碼*/
import java.io.Console;
public class Console1 {
 public static void main(String[ ] args) {
    Console cs1 = System.console();
        System.out.print(“User Name: ");
        String name = cs1.readLine();    /*顯示並取得使用者ID */
        char[ ] password = console.readPassword(“Password: ”); /*顯示
        並取得password */
        console.printf(“Welcome! ”+ name + “\n”);
        System.out.println(“Your Password is “ + new String(password));
    }
}
             User Name:(input userID)
             Password:(input password)
             Welcome!(show userID)
             Your Password is (show password)
/*PLS Ref P.21-6 範例21.5 PasswordDemo程式,密碼不會顯示*/
public class PasswordDemo {
  public static void main(String[] args) {
    while(true) {
       System.out.print("輸入ID名稱:");
       String name = System.console().readLine(); /*顯示並取得使用者ID*/
            System.out.print("輸入密碼: ");
            char[] passwd = System.console().readPassword(); //輸入密碼
            String password = new String(passwd);         /*顯示並取得使用者密碼*/
            if ("caterpillar".equals(name) &&
               "123456".equals(password)) {
                System.out.println(“歡迎 caterpillar ”);     /*使用者ID與密碼正確*/
                break;
            }
            else {                                     /*使用者ID與密碼錯誤*/
                System.out.printf("%s,名稱或密碼錯誤,請重新輸入!%n", name);
            }
        }
    }          輸入ID名稱:caterpillar        換行字元
}              輸入密碼:
               歡迎 caterpillar 或 名稱或密碼錯誤,請重新輸入!
       標準輸入輸出串流
• System類別中的靜態物件out
 – 提供標準輸出串流(Stream)輸出 ,通常對應
   至文字模式或終端機輸出
 – 使用” >”可以將輸出重新導向至一個檔案,
   如
   java HelloJava > HelloJavaResult.txt
   /*HelloJava程式執行結果不會顯示在文字模式
   上,在工作目錄下新增HelloJavaResult.txt檔
   案,並將結果輸出至該檔案*/
• System標準輸入串流in
 – 在程式開始之後它會自動開啟,對應至鍵盤或
   其它的輸入來源 (可使用前述read() 、Scanner
   物件或BufferedReader來讀取輸入)
       標準輸入輸出串流
• 標準錯誤輸出串流err
 – 在程式執行後自動開啟,將指定的字串輸出至顯
   示裝置或其它指定的裝置
 – err輸出串流的訊息不會被重新導向,將會立即
   在文字模式下顯示錯誤訊息
  System.out.println("使用out輸出訊息");
  System.err.println("使用err輸出訊息");
   java ErrDemo > ErrDemoResult.txt
   使用err輸出訊息
 除了”>”可將輸出重新導向外,也可以使用”>>”
  (另具有附加(Append)功能),也就是將輸出內容
  附加在導向目的檔案的內容之後。試一試
               輸出格式控制
  常用的控制字元                    作          用
  \\               反斜線
  \'               單引號'
  \"               雙引號"
  \uxxxx           以16進位數指定Unicode字元輸出
  \xxx             以8進位數指定Unicode字元輸出
  \b               倒退一個字元
  \f               換頁
  \n               換行
  \r               游標移至行首
  \t               跳格(一個Tab鍵)

System.out.println("\u0048\u0065\u006C\u006C\u006F");
/*以Unicode字元內碼來輸出“Hello”文字,如範例3.9*/
 • 在輸出數值時,預設都會以十進位的方式來
   顯示數值;如P.3-16 範例3.10如何使用十進
   位轉不同數值進位 to.XXX(number)的方法
//十進位19轉成二進位10011
System.out.println(Integer.toBinaryString(19));
//十進位19轉成八進位13
System.out.println(Integer.toOctalString(19));
//十進位19轉成十六進位23
System.out.println(Integer.toHexString(19));
常用的格式轉換字元                        作     用
%%              在字串中顯示%
                以10進位整數方式輸出,提供的數必須是Byte、Short、
%d
                Integer、Long、或BigInteger
                將浮點數以10進位方式輸出,提供的數必須是Float、Double
%f
                或 BigDecimal
                將浮點數以10進位方式輸出,並使用科學記號,提供的數必須
%e, %E
                是Float、 Double或BigDecimal
                使用科學記號輸出浮點數,以16進位輸出整數部份,以10進位
%a, %A
                輸出指數部份,提供的數必須是Float、Double、BigDecimal
                以8進位整數方式輸出,提供的數必須是Byte、Short、
 %o (不可以使用英文大
                Integer、Long、或BigInteger
O)
                將浮點數以16進位方式輸出,提供的數必須是Byte、Short、
%x, %X
                Integer、Long、或BigInteger
%s, %S          將字串格式化輸出
                以字元方式輸出,提供的數必須是Byte、Short、Character或
%c, %C
                Integer
                將"true"或"false"輸出(或"TRUE"、"FALSE",使用 %B)。另
%b, %B
                外,非null值輸出是"true",null值輸出是"false"
%t, %T          輸出日期/時間,詳請看線上API文件
%n              換行字元
           輸出格式控制
• 若是使用J2SE 5.0或更高的版本,可使用
  System.out.printf()作為簡單的輸出格式設定
  // 輸出 19 的十進位表示
  System.out.printf("%d%n", 19);
  // 輸出 19 的八進位表示
  System.out.printf("%o%n", 19);
  // 輸出 19 的十六進位表示
  System.out.printf("%x%n", 19);
              輸出格式控制
• 可以在輸出浮點數時指定精度
  – System.out.printf("example:%.2f %n", 19.234);
  – 輸出example:19.23 /*小數點後僅留2個字元寬度*/
• 可以指定輸出時,至少要預留的字元寬度
  – System.out.printf("example:%6.2f %n", 19.234);
  – 輸出example: 19.23          /*預留6個字元寬度*/

          補上一個空白在前端
• System.out.printf(“Hello! My name is %s, I am
  %d years old.”, “Danny”, 20);
  – 輸出Hello! My name is Danny, I am 20 years old.
              輸出格式控制
• System.out.printf(“Hello! My name is %s, I am %d
  years old.”, “Danny”, 20);
   – 輸出Hello! My name is Danny, I am 20 years old.
• 列表時使用格式化後的位數是很好的方法
  System.out.printf(“Name:%14s %n”, “Danny”);
  System.out.printf(“Name:%14s %n”, “Christopher”);

           Name:            Danny
           Name:     Christopher
把浮點數四捨五入為整數
Java語言規定浮點數轉整數時,小數點部分無條件捨去。如果
    要達到浮點數四捨五入為整數的效果,可以使用下面的小技
    巧。但是Math類中的round方法不能設置保留幾位小數。
public class Example {
    public static void main(String[ ] args) {
       double x = 20.6;
       System.out.println(x + " 四捨五入成為 " + (int)(x+0.5));
    或 System.out.println(x + " 四捨五入成為 " + round(x));
    }
    static int round(double y) { //傳值呼叫 Call by Value
    return (int)(y + 0.5);
    }
 } /*另外要注意:VB 與 Java 程式在兩者作 rounding 時的位數
    不同(VB 是 rounding 成小數後兩位的精確度,Java 則是整
    數)。 */
  基本的資料型態(Primitive type)
• 整數
  – 短整數(short)(佔2個位元組) -32768 ~ 32767
  – 整數(int)(佔4個位元組) -2147483648 ~ 2147483647
  – 長整數(long)(佔8個位元組)
• 位元組(byte)
  – 專門儲存位元資料
  – 佔1個位元組 -128~127
• 浮點數
  – 浮點數(float)(佔4個位元組)按IEEE754格式
  – 倍精度浮點數(double)(佔8個位元組)按IEEE754格式
基本的資料型態(Primitive type)
• 字元(char)
  – 採Unicode編碼,以整數來看範圍在0~65535
  – 前128個字元編碼與ASCII編碼相容
  – 每個中英文字佔2個位元組,使用單引號 ' '
  – 可儲存的字元範圍由'\u0000'到'\uFFFF'
• 字串(String)
  – 使用雙引號 ” ”來表示字串內容
• 布林數(boolean)
  – 佔記憶體2個位元組
  – 可儲存true與false兩個數值
   基本的資料型態(Primitive type)數值範圍
範例3.12 DataRange.java
System.out.printf("short \t數值範圍:%d ~ %d\n",
                   Short.MAX_VALUE, Short.MIN_VALUE);
System.out.printf("int \t數值範圍:%d ~ %d\n",
                   Integer.MAX_VALUE, Integer.MIN_VALUE);
System.out.printf("long \t數值範圍:%d ~ %d\n",
                   Long.MAX_VALUE, Long.MIN_VALUE);
stem.out.printf("byte \t數值範圍:%d ~ %d\n",
                   Byte.MAX_VALUE, Byte.MIN_VALUE);
System.out.printf("float \t數值範圍:%e ~ %e\n",
                   Float.MAX_VALUE, Float.MIN_VALUE);
System.out.printf("double \t數值範圍:%e ~ %e\n",
                   Double.MAX_VALUE, Double.MIN_VALUE);
          變數、常數
• 在Java中要使用變數,必須先宣告變數名
  稱與指定資料型態
 int age;      // 宣告一個整數變數
 double scope; // 宣告一個倍精度浮點數變數
 int age, height;      /*正確*/
 int age, int height; /*錯誤*/
 int age; double height; /*正確*/
 int age, double height; /*錯誤*/
                變數、常數
• 使用int、float、double、char等關鍵字來宣告
  變數名稱並指定其資料型態
 – 不可以使用數字作為開頭
 – 不可以使用一些特殊字元,像是*&^%之類
 – 不可以與Java 內定的關鍵字同名,如 for、this…
• 鼓勵用清楚的名稱來表明變數的作用,通常首
  字母小寫,其後所連結使用的單字第一個字母
  大寫
  int ageOfStudent;
  int ageOfTeacher;
               變數、常數
• 通常採用底線作為開始的變數名稱,表示
  為私用(Private)性質,其值僅在程式的某一
  範圍內宣告有效
 double _window_center_x;
 double _window_center_y;


• 不可以宣告變數後,而在未指定任何值給
  它之前就使用它;編譯器在編譯時會回報
  這個錯誤
   variable var might not have been initialized
                變數、常數
• 使用「指定運算子」‘=’來指定變數的值
  (assign或初始值)
範例3.13 VariableDemo.java
int ageOfStudent = 5;
double scoreOfStudent = 80.0;
char levelOfStudent = ‘B’; //字元須使用引號‘ ’來包括

System.out.println("年級\t 得分\t 等級");
   System.out.printf("%4d\t %4.1f\t %4c",
      ageOfStudent, scoreOfStudent, levelOfStudent);
              變數、常數
• 宣告變數名稱的同時,加上“final”關鍵字
  來限定;這個變數一但指定了值,就不可
  以再改變它的值,如圓周率PI常數的指定
 final int maxNum = 10;
 maxNum = 20;
cannot assign a value to final variable maxNum
                變數的有效範圍
變數的有效範圍,係根據「它被定義的所在位置」而決定
import java.lang.*;     // java.lang 套件不需 import
public class VarRegion{
  static float Var = 99.99F; //定義成員變數
  public static void main(String[] args){
    System.out.println(“Var = ” + Var); /*成員變數有效範圍在此類別內,故
                                          可使用Var成員變數 */
    /* System.out.println(“i = ” + i); 錯誤,尚未定義出 i 變數 */
    int i = 1000; /*定義區域變數,從此之後到main()的結尾’}’之前,是
                    變數 i 的有效範圍 */
    System.out.println(“i = ” + i);
  }
}
                 算術運算
• 加(+)、減(-)、乘(*)、除(/)、餘除
  運算子(%)
 – System.out.println(1 + 2 * 3); /*先乘除後加減,
   由左而右,括號內的先執行*/
 – System.out.println(1+2+3 / 4);
 – System.out.println((double)(1+2+3) / 4); /*使用了
   double限定型態轉換,以確保輸出值為1.5,否
   則將變成1*/
              算術運算
• 這段程式會印出什麼結果?
 int testNumber = 10;                  3
 System.out.println(testNumber / 3);


• 使用下面的方法
int testNumber = 10;
System.out.println(testNumber / 3.0);
System.out.println((double) testNumber / 3);

                                  3.33333
指出下列程式碼計算錯誤之處
int total;
double average;
total = 12 + 25 + 36 + 16;
average = total / 4;
System.out.println(average);




  第4行改成average = total / 4.0;
  其輸出將變成22.25
                算術運算
• 將精確度大的值指定給精確度小的變數時,
  由於在精確度上會有遺失,編譯器會認定
  這是一個錯誤
int testInteger = 0;
double testDouble = 3.14;
testInteger = testDouble;
System.out.println(testInteger);

  possible loss of precision found : double
  required: int testInteger = testDouble
                 ^
   1 error
            算術運算
• 必須明確加上轉換的限定字,編譯器才不
  會回報錯誤
 testInteger = (int) testDouble;
• ‘%’運算子是餘除運算子 – i.e.取餘數
 count = (count + 1) % 360;   /*某物體要
 進行360度旋轉,每次在角度上加1,同時360度後需復
 歸為0再重新計算*/
• 編譯執行下面這個程式?
  public class Test{
    public static void main(String args[ ]) {
       System.out.println(0.05+0.01);
       System.out.println(1.0-0.42);
       System.out.println(4.015*100);
       System.out.println(123.3/100);
    }          0.060000000000000005
  }            0.5800000000000001
               401.49999999999994
               1.2329999999999999

Java中的簡單浮點數類型float和double不能夠進行
  運算。
            比較、條件運算
• 大於(>)、不小於(>=)、小於(<)、
  不大於(<=)、等於(==)、不等於
  (!=),成立時true、不成立為false
範例3.14 ComparisonOperator.java
System.out.println("10 >   5 結果 " + (10 > 5));
System.out.println("10 >= 5 結果 " + (10 >= 5));
System.out.println("10 <   5 結果 " + (10 < 5));
System.out.println("10 <= 5 結果 " + (10 <= 5));
System.out.println("10 == 5 結果 " + (10 == 5));
System.out.println("10 != 5 結果 " + (10 != 5));
            比較、條件運算
• 條件運算子
    條件式 ? 成立傳回值 : 失敗傳回值
範例3.15 ConditionalOperator.java
import java.util.Scanner;
public class ConditionalOperator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入學生分數: ");
        int scoreOfStudent = scanner.nextInt();
        System.out.println("該生是否及格? " +
            (scoreOfStudent >= 60 ? '是' : '否’));
    }
}
             比較、條件運算
• 條件運算子
    條件式 ? 成立傳回值 : 失敗傳回值
範例3.16 OddDecider.java
import java.util.Scanner;
public class OddDecider {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入數字: ");
        int number = scanner.nextInt();
        System.out.println("是否為奇數? " +
              (number%2 != 0 ? '是' : '否'));
    }
}
             邏輯、位元運算
• 「且」(&&)、「或」(||)、「反相」(!)
 int number = 75;
 System.out.println((number > 70 && number < 80));
 System.out.println((number > 80 || number < 75));
 System.out.println(!(number > 80 || number < 75));
• &(AND)、|(OR)、^(XOR)與~(補數)

 System.out.println("0   AND   0\t\t"   +   (0   &   0));
 System.out.println("0   AND   1\t\t"   +   (0   &   1));
 System.out.println("1   AND   0\t\t"   +   (1   &   0));
 System.out.println("1   AND   1\t\t"   +   (1   &   1));

 byte number = 0;
 System.out.println((int)(~number));
P3-32 範例3.19 OddDecider2.java
import java.util.Scanner;

public class OddDecider2 {
  public static void main(String[] args) {
     Scanner scanner = new Scanner(System.in);

        System.out.print("請輸入數字: ");
        int number = scanner.nextInt();
        System.out.println("是否為奇數? " +
              ((number&1) != 0 ? '是' : '否'));
    }
}
P3-33 範例3.20 XorCode.java
public class XorCode {
  public static void main(String[] args) {
     char ch = 'A';
     System.out.println("編碼前:" + ch);

        ch = (char)(ch^7);
        System.out.println("編碼後:" + ch);

        ch = (char)(ch^7);
        System.out.println("解碼:" + ch);
    }
}
          邏輯、位元運算
                          (右移後在左邊補0)
• 左移(<<)、右移(>>)、>>>運算子
int number = 1;
System.out.println( "2的0次: " + number);
number = number << 1;
System.out.println("2的1次: " + number);
number = number << 1;
System.out.println("2的2次: " + number);
number = number << 1;
System.out.println("2的3次:" + number);
  00000001  1       2的0次:   1
  00000010  2       2的1次:   2
  00000100  4       2的2次:   4
  00001000  8       2的3次:   8
            遞增、遞減運算
• 遞增、遞減運算子
int i = 0;                   1
System.out.println(++i);
System.out.println(--i);     0

• 將遞增或遞減運算子撰寫在變數之前或變
  數之後
int i = 0;
int number = 0;
number = ++i;   // 相當於i = i + 1; number = i;    1
System.out.println(number);                     0
number = --i;    // 相當於i = i - 1; number = i;
System.out.println(number);
      遞增、遞減運算
• ++i //前置遞增運算元,要先作完本身的遞增
  運算才去做其他的運算,
 i++ //後置遞增運算元,要先做其他的運算再
 作本身的遞增運算
           遞增、遞減運算
 指定運算子        範       例      結     果
+=          a += b        a=a+b
-=          a -= b        a=a-b
*=          a *= b        a=a*b
/=          a /= b        a=a/b
%=   取餘數    a %= b        a=a%b
&=   AND    a &= b        a=a&b
|=   OR     a |= b        a=a|b
^= XOR      a ^= b        a=a^b
<<= 位元左移    a <<= b       a = a << b
>>= 位元右移    a >>= b       a = a >> b
流程控制指令(Control Flow Statements)
 JAVA程式提供了四類多種的流程控制指令
     指 令 類 型                  使用的保留字
決策 decision making      if-else,switch-case
迴圈 looping              while,do-while,for
例外處理 exception handling try、catch、finally、
                        throw、throws
分岔 branching            break,continue,
                        label,return
流程控制指令(Control Flow Statements)
決策控制指令讓程式根據運算式的結果或變數的狀
 態來選擇不同的執行路徑。( if-else,switch-case)
迴圈控制指令讓程式重複執行一個或一個以上的指
 令。(while,do-while,for)
分岔控制指令讓程式以一種非線性的形式執行。
 (break,continue,label,return) //或稱跳躍指令
例外處理控制指令(機制)讓我們能很容易的掌控程式
 執行時的例外狀況,得以自行發出必要訊息並完
 成應處理的後續動作。(try、catch、finally、throw、
 throws容後解釋)
          決策控制指令
  if 條件式 (可接受各種資料型態判斷)
• 語法   if(條件式) {                  yes
           陳述句1(s)   condition          statement1
       }               no
       陳述句2
                     statement2



       if(條件式) {                  yes
           陳述句1(s)   condition          statement1

        }              no
        else {
                     statement2
           陳述句2(s)
        }
       陳述句3          statement3
   巢狀if (nested if)條件式
                                             yes
             yes
condition1         statement1   condition2         statement2

  no                              no

statement5                      statement3


             yes
condition3         statement6   statement4

  no

statement7
                  if 條件式
P3-40範例3.25 OddDecider3.java
import java.util.Scanner;
public class OddDecider3 {
  public static void main(String[] args) {
    System.out.print("請輸入數字: ");
    Scanner scanner = new Scanner(System.in);
    int input = scanner.nextInt();
    int remain = input % 2; // 求除 2 的餘數
    if(remain == 1)          // 如果餘數為1
        System.out.println(input + "為奇數");
    else
        System.out.println(input + "為偶數");
  }
}
         nested if 條件式
System.out.print("輸入分數:");

Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
if(score >= 90)
   System.out.println("得A");
else if(score >= 80 && score < 90)
   System.out.println("得B");
else if(score >= 70 && score < 80)
   System.out.println("得C");
else if(score >= 60 && score < 70)
   System.out.println("得D");
else
   System.out.println("得E(不及格)");
  Java程式語言提供了if-else指令的捷徑運算元?:,如
  If (Character.isUpperCase(aChar)) {
  System.out.println(“The Character” + aChar + “is uppercase.”);
  } else {
  System.out.println(“The Character” + aChar + “is lowercase.”);
  }

上列程式段以if-else指令捷徑運算元重寫
System.out.println(“The Character ” + aChar + “ is ” +
(Character.isUpperCase(aChar) ? “upper” :”lower” +
  “case.”);

另外如下例,判斷顯示性別
System.out.println(gender == ‘M’ ? “male” :”female”);
                       條件式 ? 成立傳回值 : 失敗傳回值
  決策控制指令 switch 條件式
• switch指令式多重分支指令, 根據選項變數的數
  值, 執行switch。
• 如果單純比對字元或數值,建議使用switch內某
  段的指令,不要用 if。因 switch 只取出變數一次,
  而 if 每次均要比對,較浪費時間。
• switch的選項變數只能比較數值或字元。
            switch 條件式
                             選項變數
• switch語法架構如下
switch(變數名稱或運算式) {// 為 byte、short、int 或 char
  case 符合數字或字元: //字元須加單引號,如’A’
      陳述句一;       // 選項值的資料型態必須與選項變數相同
      break;  選項值1
  case 符合數字或字元:
      陳述句二;
                     冒號
      break;
  default://以上條件不符合時執行default,可省略但不建議
      陳述三;
}   /*在case後設定的比對不一定是常數,也可以是變
      數,不過該變數必須宣告為 final*/
Scanner scanner = new Scanner(System.in);
System.out.print(“請輸入分數: ”); //範例3.27
int score = scanner.nextInt();
int level = (int) score/10;   /*取得除法運算後的商*/
switch(level) {
    case 10: case 9: /* 自動向下執行也就是執行90分以上
                     (含100分)得’A’ */
        System.out.println(“得A”);
        break;       // 跳離開switch
    case 8:
        System.out.println("得B");
        break;
    case 7:
        System.out.println("得C");
        break;
    case 6:
        System.out.println("得D");
        break;
    default:               /*60分以下得E(不及格)*/
        System.out.println("得E(不及格)"); }
  迴圈控制指令 while 迴圈 (前測試迴圈)
• while迴圈的語法如下:
  while (條件式) {
       程式敘述; 當條件式為true時,程式區塊內的程式碼
       …;       就會重複執行

  }
• while語法流程圖如下
        while
                       false
            條件式
                true
           程式敘述           其它程式敘述
    迴圈控制指令 while 迴圈 (前測試迴圈)
P.3-49 範例3.31 計算輸入成績平均程式
Scanner scanner = new Scanner(System.in);
int score = 0;
int sum = 0;
int count = -1;
while(score != -1) { /*因輸入個數未知,最後以-1控制結束*/
    count++;         /*如分別輸入99 88 77 -1*/
    sum += score;
    System.out.print(“輸入分數(-1結束): ");
    score = scanner.nextInt();
}
System.out.println("平均:" + (double) sum/count);
• while通常可以用做無窮迴圏,例如遊戲設計中對
  使用者輸入裝置的輪詢(poll)、或是動畫程式的播
  放都會使用到無窮迴圈。
  while (true) {
      迴圈內容;
      …. }
• 無窮迴圈可以由自己迴圏中的某個條件式來結束
  while (true) {
      陳述句;
      if (條件式)
          break; //跳離迴圏
    …. }
  迴圈控制指令 while 迴圈 (後測試迴圈)
• do ~ while迴圈的語法如下:
  do {
       程式敘述; 會不斷執行區塊內的程式碼
       …;
  } while (條件式); 只要條件式為false,馬上結束迴圈的執行
• while語法流程圖如下 //迴圈內程式碼至少會被執行一次

       do 程式敘述              由於do~while會先
                            執行迴圈,通常被用
                     true   於進行一些初始化或
    while   條件式             介面溝通的動作
             false
         while 迴圈 (後測試迴圈)
P.3-51 範例3.32 判斷輸入之整數是否為奇數
Scanner scanner = new Scanner(System.in);
int input = 0;                輸入整數值:
int replay = 0;               輸入數為奇數?
do {                          繼續(1:繼續 0:結束)?
    System.out.print("輸入整數值:");
    input = scanner.nextInt();
    System.out.println("輸入數為奇數?" +
              ((input%2 == 1) ? 'Y': 'N'));
    System.out.print("繼續(1:繼續 0:結束)?");
    replay = scanner.nextInt();
} while(replay == 1);
迴圈控制指令 for 迴圈
• for迴圈和if敘述一樣,內容都可以撰寫多行程式敘
  述句。如果有兩行以上的程式敘述句,記得要加上
  大括號{ }將程式敘述句框住。
• for語法流程圖如下

      for
               true
         條件式          程式敘述句

      false
               for 迴圈
for指令寫法可改成while寫法,但while寫法就不一定能改成for
• 基本語法
  for(初始式; 判斷式; 遞增式) {
      陳述句一;
      陳述句二;
  } /*如果陳述句只有一個,也就是非複合陳述句,{}可以省略*/
public class SimpleLoopFor { //EX3.28
    public static void main(String[] args) {
        for(int i = 0; i < 10; i++)
            System.out.print(" " + i);
    }
}            0 1 2 3 4 5 6 7 8 9

請問如何將for迴圈改為顯示結果 9 8 7 6 5 4 3 2 1 0
                         for 迴圈
/* P3-47 範例3.29 九九乘法表 */
public class NineTable {
    public static void main(String[] args) {
        for(int j = 1; j < 10; j++) {
            for(int i = 2; i < 10; i++) {
                System.out.printf("%d*%d=%2d ",i,j, i * j);
            }
            System.out.println();
        }
    }   //迴圈中還有其他迴圈,稱為巢狀迴圈
}
                  for 迴圈
  • for括號中的每個陳述區塊是以分號 ';' 作區
    隔,而在一個陳述區塊中若想寫兩個以上
    的陳述句,則使用逗號 ',' 作區隔
for (int i = 2, j = 1;
   j < 10;
   i = (i==9)?((++j/j)+1):(i+1)) {
   System.out.printf("%d*%d=%2d%c", i, j, i * j,
                         (i==9 ? '\n' : ' '));
   }
/*一個for迴圈之九九乘法表,閱讀性不佳*/
分岔控制指令 break、continue
• break可以離開目前switch、for、while、do while的
  區塊 (某種條件下強迫終止迴圈執行)
• break語法流程圖如下


                 true
         迴圈條件式          程式敘述句

        false
                 break強迫跳離迴圈
         其它敘述句
分岔控制指令 break、continue
• continue只會結束其之後區塊的陳述句,並跳回迴
  圈區塊的開頭,繼續下一個迴圈
• continue語法流程圖如下

          continue強迫進入下一個迴圈

   迴圈條件式           程式敘述句1     程式敘述句2
            true
  false
             break強迫跳離迴圈
   其它敘述句
分岔控制指令 break、continue
for(int i = 1; i < 10; i++) {          i=1
     if(i == 5)                        i=2
         break;                        i=3
     System.out.println("i = " + i);   i=4
}
                                      i=1
for(int i = 1; i < 10; i++) {         i=2
     if(i == 5)                       i=3
         continue; //離開,重新進入迴圈        i=4
      System.out.println("i = " + i); i=6
}                                     i=7
//例如 1~20,將不是7的倍數印出                   i=8
                                      i=9
請計算1~100間所有奇數的總合為多少?
public class DoContinue {
  public static void main(String[] args) {
    int sum = 0;
    for (int i=1; i <= 100; i++) {
      if ((i % 2) == 0) //若i除以2的餘數為0,利用continue
         continue;     //敘述,跳過下一行累加的程式敘述。
      sum += i;
    }
    System.out.println(“1~100間所有奇數的總合為 ”+ sum);
  }
}

       1~100間所有奇數的總合為 2500
  分岔控制指令 label,return
• break可以配合標籤使用,如break原只會
  離開迴圈;設定標籤與區塊,則可以離開
  整個區塊
back : {
    for(int i = 0; i < 10; i++) {
        if(i == 9) {
            System.out.println("break");
            break back;
        }
    }                              break
    System.out.println("test");
} //執行結果為何?
    分岔控制指令 label,return
• Continue也可以配合標籤使用,標籤
  (back1、back2)只能設定在for之前
                             不會印出test back1
back1:                       印出9次test back2
  for(int i = 0; i < 10; i++){
    back2:
       for(int j = 0; j < 10; j++) {
           if(j == 9) {
              continue back1; //或改為back2
           }
       }
       System.out.println("test back1");//back2
  }
分別嘗試在迴圈內不同位置增加測試印出statement
System.out.println(“break“ + i);則輸出為
何?
back : {
    for(int i = 0; i < 10; i++) {
         System.out.println(“break“ + i);
        if(i == 9) {
   或         System.out.println("break");
             break back;
        }
        System.out.println(“break“ + i);
    }
    System.out.println("test");
}                             break0~break9
                             break0~break8
                             break
    分岔控制指令 label,return
• return指令只用在函數裡,可以結束函數的
  執行,返回原先呼叫此函數的下一行指令
Caller
     :         void funcx(){
      :              :
    funcx();       return;
               }
:
當程式的主函數return時,表示整個程式結束回到作業系統
    分岔控制指令 label,return
• return指令可傳回資料,但資料的型態必須
  與函數宣告的回應型態相同。
Caller
     int a;       void funcx() {
       :               int x;
       :                 :
    a= funcx();       return x;
                  {
:
當函數宣告的回應型態為void時,return指令不可傳回資料
       CH3作業與回顧(一)
問答:
1.Java中定義類別的關鍵字?
2.程式進入點main的回傳型態是?
3.JDK 5.0的printf()是哪一個物件提供的?
4.printf()輸出字串時的格式對應符號是?輸出整數時的格
  式對應符號是?
5.註解有哪兩種方式?
6.JDK 5.0中要使用Scanner類別,必須先import什麼?
7.要使用Scanner取得標準輸入,必須以什麼作為Scanner
  的建構引數?
8.要使用BufferedReader類別取得標準輸入,必須先
  import什麼?
9.要在命令模式下重新導向輸出至檔案,可以使用什麼符號?
10.out與err,哪一個的輸出不能被重新導向?
         CH3作業與回顧(二)
問答:
1. 以關鍵字寫出Java中的基本資料型態。
2. 如何取得基本資料型態儲存數值的範圍?
3. 宣告一個整數變數,並指定其值為10,在指定值之後不得改變其值。
4. 下面的程式編譯時會有何錯誤訊息?
   int testInteger = 0;
   double testDouble = 3.14;
   testInteger = testDouble;
5. 寫出AND邏輯運算子、AND條件運算子、OR條件運算子、OR邏輯運算子。
6. 如果i是整數變數,i++與++i有什麼不同?
7. 如果i是整數變數,i--與--i有什麼不同?
8. a+=b、a*=b實際上等於何種運算式?
9. 下面這個程式如果條件式一不成立,會執行哪一條陳述?
  if(條件式一)
     if(條件式二)
         陳述句一;
     else
         陳述句二;
10. for迴圈中的陳述句要以什麼標點符號作為分隔?
    Java四捨五入作法 補充
java裡小數後幾位四捨五入
(1)可用NumberFormat來做
(2)還有一種方示可直接表示做到幾位
  如給參數(0.00)則表示出來數字會到後兩位;
  如給(0,000)則表示時數字每三位加個逗號分
  開,如45,567,789
NumberFormat formatter = new
DecimalFormat("000000");
String s = formatter.format(-1234.567); // -001235

formatter = new DecimalFormat("##");
s = formatter.format(-1234.567); // -1235
s = formatter.format(0); // 0
formatter = new DecimalFormat("##00");
s = formatter.format(0); // 00
formatter = new DecimalFormat(".00");
s = formatter.format(-.567); // -.57
formatter = new DecimalFormat("0.00");
s = formatter.format(-.567); // -0.57
formatter = new DecimalFormat("#.#");
s = formatter.format(-1234.567); // -1234.6
formatter = new DecimalFormat("#.######");
s = formatter.format(-1234.567); // -1234.567
formatter = new DecimalFormat(".######");
s = formatter.format(-1234.567); // -1234.567
formatter = new DecimalFormat("#.000000");
s = formatter.format(-1234.567); // -1234.567000
  formatter = new DecimalFormat("#,###,###");
  s = formatter.format(-1234.567); // -1,235
  s = formatter.format(-1234567.890); // -1,234,568

  formatter = new DecimalFormat("#;(#)");
  s = formatter.format(-1234.567); // (1235)

  formatter = new DecimalFormat("'#'#");
  s = formatter.format(-1234.567); // -#1235
  formatter = new DecimalFormat("'abc'#");
  s = formatter.format(-1234.567); // -abc1235
以上補充資料參考自 http://bbs.wefong.com/archiver/?tid-423490.html

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:0
posted:3/30/2013
language:Unknown
pages:87