5-4 do/while 迴圈控制
內容:
5-4-1 do/while 敘述流程
VIDEO
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 累加程式
VIDEO
( A )程式功能: Ex5_5.java
請利用 do-while 迴圈編寫一只 sum = 100 + 99 +98 + .. + 1 的程式,並印出其結果。期望操作介面如下:
( 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 範例研討:分期貸款試算系統
VIDEO
( 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 自我挑戰:學貸償還試算系統
VIDEO
( 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 範例研討:錢莊借貸試算系統
VIDEO
(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);
}
}