このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1322562648/625
#  [1] 授業単元:アルゴリズム(構造体) 
#  [2] 問題文(含コード&リンク):メンバとして学籍番号("C0110999"のような文字列) ,5 科目の点数(int 型整数の配列) ,平均点(double 型)をもつ構造体score を宣言し,score 型 
#  構造体へのポインタsc を引数としてメンバの値を設定する関数void set_score_and_calc_ave(struct score *sc)を作成しプログラムを完成させよ。 
#   ただし,構造体score と関数set_score_and_calc_ave については以下の要件を満たようにせよ。 
#    [以下の要件] 
#   ・構造体の宣言において,5 科目の点数のメンバは5つのメンバを用意するのではなく,1 つのint 型配列とすること。 
#   ・平均点のメンバについては,入力された5 科目の点数から関数set_score_and_calc_ave 内で平均点を計算して設定すること 
#   ・関数set_score_and_calc_ave 内で,ユーザに学籍番号と5 科目の点数を入力させること.その際,0〜100 の範囲の点数が入力されたかどうかのチェックも行わせる。 
#      以下の実行例のように関数の動作を確認できるmain関数も作成せよ 
#  [実行例]: 
y#      学籍番号を入力してください:A12557 
#          5 科目の点数(0〜100)を入力してください。 
#          科目1 の点数:101 
#          0 以上100 以下の点数を入力してください:-1 
#          0 以上100 以下の点数を入力してください:0 
#          科目2 の点数:100 
#          科目3 の点数:88 
#          科目4 の点数:77 
#         科目5 の点数:66 
#         データを設定しました。 
#         学籍番号:A12557 平均点:66.2 点 
#         科目1: 0 点 
#        科目2:100 点 
#        科目3: 88 点 
#        科目4: 77 点 
#        科目5: 66 点 
#      

'ユーザに学籍番号と5 科目の点数を入力させること.その際,0〜100 の範囲の点数が入力されたかどうかのチェックも行わせる。' :-
        'ユーザに学籍番号と5 科目の点数を入力させること'(_学籍番号,_5科目の点数),
        '平均点のメンバについては,入力された5 科目の点数から平均点を計算して設定する'(_5科目の点数,_平均点),
        成績を設定する(_学籍番号,_5科目の点数,_平均点).

成績を設定する(_学籍番号,_5科目の点数,_平均点) :-
        append([_学籍番号|_5科目の点数],[_平均点],L),
        P =.. [成績|L],
        asserta(P),
        write('データを設定しました。 \n'),
        設定内容の表示.

'ユーザに学籍番号と5 科目の点数を入力させること'(_学籍番号,_5科目の点数) :-
        ユーザに学籍番号を入力される(_学籍番号),
        '5科目の点数を入力させる'(_5科目の点数).

ユーザに学籍番号を入力される(_学籍番号) :-
        write('学籍番号を入力して下さい : '),
        get_line(_学籍番号).

'5科目の点数を入力させる'(_5科目の点数) :-
        length(_5科目の点数,5),
        write('5 科目の点数(0〜100)を入力してください。 '),
        findall(_点数,(
                    append(L0,[_点数|_],_5科目の点数),
                    '点数を入力する'(L0,_点数)),
                _5科目の点数).

点数を入力する(L0,_点数) :-
        length([_|L0],_n番目),
        write('科目%t の点数 : '),
        点数を入力する(_点数).

点数を入力する(_点数) :-
        get_integer(_点数),
        点数範囲が妥当(_点数),!.
点数を入力する(_点数) :-
        点数を入力する(_点数).

点数範囲が妥当(_点数) :-
        _点数 >= 0,
        _点数 =< 100,!.
点数範囲が妥当(_点数) :-
        write('0 以上100 以下の点数を入力してください: '),
        fail.

get_integer(_integer) :-
        get_line(Line),
        get_integer_test(Line,_integer),!.

get_integer_test(Line,_integer) :-
        atom_to_term(Line,_integer,_),
        integer(_integer).

'平均点のメンバについては,入力された5 科目の点数から平均点を計算して設定する'(_5科目の点数) :-
        相加平均(_5科目の点数,_平均点).

設定内容の表示 :-
        成績(_学籍番号,_科目1の点数,_科目2の点数,_科目3の点数,_科目5の点数,_科目5の点数,平均点),
        writef('学籍番号: %t 平均点: %t\n科目1: %3r\n科目2: %3r\n科目3 %3r\n科目4: %3r\n科目5: %3r\n',[_学籍番号,_平均点,_科目1の点数,_科目2の点数,_科目3の点数,_科目5の点数,_科目5の点数]),!.