Java 程式設計(一)  第 五章 重複性流程  上一頁    下一頁

 

5-4 do/while 迴圈控制

 內容:

  • 5-4-1 do/while 敘述流程

  • 5-4-2 範例研討:do/while 累加程式

  • 5-4-3 範例研討:分期貸款試算系統

  • 5-4-4 自我挑戰:學貸償還試算系統

  • 5-4-5 範例研討:錢莊借貸試算系統

5-4-1 do/while 敘述流程

do/while 敘述與 while 迴圈非常相似,皆僅判斷條件與執行迴圈實體而已,但兩者還有稍微不同的地方。do-while 敘述是先執行迴圈實體後再測試判斷條件,如果成立則繼續執行,否則跳離迴圈;而 while 迴圈是先測試條件,條件成立則繼續執行迴圈實體,否則跳離迴圈。由此可見,do-while 迴圈至少會執行迴圈實體一次。

5-6 do/while 敘述的流程圖。當程式進入 do/while 敘述後,立即執行迴圈實體,之後再測試條件,如成立的話,則再重複執行;否則結束該敘述。語法與範例如下:

5-6 do/while 敘述的流程圖

語法:

範例:

do {

Statement 1;

Statement 2;

….

}while (條件判斷);

do {

    sum = sum + k;

    k = k+1;

}while( k <100);

5-4-2 範例研討:do/while 累加程式

A)程式功能:Ex5_5.java

請利用 do-while 迴圈編寫一只 sum = 100 + 99 +98 + .. + 1 的程式,並印出其結果。期望操作介面如下:

100 +... + 1= 5050

B)製作技巧研討:

如同 for while 迴圈,do/while 敘述句亦可以製作連續累加或累乘程式。但此題目希望由高累加到低數字,判斷條件的計數器必須由高遞減到低(count--),吾人將程式流程繪製如圖 5 -7 所示。

5-7 do/while 累加程式的流程圖

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

// Ex5_5.java

 

public class Ex5_5 {

   public static void main(String args[]) {

       int count, limit = 100, sum=0;

       count = limit;

       do {

           sum = sum + count;

           count = count - 1;

       } while (count > 0);

       System.out.printf("%d +... + 1= %d\n", limit, sum);

   }

}

(D) 程式重點分析:

(1) 6 行:count = limit;。將判斷條件用的計數器設定最高數值(100)。

(2) 7~10 行:do { ….}while(count > 0);Do/while 敘述句。

(3) 9 行: count = count -1;。計數器遞減(如同 count--)。

5-4-3 範例研討:分期貸款試算系統

A)程式功能:Ex5_6.java

目前銀行大多有提供定額還款的貸款業務,無論客戶承貸多少金額(如 100 萬元),可選擇每個月還款多寡(如 2 萬元),其中包含利息(如年率 4 %),一直到債務還清為止。許多年輕人不瞭解自己還款能力,擴張貸款額度可能造成一輩子的債務人。因此,銀行希望製作一套分期貸款試算系統,客戶自行輸入貸款額度,目前年利率、預計每月還款金額;因年利率隨時調變,系統僅能輸出大約需要還款多少期(月)。如果預估期數超 20 年(240 期),系統將自動拒絕承做,否則歡迎洽臨行員。期望系統操作介面如下:

情況一:允許貸款

== 歡迎光臨藝術銀行貸款試算系統 ==

請輸入貸款金額 () =>100

請輸入年利率 (0.04) =>0.04

期望每月還款額度 () =>2

您需要 54 () 才可還款完畢

本行願意承做, 歡迎洽詢行員

情況二:拒絕貸款

== 歡迎光臨藝術銀行貸款試算系統 ==

請輸入貸款金額 () =>200

請輸入年利率 (0.04) =>0.08

期望每月還款額度 () =>1.5

您需要 330 () 才可還款完畢

還款期限超過 240 請另選貸款額度

B)製作技巧研討:

雖然貸款是以年利率計算,但客戶是每月清還利息,因此每月餘額計算時需將原餘額再加上當月的利息。吾人利用虛擬碼規劃系統大綱如下:

宣告相關物件與變數;

讀入客戶貸款額度(credit)、年利率(rate)與每月還款(pay);

設定累進期數初始值(count=0);

設定初始餘額(balance = credit);

Do {

計算目前餘額((balance = balance + (balance*rate)/12) - pay

累加還款期數(count = count + 1

} while(是否還剩餘額 (balance >0))

輸出顯示還款期數(count);

If (期數超過 240)

顯示 "拒絕承做"

Else

顯示 "願意承做"

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

28

29

30

31

32

33

34

35

36

37

38

39

40

//Ex5_6.java

 

import java.util.*;

public class Ex5_6 {

   public static void main(String args[]) {

       /* 宣告相關物件與變數 */

       Scanner keyin = new Scanner(System.in);

       final int limit = 240;  //最高期限

       double credit;          // 貸款額度()

       double pay;             // 每月攤還金額()

       double rate;            // 年利率

       int count=0;              // 累計繳納期數

       double balance;         // 目前貸款餘額

    

       /* 讀取客戶輸入資料 */

       System.out.printf("== 歡迎光臨藝術銀行貸款試算系統 ==\n");

       System.out.printf("請輸入貸款金額 () =>");

       credit = keyin.nextDouble();

       System.out.printf("請輸入年利率 (0.04) =>");

       rate = keyin.nextDouble();

       System.out.printf("期望每月還款額度 () =>");

       pay = keyin.nextDouble();

        /* 計算還款期數 */

       balance = credit;

       do {

           balance = balance + (balance*rate)/12;

           balance = balance - pay;

           count = count + 1;

       }while(balance > 0);

       System.out.printf("您需要 %d () 才可還款完畢\n", count-1);

       if (count > limit)

          System.out.printf("超過期數 %d 請另選貸款額度\n", limit);

       else

          System.out.printf("本行願意承做, 歡迎洽詢行員\n");

 

   }

}

(D) 程式重點分析:

(1) 27~31 行:do { …}while(balance >0);Do/while 敘述句。

(2) 32 行:System.out.printf(…., count-1);。當 balance 已經小於 0 了,但還是執行 count = count +1  之後再判斷,因此還要再扣除回來。

5-4-4 自我挑戰:學貸償還試算系統

A)程式功能:PM5_4.java

目前許多學生都有申請學生貸款,依政府規定畢業後一年須開始償還貸款,並按年金法按月平均攤還本息,償還期限以申請期間為準,每一學期得以一年計,依此類推。如此限定期間內還款又稱為『定期貸款』。承辦銀行希望能讓學生理解繳款狀況,建立一套『學貸償還試算系統』,讓學生提早規畫畢業後,如何償還貸款。系統要求學生輸入貸款額度( 40 )、返還期限(如大學四年則 8 )、銀行利息(如年利率 4%),則預估每月應繳多少錢(請列出前 10 個月)?以及到償還完畢後,延伸多少利息?期望操作介面如下:

對於經濟能力較好的客戶總是希望能快速還完貸款,銀行也提供定期返還貸款辦法;方法是客戶每月平均返還本金,再加上當月的利息。如此一來,客戶每月繳交的金額將不同,前面幾期繳交越多,最後幾期利息越少。銀行也希望客戶辦理貸款之前,能先評估自己還款能力如何,因此希望建立一套『定期貸款試算系統』。客戶自行輸入貸款額度、年利率、預估還款期數,則系統能列印出每月應該繳納的金額。期望操作介面如下:

== 學貸償還試算系統 ==

請輸入貸款金額 () =>40

請輸入年利率 (0.04) =>0.04

償還年限(貸款學期數) =>8

10 期應繳納金額如下:

您第 1 期需繳納 0.55 萬元

您第 2 期需繳納 0.55 萬元

您第 3 期需繳納 0.55 萬元

您第 4 期需繳納 0.55 萬元

您第 5 期需繳納 0.54 萬元

您第 6 期需繳納 0.54 萬元

您第 7 期需繳納 0.54 萬元

您第 8 期需繳納 0.54 萬元

您第 9 期需繳納 0.54 萬元

到清償為止,總共延伸利息 6.47 萬元

B)製作技巧提示:

此系統需先計算出客戶每個分攤多少貸款額度,每月計算利息時再扣除已還清的本金,由餘額計算出當月應繳納的利息;分攤本金加上當月利息,就是該月需繳納金額。虛擬碼規劃如下:

宣告相關物件與變數;

讀入客戶貸款額度(credit)、年利率(rate)與預計返還期數(stages);

計算每月平均分攤本金(pay_month = credit/stages);

設定初始餘額(balance = credit);

Do {

本月延伸利息 (interest = (balance*rate)/12;

計算目前該月應繳金額(pay = pay_month +interest);

計算本月餘額(balance = balance – pay_month);

累加還款期數(count = count + 1);

累加產生利息(sum = sum + interest);

輸出顯示本月期數與應繳金額(count, pay);

} while(是否已到期 ( count < stages )

5-4-5 範例研討:錢莊借貸試算系統

(A) 系統功能:Ex5_7

一般錢莊(或稱資產管理公司、應收款管理公司)提供顧客緊急貸款需求,客戶能提供抵押品大多非常薄弱,譬如:舊汽車、機車、手錶等等不值錢的物品,甚至給人頭保證的信用貸款(備注:如果足夠抵押品就向銀行貸了)。相對應的,它的放款金額較低,利率也比較高,並且須按月繳還利息,否則利息加入下個月的本金(俗稱利息滾本金)。其利息算法如下:

(1) 照政府規定年利率不得超過 48 %,即是月利率 4 %(俗稱四分利)。也有 10 天為一期 2 %(俗稱二分利)

(2) 照政府規定手續費不得超過 5 %

(3) 實際取得金額 = 借貸金額第一個月利息手續費。

(4) 按月繳交利息,否則加入本金借貸,及下個月是本金=上月本金 + 利息+ 手續費。

許多人貪一時之快,造成滿身債務。政府希望市民能了解此運作情況,建立一套試算系統,功能是,市民輸入貸款金額(10 ),實際取得多少錢(扣除第一個月利息與手續費)?爾後每月應繳多少利息?如隔多少個月( 10 個月)未繳利息後,則本金成長為多少?之後每月應繳多少利息。期望操作介面如下:

== 歡迎光臨錢莊貸款試算系統 ==

請輸入貸款金額 () =>20

請輸入月利率 (0.04) =>0.04

多個月沒繳交利息( 10 個月) =>20

列印相關借貸數據如下:

實際取得貸款金額 = 18.20 萬元

每個月應繳交計息 = 0.80 萬元

未繳利息 20 個月後,本金累積為 112.09 萬元

      之後每月利息 = 4.48 萬元

(B) 程式範例:

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

28

29

30

31

32

33

//Ex5_7.java

 

import java.util.*;

public class Ex5_7 {

     public static void main(String args[]) {

          /* 宣告相關物件與變數 */

          Scanner keyin = new Scanner(System.in);

          double credit;          // 貸款額度()

          double rate;            // 月利率

          int num;                // 未繳交利息月數

          double total;           // 貸款取得金額

    

          /* 讀取客戶貸款資料 */

          System.out.printf("== 歡迎光臨錢莊貸款試算系統 ==\n");

          System.out.printf("請輸入貸款金額 () =>");

          credit = keyin.nextDouble();

          System.out.printf("請輸入月利率 (0.04) =>");

          rate = keyin.nextDouble();

          System.out.printf("多個月沒繳交利息( 10 個月) =>");

          num = keyin.nextInt();

          System.out.printf("列印相關借貸數據如下:\n");

          total = credit - credit * 0.04 - credit * 0.05;

          System.out.printf("實際取得貸款金額 = %.2f 萬元\n", total);

          System.out.printf("每個月應繳交計息 = %.2f 萬元\n", credit*0.04);

          for(int i=0; i<num; i++)

             credit = credit + credit * 0.04 + credit * 0.05;

          System.out.printf("未繳利息 %d 個月後,本金累積為 %.2f 萬元\n",num, credit);

          System.out.printf("      之後每月利息 = %.2f 萬元\n", credit*0.04);

     }

}

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: