このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/159
#  [1] 授業単元:計算機実習 
#  [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/nbsATV4X  
#  
#  課題:
#  ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を
#  読み込み、A+〜Dの成績評価を行い、下記の項目を計算して表示するプログラムを
#  作成せよ。
#  
#  表示項目:
#  1.全履修者の平均点
#  2.評価の分布(A+〜D評価のそれぞれの人数)
#  
#  データファイルの説明:
#  学籍番号と試験の点数(100点満点)が、スペース区切りで格納されている
#  
#  要求仕様:
#  ファイルの行数(=履修者数)が変わっても動作するようにすること。
#  ただし配列を使う場合は、履修者数の上限値は150名とする
#  補足:
#  1.試験の点数は、今回の場合は0.5点刻みである。fscanfなどで得点を読み込む
#      際は、整数型でなく実数型(double または float)で処理する必要がある
#  2.評価は、A+が90点〜100点、Aが80点以上90点未満(今回は89.5点まで)、Bが
#      70点以上80点未満、Cが60点以上70点未満、Dが0点〜60点未満とする
#  3.0点は未受験を表すが、今回の課題では受験して0点を取ったとみなす。
#      つまり、E評価は行わない
#  4.配列や構造体は、使っても使わなくてもよい
#  
#  追加課題:
#  ・最終評価の平均点で、0点の者を除外して計算したものも表示
#  score.txtの内容 
#  12X1102 20.5
#  12X1115 85
#  12X1117 90.5
#  12X1117 75.5
#  12X1118 79.5
#  12X1120 68.5
#  12X1121 75
#  12X1303 0
#  12X1304 54.5
#  12X1309 95.5
#  12X1310 65.5
#  12X1311 78.5
#  12X1313 0
#  12X1313 40
#  12X1314 83
#  12X1315 0
#  12X1321 0
#  12X1321 81
#  12X1324 77.5
#  12X1324 90.5
#  12X1326 80
#  12X1601 56
#  12X1604 79.5
#  12X1611 68.5
#  12X1703 61
#  12X1808 0
#  12X1808 74.5
#  12X1811 68.5
#  12X1813 87
#  12X1814 85.5
#  12X1815 74.5
#  12X1816 92.5
#  12X1901 82
#  12X1903 88.5
#  12X1906 91
#  12X1911 84.5
#  12X1912 93.5
#  12X1913 86.5
#  12X1916 73.5
#  12X3117 82
#  12X3118 65.5
#  12X3123 0
#  12X3141 77
#  12X3151 74.5
#  12X3152 80.5
#  12X3159 0
#  12X3164 0
#  12X3167 70
#  12X3305 80
#  12X3315 68
#  12X3326 0
#  12X3326 78
#  12X3328 83
#  12X3329 71.5
#  12X3333 0
#  12X3334 85
#  12X3336 78
#  12X3338 88
#  12X3339 79.5
#  12X3342 88.5
#  12X3345 73.5
#  12X3346 84.5
#  12X3347 81.5
#  12X3353 90.5
#  12X3359 83
#  12X3362 70.5
#  12X3365 82.5
#  12X3368 78
#  12X3372 72.5
#  12X3379 84.5
#  12X3383 88.5
#  12X3384 68
#  12X3387 86.5
#  12X3390 78
#  12X3399 78
#  12X3400 74.5
#  12X3403 87
#  12X3404 79
#  12X3407 64.5
#  12X3604 67.5
#  12X3608 85.5
#  12X3619 75
#  12X3621 61.5
#  12X3628 89
#  12X3703 89
#  12X3707 61
#  12X3708 88
#  12X3731 95
#  12X3733 78
#  12X3739 87
#  12X3807 0
#  12X3809 63.5
#  12X3813 81.5
#  12X3814 0
#  12X3832 89
#  12X3838 82
#  12X3909 85
#  12X3918 87.5
#  12X3920 60
#  12X3922 73.5
#  12X3923 62.5
#  

'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み、A+〜Dの成績評価を行い、1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して表示する' :-
        'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1),
        'A+〜Dの成績評価を行い'(LL1,LL2),
        '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布),
        表示する(_全履修者の平均,_評価の分布).

'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1) :-
        get_split_lines('score.txt',[' '],LL1).

'A+〜Dの成績評価を行い'([],[]).
'A+〜Dの成績評価を行い'([[_学籍番号,_履修者の点数]|R1],[[_学籍番号,_履修者の点数,_評価]|R2]) :-
        評価表(_履修者の点数,_評価),
        'A+〜Dの成績評価を行い'(R1,R2).

評価表(_履修者の点数,'A+') :-
        _履修者の点数 >= 90.0.
評価表(_履修者の点数,'A+') :-
        _履修者の点数 >= 80.0,
        _履修者の点数 < 90.0.
評価表(_履修者の点数,'A') :-
        _履修者の点数 >= 80.0,
        _履修者の点数 < 90.0.
評価表(_履修者の点数,'B') :-
        _履修者の点数 >= 70.0,
        _履修者の点数 < 80.0.
評価表(_履修者の点数,'C') :-
        _履修者の点数 >= 60.0,
        _履修者の点数 < 70.0.
評価表(_履修者の点数,'D') :-
        _履修者の点数 < 60.0.

'1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布) :-
        全履修者の平均点(LL2,_全履修者の平均),
        評価の分布(LL2,_評価の分布),

全履修者の平均点(LL2,_全履修者の平均) :-
        findavg(_履修者の試験の点数,(
                    append(_,[[_,_履修者の試験の点数,_]|_],LL2)),
                _全履修者の平均).

評価の分布(LL2,[_Ap,_A,_B,_C,_D]) :-
        評価の分布(LL2,[[],[],[],[],[]],_Ap,_A,_B,_C,_D).

評価の分布([],[L1,L2,L3,L4,L5],_評価の分布) :-
        ならびの要素数を整数に変換([L1,L2,L3,L4,L5],_評価の分布),!.
評価の分布([[_,_,_評価]|R1],[L1,L2,L3,L4,L5],_評価の分布) :-
        分布に加算(_評価,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2),
        評価の分布(R1,[L1_2,L2_2,L3_2,L4_2,L5_2],_評価の分布).

ならびの要素数を整数に変換([],[]).
ならびの要素数を整数に変換([L|R1],[Len|R2]) :-
        length(L,Len),
        ならびの要素数を整数に変換(R1,R2).

分布に加算('A+',L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5).
分布に加算('A',L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5).
分布に加算('B',L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5).
分布に加算('C',L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5).
分布に加算('D',L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]).

表示する(_全履修者の平均,_評価の分布) :-
        writef('全履修者の平均は %t です\n評価の分布\n',[_全履修者の平均]),
        評価と分布数(_評価の分布,_評価,_評価の分布数,R),
        writef('%4r, %4r\n',[_評価,_評価の分布数]),
        R = [].

評価と分布数(_評価の分布,_評価,_評価の分布数,R) :-
        append(L0,[_評価|R],['A+','A','B','C','D']),
        length(L0,Len),
        length(L0_1,Len),
        append(L0_1,[_評価の分布数|_],_評価の分布).