このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1244449887/615  
# [1]  授業単元: C初心者コース  
# [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する  
# プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error  
# [3] 環境  
# [3.1]linux  
# [3.2] gcc  
# [3.3]C  
# [4]6月19日  
# [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです 


評価値(_点数,'A+') :- _点数>=90,_点数=<100.
評価値(_点数,'A') :- _点数>=80,_点数=<89.
評価値(_点数,'B') :- _点数>=70,_点数=<79.
評価値(_点数,'C') :- _点数>=60,_点数=<69.
評価値(_点数,'F') :- _点数>=0,_点数=<59.
評価値(_,error).

'試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する' :-
        '試験の点数(100点満点)を入力すると'(_試験の点数),
        評価値を表示する(_試験の点数).

'試験の点数(100点満点)を入力すると'(_試験の点数) :-
        write('試験の点数を入力してください : '),
        行入力(_行),
        '試験の点数(100点満点)を入力診断'(_行,_試験の点数),!.
'試験の点数(100点満点)を入力すると'(_試験の点数) :-
        '試験の点数(100点満点)を入力すると'(_試験の点数).

'試験の点数(100点満点)を入力診断'(_行,_試験の点数) :-
        atom_to_term(_行,_試験の点数,_),
        試験の点数は整数で0点以上100点以下(_試験の点数),!.
'試験の点数(100点満点)を入力診断'(_行,_試験の点数) :-
        writef('入力された %t からは適切な試験の点数が得られません。再入力をお願いします。\n',[_行]),
        fail.

試験の点数は整数で0点以上100点以下(_試験の点数) :-
        integer(_試験の点数),
        _試験の点数>=0,
        _試験の点数=<100,!.

評価値を表示する(_試験の点数) :- 
        評価値(_試験の点数,_評価値),
        writef('入力した試験の点数は %t,その評価値は %t です\n',[_試験の点数,_評価値]).


% 鍵値が範囲指定のときは、鍵の引数は変数にして置く。同時に二つ以上の具体的な値は表現できない。
% 評価値は英大文字から始まっているので変数と区別するためシングルクォーツで囲う。
% 一般に入力は不適切な文字列が入力されることも考慮する。ここでは、適切な入力が得られるまで、
% 繰り返し入力を促す例を示した。これが一般的な対応。
% read/1を使わないのは、入力の最後にピリオドが必要になるから。実務では受け入れられない。
% 文字列から整数を得るのにはatom_to_term/3を使う。第三引数は使わないためアンダースコアになっている。


行入力(_行) :-
        get_char(_文字),
        行末まで読み込む(_文字,_行末までの文字ならび),
        atom_chars(_行,_行末までの文字ならび).

行末まで読み込む(end_of_file,[]) :- !.
行末まで読み込む('\n',[]) :- !.
行末まで読み込む(_文字,[_文字|R]) :-
        get_char(_次の文字),
        行末まで読み込む(_次の文字,R).