2-1.2 變數

2011年8月9日 星期二

| | | 0 意見

2-1.2 變數
我們在前面所示範的一些程式,只能處理一些簡單的運算,像是求出63+37的和,或是數值與字串的連結。而且,在這些運算中,數值部分是固定的,也就是63或37。換句話說,如果要進行其它數值的運算,必須直接修改 System.out.println(63+37); 括號中的數值部分然後,在重新編譯後,才可以得到新的結果。這樣一來,不但費時也費力,也不是好的解決問題方式。所以,若是有一種東西可以讓我們自由地變更數值,而不必費心地修改每個數值,再重新編譯,得到結果,該是多美好的事情啊當然,這個東西就是我們接著要介紹的變數(variable)。
 
變數宣告
        到底,什麼是變數呢?若單從字面上來看,變數應該就是可以變動的數。這種說法,過於簡單與抽象,進一步來看,我們可以將變數視為存放東西各種箱子,而每種箱子只能存放符合規範的東西,這裡所指的規範,其實就是指資料型態(datatype),如圖2-4所示。我們東西放入箱子後,不但可以將該東西取出,也可以換成其他的東西,如此一來,就可以達到更改數值的目的。

圖2-4
        不過,這麼多存有東西的箱子,該如何取得我們所要的東西呢?答案就是為每個箱子命名。藉由給予每個箱子特定的名稱,就能取用到指定的箱子,以及箱子內所存放的東西。上述的整個過程,就是所謂的變數宣告(declaration)底下是個簡單的變數宣告
 
           Int x;   //宣告名稱為x的變數,且該變數的資料型態為int
 圖示如下
圖2-5

[重要] 每個變數在使用之前,必須先宣告並且給予名稱。
 
      當宣告完變數之後,就可以對該變數進行不同的處理。底下的範例,簡單地示範指定數值給變數,以及如何顯示該變數的數值。
 
Chap2_1_5
// 將數值指定給變數並輸出至畫面
class Chap2_1_5 {

public static void main(String[] args) {
             int x;                    //  x為int型態的變數            ---------------------

             x = 88;                         // 指定88給x               ---------------------

             System.out.println(x);                  // 顯示x的值  -------------------
}

 結果
88

 
 程式說明:
1. 這個程式先宣告一個資料型態為int的變數x,表示x只能用來存放整數(int)數值,
  不能存放其他的資料型態。
2. 接著,利用指定運算子(=)將數值88指定給x,如圖2-6
圖2-6
 
[重要] 指定運算子”=”是將數值指定給變數,這和數學運算=”號不同

3. 變數一旦放入內容後,可以對該變數進行各種運算。本例則是取出該變數的內
   容, 並將其顯示在螢幕上
        

挑戰題 :
Err2_1_2.java
// 印出變數 x 的值(5)

class Err2_1_2{

   public static void main(String[] args){
        int x = 5;
             
        System.out.println( "x" );    
}
}

x


問題 : 為什麼得不到 x 的值(5)呢?

       現在,我們已經會使用變數了。接著,我們將宣告兩個變數,並透個這兩個變數進行一些比較複雜的運算。 

Chap2_1_6
// 顯示x與y的和、積以及平均值
class Chap2_1_6 {

public static void main(String[] args) {
             int x;                    // x為int型態的變數
             int y;                    // y為int型態的變數

             x = 48;                         // 指定48給x
             y = 57;                         // 指定57給y

             System.out.println("x的值為" + x + "。");             // 顯示x的值
             System.out.println("y的值為" + y + "。");            // 顯示y的值
                                                                                                 ------------
             System.out.println("x+y的和為" + (x + y) + "。");       // 顯示x+y的和
             System.out.println("x*y的積為" + (x * y) + "。");        // 顯示x*y的積
             System.out.println("x及y的平均值為" + (x + y) / 2 + "。"); // 顯示平均值
}

 結果
x的值為48。
y的值為57。
x+y的和為105。
x*y的積為2736。
x及y的平均值為52。

 
程式說明:
1. 程式先宣告兩個int變數xy宣告兩個變數的方式,除了上方式,也可以如此宣告:
 
int x,y ;

      就是利用”,”號來連結所要宣告的變數。這樣的方式,可以同時宣告多個變數,只需要在每個變數之間以”,”號隔開。事實上,這二種宣告方式沒有優劣之分,如果按照程式內一行一行的宣告,則比較容易加上註解,缺點就是程式的行數會增加。

2. 然後,分別將數值48指定給x,數值57指定給y。

3. 分別顯示x和y內容。然後,顯示x+y的結果,以及(x+y)/2的結果。

圖2-8
 
算術運算的方式及優先順
   從程式的結果可以得知,進行算術運算的規則和一般的數學計算很相似,像是括號內先運算,乘除運算優於加減運算等。
*

System.out.println("xy的平均值為" + (x + y) / 2 + "");
                                                                   
                                                           (48 + 57) /  2
                                                                      
                                                                     105 / 2

圖2-9
   另外,由於整數相除的結果也會是整數,所以(48+57)/2的結果是52,不是52.5。
[重要] 整數/整數的運算結果也是整數,即會捨棄小數部分。

挑戰題 :

Err2_1_3.java
// 顯示xy的和、積以及平均值

class Err2_1_3 {
   public static void main(String[] args){

int x; // xint型態的變數
int y; // yint型態的變數

x = 32.5;
y = 42.6;

System.out.println("x的值為" + x + "");         
System.out.println("y的值為" + y + "");     
   
System.out.println("x+y的和為" + (x + y) + "");     
System.out.println("x*y的積為" + (x * y) + "");           
System.out.println("xy的平均值為" + (x + y) / 2 + "");  

}
}

D:\chap2\Err2_1_3.java:9: possible loss of precision
found   : double
required: int
x = 32.5;
   ^
D:\docs\javabook\chap2\Err2_1_3.java:10: possible loss of precision
found   : double
required: int
y = 42.6;
   ^
2 errors


發生什麼事? 為什麼會產生錯誤?

2-1.1 顯示運算結果

2011年8月8日 星期一

| | | 0 意見
2-1.1 顯示運算結果
    現在讓我們撰寫程式, 進行簡單的加法運算, 並顯示運算後的結果。

Chap2_1_1.java
 // 計算並顯示整數63與37的和
class Chap2_1_1 {

public static void main(String[] args) {
System.out.println(63 + 37);
}
}

執行結果
100


程式說明:
       從輸出結果來看,可以歸納出以下要點:
       1.因為63+37位於小括號內,所以會先進行兩個整數的加法運算,即63+37=100。
       2. 因此,System.out.println(63 + 37); 就等同於System.out.println(100); 。所以,程式會
          在螢 幕上顯示整數值100後,再輸出換行字元。
        
    [補充] System.out.print(); 及 System.out.println(); 敘述中的print()和println()方法,這是方法
              多載(method overloading)的應用,在第七章會更進一步地探討。
 
整數與字串
      上例中,數值63和37就是整數常值(integer literal)。請注意,這和字串常值(String literal)"63"不同。不過,就此程式的執行結果來看,若只顯示數值100的話,無法瞭解該程式所要表達的意義。所以,我們可以搭配字串常值的使用,來表達更清楚的意思。

連結字串與數值
       因此,為了清楚表達整數值100是數值63加上數值37的結果,我們修改上述程式,加入適當的字串顯示後,可以清楚表達所進行的運算。

Chap2_1_2.java
// 計算並顯示整數63與37的和,利用加入適當的字串常數,讓表達的意思更加清楚。
class Chap2_1_2 {

public static void main(String[] args) {
System.out.println("63 + 37 =" + (63 + 37));
}
}


執行結果
63 + 37 =100



程式說明:
       由執行結果來看,在將結果輸出並顯示之前,會先完成多項動作,其處理過程如下:
      1.如同我們在做數學運算一般,括號內的運算會優先執行,也就是先進行(63+37)的加法運          算。

  [重要]  括號內的運算會優先執行。

      2. 因為,使用+號連接字串與數值時,會先將數值轉換成字串,接著再進行字串的連結。
         所以,數值100就會轉換成字串"100"。
 
  [重要] 當以”+”號連接字串與數值時,不論是字串+數值或是數值+字串,會先將數值
             轉換成字串後,再進行自串連結。

      3. 接著,就會連結字串“63+37=”和“100”,成為 “63+37=100”,然後將結果輸出並顯示。


System.out.println( “ 63 + 37 = ” + ( 63 + 37 ) );
                                                           ⤵ 進行括號()內的運算
             ⇩                                           100
        
 ⇢由左至右運算 ⇢                     
System.out.println( “ 63 + 37 = ” + 100 );
                                                       ⤵ 將 int 100 轉換成 String “100”
                                                      “100”
             ⇩ 連結

System.out.println(  “ 63 + 37 = 100 ” );

                                                        圖2-1

      想看看,如果刪除程式Chap2_1_2中圍住運算式63+37的括號,結果會有什麼不同?底下是修改後的程式,試著執行看看,並觀看結果有何不同。

Chap2_1_3.java
// 計算並顯示整數63與37的和,因為少了括號而得到非預期的結果。
class Chap2_1_3 {

public static void main(String[] args) {
System.out.println("63 + 37 = " + 63 + 37);
}
}

執行結果
63 + 37 = 6337


程式說明:
       因為運算式63+57沒有用括號圍住,所以程式會由左至右進行運算,得到63+57=6357這個結果,而不是我們所預期的63+57=100。以下,我們利用圖示來表達整個運算過程。

System.out.println( " 63 + 37 = " + 63 + 37 );
                                                       ⤵ int 63 轉換成 String “63”
                                                      “63”
                ⇩ 進行字串連結
System.out.println( " 63 + 37 = 63” + 37 );
                                                          ⤵ int 37 轉換成 String “37”
                                                         “37”
                ⇩ 進行字串連結
System.out.println( " 63 + 37 = 6337 “ );

                                                             圖2-2

        接著,我們再看看另一個不使用括號的範例。雖然,該範例會得到與我們預期相同的結果。但是,除非你非常清楚整個運算流程。否則,不建議以此方式來撰寫程式。

Chap2_1_4.java
// 計算並顯示整數63與37的和,雖然沒有括號,卻得到預期的結果。
class Chap2_1_4 {

public static void main(String[] args) {
System.out.println(63 + 37 + "是63加上37的和。");
}
}


執行結果
100是63加上37的和。


程式說明
       雖然,我們沒有使用括號來圍住運算式63+37。但是,仍然可以得到正確的結果。這是因為運算順序的關係。下圖,詳細解說整個運算流程。

⇢ 由左至右讀取 ⇢⇢⇢
System.out.println( 63 + 37 + " 是63加上37的和。" );
                                  ⤵ 進行 63 + 37 的運算
                                 100

                          ⇢ 讀取到 +“字串”  
System.out.println( 100 + " 是63加上37的和。");
                                   ⤵ int 100 轉換成 String “100”
                               “100”
             ⇩ 連結

System.out.println( “ 100 是63加上37的和。" );

                                                        圖2-3
      請注意,盡量多使用各種括號來決定運算的優先順序。畢竟,不是所有的運算都是由左到右進行運算。而且,省略各種括號,只會讓程式變得更加難懂,甚至得到非預期的結果。所以,要精簡程式碼之前,請先確定你已完全瞭解運算流程,以免因小失大。

挑戰題

//求出運算式 63 – 27的結果,且在畫面上顯示 63-37 = 26

class Err2_1_1 {
public static void main(String[] args) {

System.out.println("63-37 = " + 63 - 37);

}
}

執行結果
D:\chap2\Err2_1_1.java:6: operator - cannot be applied to java.lang.String,int
System.out.println("63-37 = " + 63 - 37);
                                  ^
1 error


找出以上程式錯誤,並加以修正。