このディレクトリの索引

# 出典 :: ★★ Java の宿題ここで答えます Part 68 ★★ #602 # 【 課題 】複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示せよ。 % 教科名が存在しないということは得点は列挙する他ない。 '複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示する' :- '複数人の名前を入力してから3教科の点数を全員分入力し、'(_名前ならび,_全員分の名前_3教科の得点ならび), '各教科の平均点と、最高点と取った人の名前を表示する'(_全員分の名前_3教科の得点ならび). '複数人の名前を入力してから3教科の点数を全員分入力し、'(_名前ならび,_全員分の名前_3教科の得点ならび) :- 複数人の名前を入力(_名前ならび), writef('%w\n',[_名前ならび]), '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前_3教科の得点ならび). 複数人の名前を入力(_名前ならび) :- findall(_行,( repeat,(at_end_of_stream(current_input),!,fail; 行入力(_行))),_名前ならび). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前_3教科の得点ならび) :- findall([_名前,_1,_2,_3],( member(_名前,_名前ならび), (at_end_of_stream(current_input),!,fail; readln([_1,_2,_3]))),_全員分の名前_3教科の得点ならび). '各教科の平均点と、最高点と取った人の名前を表示する'(_名前_3教科の得点ならび) :- '各教科の平均点と、最高点と取った人の名前を'(_名前_3教科の得点ならび,_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび), 表示する(_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび). '各教科の平均点と、最高点と取った人の名前を'(_名前_3教科の得点ならび,_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび) :- length(_名前_3教科の得点ならび,_人数), 各教科の平均点ならびを得る(_名前_3教科の得点ならび,_人数,_各教科の平均点ならび), 各教科の最高点と最高点の名前ならび(_名前_3教科の得点ならび,_各教科の最高点と最高点の名前ならび). 各教科の平均点ならびを得る(_名前_3教科の得点ならび,_人数,_各教科の平均点ならび) :- 各教科の合計点ならび(_名前_3教科の得点ならび,_各教科の合計点ならび), 各教科の平均点ならび(_各教科の合計点ならび,_人数,_各教科の平均点ならび). 各教科の合計点ならび(_名前_3教科の得点ならび,_各教科の合計点ならび) :- '名前を外して、3教科得点ならびを作る'(_名前_3教科の得点ならび,_3教科得点ならび), '転置した上で、行ごとの合計を取り、各教科の合計ならびを得る'(_3教科得点ならび,_各教科の合計点ならび). '名前を外して、3教科得点ならびを作る'(_名前_3教科の得点ならび,_3教科得点ならび) :- findall([1,2,3],( member([_,_1,_2,_3],_名前_3教科の得点ならび),_3教科得点ならび). '転置した上で、行ごとの合計を取り、各教科の合計ならびを得る'(_3教科得点ならび,_各教科の合計点ならび) :- 転置(_3教科得点ならび,_転置した3教科得点ならび), '行ごとの合計を取り、各教科の合計ならびを得る'(_転置した3教科得点ならび,_各教科の合計点ならび). '行ごとの合計を取り、各教科の合計ならびを得る'(_転置した3教科得点ならび,_各教科の合計点ならび) :- findall(_教科の合計得点,( 教科の合計得点(_転置した3教科得点ならび,_教科の合計得点)),_各教科の合計点ならび). 教科の合計得点(_転置した3教科得点ならび,_教科の合計得点) :- member(_教科の得点ならび,_転置した3教科得点ならび), sum_list(_教科の得点ならび,_教科の合計得点). 各教科の平均点ならび(_各教科の合計点ならび,_人数,_各教科の平均点ならび) :- findall(_平均,( member(_点数,_各教科の合計点ならび), _平均 is _点数 / _人数),_各教科の平均点ならび). 各教科の最高点と最高点の名前ならび(LL1,_各教科の最高点と最高点の名前ならび) :- 転置(LL1,[_名前ならび|[L1,L2,L3]]), 各教科の最高点と最高点の名前を得る(_名前ならび,L1,L2,L3,_各教科の最高点と最高点の名前ならび). 各教科の最高点と最高点の名前を得る(_名前ならび,L1,L2,L3,[[_1の最高点,_1の最高点の名前],[_2の最高点,_2の最高点の名前],[_3の最高点,_3の最高点の名前]]) :- 最高点(_名前ならび,L1,_1の最高点,_1の最高点の名前), 最高点(_名前ならび,L2,_2の最高点,_2の最高点の名前), 最高点(_名前ならび,L3,_3の最高点,_3の最高点の名前). 最高点(_名前ならび,_点数ならび,_最高点,_最高点の名前) :- nth1(_nth1,_点数ならび,_最高点), 最高点より高得点のものはいない(_点数ならび,_最高点), nth1(_nth1,_名前ならび,_最高点の名前). 最高点より高得点のものはいない(_点数ならび,_最高点) :- forall(member(A,_点数ならび),A =< _最高点). writef('教科 %w の平均点は%w点、最高点は%w点、最高得点者は%wです。\n',[N,_平均点,_最高点,_最高点者]), succ(N,N_2), 表示する(N_2,R1,R2). 表示する(_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび) :- forall( '何番目に入力した教科であるか。その教科の平均点、最高点、最高点者を得る'(_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび,_何番目,_平均点,_最高点,_最高点者), writef('教科 %w の平均点は%w点、最高点は%w点、最高得点者は%wです。\n',[_何番目,_平均点,_最高点,_最高点者])). '何番目に入力した教科であるか。その教科の平均点、最高点、最高点者を得る'(_各教科の平均点ならび,_各教科の最高点と最高点の名前ならび,_何番目,_平均点,_最高点,_最高点者) :- nth1(_何番目,_各教科の平均点ならび,_平均点), nth1(_何番目,_各教科の最高点と最高点の名前ならび,[_最高点,_最高点者]). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2) . 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4).