このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289913298/93
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク):  
#   
#  関数int yokin(int yen, double rishi, int year)を定義しなさい。  
#  この関数はyen円を年利rishiの定期預金にyear年預けた後に戻ってくる金額を返す関数である。  
#  引数はすべて0より大きいと仮定してよい。  
#  rishiは,5%の場合には0.05となる。  
#  利子は端数(小数点以下の値)があったとしても切り捨てられる。  
#  端数の切り捨ては,毎年行われる。 main関数は次の処理をしなさい。  
#  入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。  
#  int yokin(int yen, double rishi, int year)を利用して,預け入れ後に受け取れる金額を出力せよ。  
#   
#  入力例1: 10000 0.05 3  
#  入力例1に対する出力:11576  
#  入力例2: 10000 0.05 5  
#  入力例2に対する出力:12761  
#  入力例3: 10000 0.035 10  
#  入力例3に対する出力:14101  
#   
#  

'入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。' :-
        '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(1).

'入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N) :-
        '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数),
        預け入れ後に受け取れる金額('預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数,_受け取れる金額),
        write_formatted('入力例%tに対する出力 : %t\n',[_受け取れる金額]),
        N2 is N + 1,
        '入力として,預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。預け入れ後に受け取れる金額を出力せよ。'(N2).

'預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(N,_預け入れる金額を表す整数,_利子を表す実数,_年数) :-
        write_formatted('入力例%t : ',[N]),
        get_line(Line),
        入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数),!.
'預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数) :-
        '預け入れる金額を表す整数,利子を表す実数(0.0より大きく, 1.0より小さい),年数を受け付ける。'(_預け入れる金額を表す整数,_利子を表す実数,_年数).

入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :-
        split(Line,[' '],[_預け入れる金額を表す整数,_利子を表す実数,_年数]),
        integer(_預け入れる金額を表す整数),
        float(_利子を表す実数),
        integer(_年数),
        _年数 > 0,!.
入力診断(Line,_預け入れる金額を表す整数,_利子を表す実数,_年数) :-
        write_formmated('入力された %t からは適切な値を3個取り出すことができません。\n再入力をお願いします。\n',[Line]),
        fail.

預け入れ後に受け取れる金額(_円,_利子,_年,_受け取れる金額) :-
        length(L,_年),
        複利計算(_円,_利子,L,_受け取れる金額).

複利計算(_受け取れる金額,_,[],_受け取れる金額) :- !.
複利計算(_前残,_利子,[_|R],_受け取れる金額).
         _利息 is truncate(floor(_前残 * _利子)),
         _繰越 is _前残 + _利息,
         複利計算(_繰越,_利子,R,_受け取れる金額).