このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/587
#  【質問テンプレ】 
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を 
#                 表示するプログラムを作成せよ。 
#   
#                 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) 
#  

'キーボードより本体価格と税率を入力し、その税込価格を
表示するプログラムを作成せよ。

任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :-
        'キーボードより本体価格と税率を入力し'(_本体価格,_税率),
        その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率).

'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :-
        数を得る(本体価格,_本体価格 >= 0.0,_本体価格),
        数を得る(税率,_税率 >= 0.0,_税率),!.

その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :-
        V is 10 ^ (_小数点以下第n位で四捨五入 - 1),
        _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V,
        writef('%w\n',[_税込み価格]).



数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :-
        list(_催促文ならび),
        findall(_数,(
                    member(_催促文,_催促文ならび),
                    数を得る(Instream,_催促文,_数を含む条件,_数)),
                _数ならび),!.
数を得る(Instream,_催促文,_数を含む条件,_数) :-
        催促文の出力(_催促文),
        get_line(Instream,Line),
        '診断: 数を得る'(Line,_数を含む条件,_数),!.
数を得る(Instream,_催促文,_数を含む条件,_数) :-
        数を得る(Instream,_催促文,_数を含む条件,_数).

催促文の出力('') :- !.
催促文の出力(_催促文) :-
        writef('%tを入力してください : ',[_催促文]).

'診断: 数を得る'(end_of_file,_,end_of_file) :- !.
'診断: 数を得る'('',_,_) :- !,fail.
'診断: 数を得る'(Line,_数を含む条件,_数) :-
        atom_to_term(Line,_数,_),
        number(_数),
        '診断: 数を含む条件'(_数,_数を含む条件),!.
'診断: 数を得る'(Line,_数を含む条件,_数) :-
        \+((atom_to_term(Line,_数,_),number(_数))),
        writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!,
        fail.

'診断: 数を含む条件'(_数,_数を含む条件) :-
        number(_数),
        call(_数を含む条件),!.
'診断: 数を含む条件'(_数,_数を含む条件) :-
        writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!,
        fail.

数を得る(_催促文,_数を含む条件,_数) :-
        数を得る(user_input,_催促文,_数を含む条件,_数).

数を得る(_催促文,_数) :-
        数を得る(user_input,_催促文,true,_数).

数を得る(_数) :-
        数を得る(user_input,'',true,_数).

n個の数を得る(_n,_催促文,_数ならび) :-
        length(_数ならび,_n),
        findall(_数,(
                    部分ならび(_数ならび,_,_,_何番目,_,_,_,L3),
                    writef('[%t/%t]番目の',[_何番目,_n]),
                    数を得る(_催促文,_数)),
                _数ならび).

一行読み込む(_行) :-
        get_line(_行).

get_line(Stream,X) :-
        get_char(Stream,C),
        get_line_1(Stream,C,Chars),
        atom_chars(X,Chars).

get_line_1(Stream,'\n',[]) :- !.
get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(Stream,C,[C|R]) :-
        get_char(Stream,C2),
        get_line_1(Stream,C2,R).


get_line(X) :-
        get_char(C),
        get_line_1(C,Chars),
        atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(C,[C|R]) :-
        get_char(C2),
        get_line_1(C2,R).

list([_|_]) :- !.
list([].