2-3.2 日期時間

2011年8月26日 星期五

| | | 0 意見

2-3.2 日期時間
       日期時間是程式設計常會面對的課題,java語言也支援日期時間的處理。不過,java所支援的方式比較特殊,看看以下的範例。

Chap2_3_2.java
//顯示時間(得到長整數型態的數值)

import java.util.Date;

public class Chap2_3_2{

     public static void main(String[] args){
 
        Date date = new Date();
        System.out.println(date.getTime());

     }
}

執行結果
1312438903402


程式說明:
1. 為了能夠正確地使用日期時間,必須在程式的開頭部分加入import java.util.Date;。
2. 從結果來看,得到一組很奇怪的整數值,這和我們原先的預期不太一樣。原因是,java是計    算目前的日期時間與1970年1月1日的差值,單位是毫秒(1/1000秒)。

再看看另一個範例:

Chap2_3_3.java
//顯示目前的日期時間
import java.util.Date;

public class Chap2_3_3{

     public static void main(String[] args){
 
        Date date = new Date();
        System.out.println(date);

     }
}

執行結果
Thu Aug 04 14:54:12 CST 2011


程式說明:
       雖然,這個程式可以得到我們想要的結果。但是,System.out.println(date); 敘述句所做的一些處理,我們先不做解釋,等到學習第七章的方法時,會有更清楚的說明。

思考題:
試著利用Chap2_3_2.java所得到的長整數值,計算出從1970年1月1日到現在所經過的秒數、小時數、天數。可以的話,進一步計算出目前的日期與時間,可以利用Chap2_3_3.java的方式來驗證計算結果。



2_3.1 亂數產生器

| | | 0 意見

2-3 其它輸入
        在前面兩節中,我們先後討論了在程式中直接輸入變數的內容,以及透過鍵盤,讓使用者可以輸入變數的內容。除了這兩種方式外,java語言本身還提供其它的輸入方式,後續將探討亂數產生器和日期時間。

2_3.1 亂數產生器
        我們試著撰寫可以產生介於0-9的整數數值,再將該數值以幸運數字的方式呈現。

Chap2_3_1.java
// 利用亂數產生器產生並顯示0 ~ 9的幸運數字
import java.util.Random;
class Chap2_3_1 {
public static void main(String[] args) {
    Random rand = new Random();
    int luckyNo = rand.nextInt(10);              // 產生0~9的亂數
    System.out.println("今日的幸運數字為 " + luckyNo + "。");
}
}

執行結果
今日的幸運數字為 6。

程式說明:
1. 如同之前的從鍵盤讀入範例一般,要使用亂數產生器來產生亂數,必須有一定的程序步驟。    如圖2-13所示
import java.util.Random; ------------------  ① 置於類別宣告之前。                                 

class Chap2_3_1 {
public static void main(String[] args) {
    Random rand = new Random(); ---- ②置於main方法的開頭,必須在步驟                                                                            3之前。
    
      int luckyNo = rand.nextInt(10);-------③ 接收亂數產生器所產生的整數。
  }
}

圖2-13
2. 因為程式利用rand.nextInt(10);,所以會得到介於0-9之間的整數。這就像是去廟裡求籤,在    籤桶裡有10支籤,會抽中哪一支完全由天註定。

練習題 2-7
       由亂數產生器產生三個數值x, y,z。
         x為正的個位數(1~9)。
         y為負的個位數(-1~-9)。
         z為正的二位數(10~99)。
 

練習題 2-8
      由鍵盤輸入一個整數,然後由亂數產生器產生一個正負5的倍數。
參考結果
請輸入整數 :7
正負五的倍數產生中。
新整數是7的4倍,為28。


練習題 2-9
   利用亂數產生器產生二個0~100的整數,在畫面上顯示該二數的相反數,以及差值。
參考結果
x的值為 40
y的值為 13
x的負值為 -40
y的負值為 -13
二數相差 27


練習題 2-10        
       由亂數產生器產生三個數值x, y,z(請參考下面的補充)。
         x為正的實數(0.0 ~1.0)。
         y為正的實數(0.0 ~ 10)。
         z為實數(-1.0 ~ 1.0)。

[補充] 下表列出亂數產生器的一些方法。

表2-4 亂數產生器的方法
Method(方法)Data-Type(資料型態)產生的數值範圍
nextInt()int-2147483648 ~ +2147483647
nextInt(n)int0~(n-1)
nextLong()long-9223372036854775808 ~ +9223372036854775807
nextDoouble()double0.0 ~ 1.0

nextFloat()float0.0 ~ 1.0
nextBoolean()booleantrue 或 false

               
練習題 2-11
       由亂數產生一個實數(double)的半徑,利用final的實數(PI=3.14),計算出此圓的面積。
參考結果
半徑0.48418067421193156的圓面積為0.7361131053802068。

2_2.4 讀入字串

2011年8月19日 星期五

| | | 0 意見

2_2.4 讀入字串
      我們已經介紹許多處理數值的範例。接著,就來撰寫處理字串的程式吧!在開始撰寫之前,請試著先挑戰底下的題目。

思考題 :
執行 Chap2_2_1.class後,接著 輸入 abc
XY 加減乘除運算。
請輸入整數Xabc

錯誤訊息
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Unknown Source)
  at java.util.Scanner.next(Unknown Source)
  at java.util.Scanner.nextInt(Unknown Source)
  at java.util.Scanner.nextInt(Unknown Source)
  at Chap2_2_1.main(Chap2_2_1.java:12)

我們得到和之前一樣的錯誤結果。接下來,我們將討論如何讀入字串。

Chap2_2_4.java
// 輸入姓名後,程式會跟您說早安(next()版)
import java.util.Scanner;
class Chap2_2_4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請問您的大名是:");
String s = scanner.next();    // 讀入字串
System.out.println("早安!" + s + "先生。");              // 顯示
}
}

執行結果
請問您的大名是:天天旺
早安!天天旺先生。

程式說明:
1. 接受字串型態的變數會以String宣告,如同範例中的String s。
2. 字串變數s就會接收使用者從鍵盤輸入的字串,例如s = scanner.next();。

       如果,我們將輸入字串天天旺更改為 天旺”,也就是在"天天"中間抽入一個空白字元。執行程式後,結果如下
請問您的名字是:天 天旺
早安!天先生。

比較這兩個結果,我們可以發現,當使用 next()方法來讀入鍵盤輸入的字串時,空格和 tab 字元會視為字串分段的符號。因此,當我們在 " 天旺"中插入一個空格時,該字串就會變成"天"和"天旺"這兩個字串。所以,字串變數 s 只會讀入字串"天"。接著,我們使用 nextLine() 方法,看看結果有何不同。

Chap2_2_5.java
//輸入姓名後,程式會跟您說早安(nextLine()版)
import java.util.Scanner;
class Chap2_2_5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請問您的姓名是:");
String s = scanner.nextLine();     // 讀入一整行字串
System.out.println("早安!" + s + "先生。");  //   輸出
}
}

執行結果
請問您的姓名是:天 天旺
早安! 天 天旺先生。

 
程式說明:
       程式Chap2_2_5.java利用nextLine()方法來讀入鍵盤輸入的字串。因為,nextLine()方法會讀入一整行的文字字串,就可以得到"早安! 天 天旺先生。"的輸出結果。

       String 型態變數可以進行字串初始化,以及指定字串等動作。   
Chap2_2_6.java
// 字串的初始化及改寫
class Chap2_2_6 {
public static void main(String[] args) {
String str1 = "AAA";     // 初始化
String str2 = "QQQ";    // 初始化
str1 = "TTT"; // 改寫(將TTT指定給str1)
System.out.println("字串str1為 " + str1 + "。"); // 顯示
System.out.println("字串str2為 " + str2 + "。"); // 顯示
}
}

執行結果
字串str1為 TTT。
字串str2為 QQQ。


程式說明:
        字串變數str1會先初使化為 "AAA",然後再指定為"QQQ"。因此,str1的內容會由"AAA"變成"QQQ"。

思考題 :

Err2_2_3.java
public class Err2_2_3 {

public static void main(String[] args) {
//求取 x + y 之和
int x = 5;
String y = "6";
System.out.println("x + y = " + (x + y));
}
}

錯誤訊息
x + y = 56

為什麼這個結果不是 5+6=11 ?

Err2_2_4.java
class Err2_2_4{

public static void main(String[] args){
String str = qq ;
System.out.println(str);
}
}

錯誤訊息
D:\chap2\chap2\Err2_2_4.java:3: cannot find symbol
symbol  : variable qq
location: class Err2_2_4
String str = qq ;
            ^
1 error


練習題 2-5
       製作一個讓會員輸入姓名。然後,系統會表達歡迎的程式。
大福會員系統-會員登入
請輸入您的姓名。
--------------------------------
姓 : 王
名 : 大旦
歡迎 王大旦 先生/小姐 。


練習題 2-6
       利用String改寫的技巧。製作一支程式不管由鍵盤輸入什麼字串,輸出永遠是”來福”。
請輸入 : 王小明
永遠是來福