このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/54
#  {1] 授業単元:プログラミング演習 
#  [2] 問題文: 
#  http://ime.nu/codepad.org/Q5HCQPvq 
#  上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ 
#  a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 
#  但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 
#  このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 
#  
#  #include 
#  
#  int main(void)
#  {
#   int a1[5] = {50, 80, 20, 30, 10};
#   int b1[5] = {20, 40, 30, 20, 50};
#   int *p[2];
#   int i;
#   int ave;
#  
#   p[0] = a1;
#   p[1] = b1;
#   for (i=0; i<5; i++)
#   {
#    ave = (*(p[0]+i) + *(p[1]+i)) /2;
#    printf("%d = %d\n", i, ave);
#   }
#   return 0;
#  }


課題の文字列('a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。').

'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :-
         課題の文字列(_文字列),
         split(_文字列,[';','[5]=','{','}'],L),
         定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R),
         得点を定義する(_君,[英語,数学,国語,理科,社会],[_英語,_数学,_国語,_理科,_社会]),
         R = [].

定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R) :-
         append(Ln,[_君,_英語,_数学,_国語,_理科,_社会|R],L),
         length(Ln,Len),
         0 is Len mod 6.

得点を定義する(_,[],[]).
得点を定義する(_君,[_科目|R1],[_得点|R2]) :-
        assertz(得点(_君,_科目,_得点)),
        得点を定義する(_君,R1,R2).

教科別の3人の平均点を求める(_科目,_相加平均) :-
        教科別の3人の平均点を求める(_科目別相加平均ならび),
        member([_科目,_相加平均],_科目別相加平均ならび).

教科別の3人の平均点を求める(_科目別相加平均ならび) :-
        finsetof(_科目,(
                    得点(_,_科目,_)),
                 _教科ならび),

        findall([_科目,_相加平均],(
                    member(_科目,_教科ならび),
                    findavg(_得点,(
                                得点(_,_科目,_得点)),
                             _相加平均)),
                _科目別相加平均ならび).