このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/707
#  [1] 授業単元: C言語プログラミング 
#  [2] 問題文(含コード&リンク): 
#  名前(char name[20])と点数(int score)からなる構造体の配列を作る. 
#  件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, 
#  点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. 
#  なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). 
#   
#  実行例 
#  $./kadai 
#  n? 5 
#  name score? taro 52 
#  name score? jiro 84 
#  name score? saburo 38 
#  name score? hanako 63 
#  name score? youko 72 
#  Average:61 
#  Above average:jiro hanako youko 
#   
#  ヒント 
#  struct student { 
#    char name[20]; 
#    int score; 
#  } student; 
#   
#  scanf("%s %d",student.name, &student.score);  
#   

'件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :-
        '件数(10以下)をキーボード入力'(_件数),
        'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数,_名前と点数構造ならび),
        '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび).

'件数(10以下)をキーボード入力'(_件数) :-
        催促付き整数入力('件数を入力して下さい(10以下) : ',_件数),
        _件数 =< 10,!.
'件数(10以下)をキーボード入力'(_件数) :-
        '件数(10以下)をキーボード入力'(_件数).

'その件数だけ名前と点数をキーボード入力して配列に格納し'(0,[]) :- !.
'その件数だけ名前と点数をキーボード入力して配列に格納し'(N,[(名前(_名前),点数(_点数))|R]) :-
        名前と点数の入力(_名前,_点数),
        N_1 is N - 1,
        'その件数だけ名前と点数をキーボード入力して配列に格納し'(N_1,R).

名前と点数の入力(_名前,_点数) :-
        write('名前と点数をカンマ区切りて入力して下さい : '),
        readln(L),
        名前と点数の入力(L,_名前,_点数),!.
名前と点数の入力(_名前,_点数) :-
        名前と点数の入力(_名前,_点数).

名前と点数の入力([_名前,_点数],_名前,_点数) :- !.
名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :-
        concat_atom([_名前1,_名前2],' ',_名前).
名前と点数の入力(L,_,_) :-
        writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]),
        fail.

'点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび) :-
        点数の平均点(_名前と点数構造ならび,_平均点),
        writef('平均点は %t です\n',[_平均点]),
        平均点以上の学生の名前を表示する(_平均点,_名前と点数構造ならび),

平均点以上の学生の名前を表示する(_,[]).
平均点以上の学生の名前を表示する(_平均点,[(名前(_名前),点数(_点数))|R]) :-
        _点数 >= _平均点,
        writef('平均点%t以上の生徒: %t\n',[_平均点,_名前]),
        平均点以上の学生を表示する(_平均点,R).
平均点以上の学生の名前を表示する(_平均点,[_|R]) :-
        平均点以上の学生の名前を表示する(_平均点,R).

点数の平均点(_名前と点数構造ならび,_平均点) :-
        length(_名前と点数構造ならび,_標本数),
        点数の合計(_名前と点数構造ならび,_合計),
        _平均点 is _合計 / _標本数.

点数の合計([],0).
点数の合計([(名前(_),点数(_点数))|R],_点数合計) :-
        点数の合計(R,_点数合計_1),
        _点数合計 is _点数 + _点数合計_1.