Java 程式設計(一)  第 三章 算術運算式  上一頁    下一頁

 

3-4 資料型態的轉換

內容:

  • 3-4-1 資料型態變換時機

  • 3-4-2 範例研討:兩整數相除結果

  • 3-4-3 自我挑戰:紀錄棒球打擊率

3-4-1 資料型態變換時機

A)自動轉換

不同資料型態的變數之間,也可能經由運算子計算後,產生另一個數值表示,而其結果應該是哪一種資料型態。一般程式語言的規則如下:

(1) 整數與整數運算(+-*/後輸出為整數,如 x = y + z,如 yz 為整數,則輸出 x 為整數。

(2) 字元或字串大多以 ASCII 碼(整數型態)表示,字元之間或字元與整數之間計算後,所得結果也是 ASCII 碼(整數)。

(3) 整數與浮點數計算後輸出為浮點數。

值得注意的是,不同變數之間經過運算後,大多必須結果存入內一個變數內;如果被存入變數的資料型態不符合的話,編譯程式時(Compilerjavac)會告知資料型態錯誤。

B)強迫轉換

在許多情況下,我們為了計算正確需要轉換原來變數的資料型態,或是運算後轉換成比較合乎真實情況所需的資料型態。為了合乎這些需求,而必須將變數的資料型態轉換成其他資料型態,稱為『強迫轉換』;敘述格式如下:

(新資料型態)變數名稱;

上述功能為,無論原變數是任何資料型態,取出其內容並轉換成新的資料型態,範例如下:

無論原變數是任何資料型態,取出其內容並轉換成新的資料型態,範例如下:

int a = (int) value;

取出 value 內容,轉換成整數型態,再存入變數 a 內。假設 value = 4.5,則 a= 4

float a = (float)value;

取出value 內容,轉換成浮點數型態,再存入 a 內。

假設 value = 5,則 a = 5.0

在物件導向的程式語言上,物件類別與基本資料型態具有相同的屬性。我們可以任意轉換變數的資料型態;相同的,也可以任意轉換物件的類別型態。我們爾後再介紹此功能應用。

3-4-2 範例研討:兩整數相除結果

A)程式功能:Ex3_4.java

由鍵盤輸入兩個整數,以兩數相除的範例,驗證是否有轉換資料型態可能產生不同的結果。期望程式操作介面如下:

請輸入兩個整數(value1 value2) =>45 23

未轉換 => 45/23 = 1.000000

已轉換 => (float)45/23 = 1.956522

已轉換 => 45/(float)23 = 1.956522

B)製作技巧分析:

兩整數相除僅能得到整數的結果,如果將其結果存入浮點數內,小數點部分也僅能補零(如 45/13 = 3.00);如欲得到小數點部分,則必須將其中某一整數轉換成浮點數。

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// Ex3_4.java

 

import java.util.Scanner;

public class Ex3_4 {    

   public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in);

      int div1, value1, value2;

      float div; 

      System.out.printf("請輸入兩個整數(value1 value2) =>");

      value1 = keyin.nextInt();

      value2 = keyin.nextInt();

 

      // 整數相除得到整數, 存入浮點數變數

      div = value1 /value2;

      System.out.printf("未轉換 => %d/%d = %f\n", value1, value2, div);

 

      // 一個整數轉換成浮點數, 再除以另一個整數, 結果存入浮點數變數

      div = (float)value1 /value2;

      System.out.printf("已轉換 => (float)%d/%d = %f\n", value1, value2, div);

      

      // 強迫轉換另一個整數變數

      div = value1 /(float)value2;

      System.out.printf("已轉換 => %d/(float)%d = %f\n", value1, value2, div);

 

   }

}

D)程式重點分析:

  • 1011 :『value1 = keyin.nextInt();』。利用 Scanner 函數讀入兩個整數,正常情況是使用者輸入兩個整數,再敲入『Enter』鍵,如果僅輸入一個整數,則系統會等待使用者再輸入一個整數。

  • 18 :『div = (float)value1/vaule2;』。將 value1 內容轉換成浮點數。

  • 22 :『div = value1/(float)value2;』。將 value2 內容轉換成浮點數。

3-4-3 自我挑戰:紀錄棒球打擊率

A)程式功能:PM3_3.java

美國大聯盟某一球隊看上了熊隊的林智勝先生,派遣一位球探到台灣,觀察林智勝每次打擊,並紀錄他的打擊率。打擊率是累積方式計算出來的,每一球季開始到計算日當天,之前打擊次數除於安打數(打擊率 = 打擊次數 / 安打次數);球探每次輸入林智勝打擊次數與安打數,則計算出當時的打擊率如何(假設可連續輸入 2 次比賽、之前打擊次數為 50、安打數為 15 支)。期望系統操作介面如下:

****   記錄棒球打擊率工具   ****

目前打擊=50 安打=15支、打擊率是 0.3000

        請輸入第一場 (打擊次數 安打次數) =>3 1

目前出場=53 安打=16支、打擊率是 0.3019

        請輸入第二場 (打擊次數 安打次數) =>4 0

目前出場=57 安打=16支、打擊率是 0.2807

B)程式製作提示:

首先設定打擊累積次數(int total = 50)、安打累積次數(int hits = 15)、打擊率(float batting)、以及每場打擊次數(int numbers)與安打次數(int bingles),並給予適當初值。接著計算與顯示出之前打擊率多寡,再輸入每場比賽結果,並計算出當時打擊率;程式重點提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

……

….

  System.out.printf("目前打擊=%d 安打=%d支、打擊率是 %.4f\n", total, hits, batting);

 

  System.out.printf("\t請輸入第一場 (打擊次數 安打次數) =>");

  numbers = keyin.nextInt();

  bingles = keyin.nextInt();

  total = total + numbers;

  hits = hits + bingles;

  batting = (float)hits/total;

  System.out.printf("目前出場=%d 安打=%d支、打擊率是 %.4f\n", total, hits, batting);

  ……

上述中『batting = (float)hits/total;』功能是強迫轉換變數型態。該敘述運作如下:原來 hits 為整數變數,取出他的內容再將他轉換成浮點數((float)hits),再除以 total,得到的結果是浮點數型態,最後將其存入 batting 變數內。

C)擴充紀錄『長打率』功能:

僅紀錄『打擊率』並無法表示出打擊手的功力如何,球探增加紀錄林智勝的『長打率』變化情形。計算方式:長打率 = 壘打數 / 打數次數,其中壘打與打擊次數都是累加計算的,一壘打則累加 1 分、二壘打則 2 分、三壘打則 3 分、全壘打為 4 分。假設目前記錄為打擊累積次數(total = 50)、壘打數(base = 30),請擴充上述範例,增加可記錄『長打率』(目前 ops = 30/50 = 0.6)的功能。

翻轉工作室:粘添壽

 

Java 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: