このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/801
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文: 
#  テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 
#  実行例 
#   
#  84         <--キーボードから点数入力 
#  84点        <--入力した点数を表示 
#  95 
#  95点 
#  48 
#  48点 
#  66 
#  66点 
#  80 
#  80点 
#  999     <--データの終わり(999点とは表示しない) 
#  合計点=373点 
#  平均点=74.6点 
#  受験者数=5名 
#  合格者数=4名 
#  
キーボードから点数入力 

テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上  :-
        'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび),
        合計点(_点数ならび,_合計点),
        受験者数(_点数ならび,_受験者数),
        合格者数(_点数ならび,_合格者数),
        表示する('合計点=%t\n平均点=%t点\n受験者数=%t\n合格者数=%t\n',[_合計点,_平均点,_受験者数,合格者数]).
        
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび) :-
        キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数),
        'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,_点数ならび).

'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[]) :-
        'ただし、データの終わりの999(999点と表示しない)'(_点数),!.
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[_点数|R]) :-
        入力した点数を表示(_点数),
        キーボードから点数入力(_次の点数),
        'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_次の点数,R).

キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数) :- 催促付き整数入力('点数を入力してください(データの終わりの999) : ',_点数).

キーボードから点数入力(_点数) :- get_integer(_点数).

入力した点数を表示(_点数) :- write_formatted('%t点\n',[_点数]).

'ただし、データの終わりの999(999点と表示しない)'(999).

合計点(_点数ならび,_合計点) :- 加算(_点数ならび,_合計点_浮動小数点),_合計点 is truncate(_合計点_浮動小数点数),

平均点(_点数ならび,_平均点) :- 平均(_点数ならび,_平均点).

受験者数(_点数ならび,_受験者数) :- length(_点数ならび,_受験者数).

合格者数(_点数ならび,_合格者数) :- 度数((member(_点数,_点数ならび),_点数>=60),_合格者数).

表示する(Format,_値ならび) :- write_formatted(Format,_値ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

加算(trunc(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A is trunc(B)),SL),!.
加算(四捨五入(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!.
加算(切捨て(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!.
加算(切り上げ(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!.
加算([],L) :-
        var(L),
        合計は原則として浮動小数点数,
        L = 0.0e+00,!.
加算([],L) :-
        var(L),
        合計は原則として整数,
        L = 0,!.
加算([],L) :-
        \+(var(L)),
        加算の変数に零をおく(L),!.
加算([L|R],SL) :-
        ならび(L),
        転置([L|R],L1),
        加算_2(L1,SL),!.
加算(X,S) :-
        加算_1(X,0.0e+00,S).

全て整数([]) :- !.
全て整数([N|R]) :- integer(N),全て整数(R).

平均(L,Avg) :- list(L),findavg(A,member(A,L),Avg).

度数(A,[],0).
度数(A,[A|R],X) :- 度数(A,R,Y),X is Y + 1.
度数(A,[_|R],X) :- 度数(A,R,X).

度数(P,N) :- findsum(1,P,F),N is truncate(F).

findavg(_集約項,_項,_算術平均) :-
        findall(_集約項,_項,_値ならび),
        加算(_値ならび,_合計値),
        list_length(_値ならび,_ならびの長さ),
        _算術平均 is _合計値 / _ならびの長さ,!.

合計は原則として浮動小数点数.

% 合計は原則として整数.