このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/863
#  [1]授業単元:プログラミング演習 
#  [2]問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10697.txt 
#  [3] 
#    [3.1]OS:windows7 pro 64bit  
#    [3.2] 環境:visualstudio 2010 express c++、ver10,0です 
#    [3.3] 言語はCです 
#  [4]18日が期限です 
#  [5]その他制限:実行例が見やすいように一の位を揃えてください 
#  自分は三教科の点数を表示するところまではなんとか書けましたが、一の位が揃えられてないです。 
#  できれば自分のソースに付け足す形でお願いできればうれしいです 
#   
#  自分は多元的配列まで習いました 
#   
#  よろしくお願いします。 
# 
# 
# [2]問題文:10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、
# 実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示するプログラムを書け
#  点数は1~100の乱数によって与えること。
#   また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する。
#  格納し終えたのち、1次的配列の先頭から合計点を表示する。
#  一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する。
#  ソートの方法として、バブルソースを使用する
# 
# 
# <<実行例>> (seed=97の場合)
#        国語 数学 英語
#  1人目:  75   55   84
#  2人目:   3   58   90
#  3人目: 100   60   61
#  4人目:  19   39   67
#  5人目:  90   99   15
#  6人目:   5   58   59
#  7人目:  20   15   47
#  8人目:  46   12   94
#  9人目:  22   93   27
# 10人目:  90   90   35
# 
# 
# 合計点(ソート前): 214 151 221 125 204 122  82 152 142 215
# 合計点(ソート後): 221 215 214 204 152 151 142 125 122  82

'10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、実行例のように"n人目  国語の点数  数学の点数  英語の点数"を表示する'
        '10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列),
        終えたのち,
        '実行例のように"n人目  国語の点数  数学の点数  英語の点数"を表示する'(_10人の三教科の点数を二次配列),!.

'10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列) :-
        findall([_国語の点数,_数学の点数,_英語の点数],(
                    10人の,
                    '点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数)),
                _10人の三教科の点数を二次配列).

10人の :- for(1,N,10).

10人の(N) :- for(1,N,10).

終えたのち.

'点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数) :-
        'n個の範囲(1~100)の正規分布ならびを得る'(3,[_国語の点数,_数学の点数,_英語の点数]).

'n個の範囲(1~100)の正規分布ならびを得る'(_n個,_正規分布ならび) :-
        findall(Y2,(
                    for(1,_,_n個),
                    U is (random mod 100000) / 100000,
                    R is ( 2 * pi * (random mod 100000)) / 100000,
                    S is (-2) * log(1-U),
                    X is sqrt(S) * cos(R),
                    Y is sqrt(S) * sin(R),
                    Y2 is truncate(100 * (Y + pi) / (2 * pi)) + 1),
                _正規分布ならび),!.

'実行例のように"n人目  国語の点数  数学の点数  英語の点数"を表示する'(_n人目,_10人の三教科の点数を二次配列) :-
        write('          国語 数学 英語\n'),
        10人の(_n人目),
        list_nth(_n人目,_10人の三教科の点数を二次配列,[_国語の点数,_数学の点数,_英語の点数]),
        write_formatted('%2d人目   %3d %3d %3d\n',[_n人目,_国語の点数,_数学の点数,_英語の点数]),
        _n人目 = 10,!.

'10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、実行例のように"n人目  国語の点数  数学の点数  英語の点数"を表示する'
        '10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列),
        終えたのち,
        また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する(_10人の三教科の点数を二次配列,_合計点ならび),
        一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する(_合計点ならび).

また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する([],[]) :- !.
また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する([[A,B,C]|R1],[S|R2]) :-
        S is A + B + C,
        また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する(R1,R2).

一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する(_合計点ならび) :-
        降順バブルソート(_合計点ならび,_降順合計点ならび),
        先頭から合計点を表示する(1,_降順合計点ならび).

先頭から合計点を表示する(_,[]) :- !.
先頭から合計点を表示する(N,[S|R]) :-
        write_formatted('%2d人目: %t点\n',[N,S]),
        N2 is N + 1,
        先頭から合計点を表示する(N2,R).

降順バブルソート(L1,L2) :- 降順バブルソート(L1,[],L2).

降順バブルソート([],L,L) :- !.
降順バブルソート([A|R1],L1,L) :- 降順バブルソート(A,R1,R2,L1,L2),降順バブルソート(R2,L2,L).
        
降順バブルソート(A,[],[],L1,[A|L1]) :- !.
降順バブルソート(A,[B|R1],[A|R2],L1,L2) :- A @>= B,降順バブルソート(B,R1,R2,L1,L2).
降順バブルソート(A,[B|R1],[B|R2],L1,L2) :- A @< B,降順バブルソート(A,R1,R2,L1,L2),!.