このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/28
#  以下の問題が分かりませんので、教えて頂けたら助かります。 
#   
#  [1] 授業単元:C言語 
#   
#  [2] 問題文: 
#  http://ime.nu/codepad.org/hPrPD1Dw 
#  文字制限で入れれなかったため、上記のリンクで問題文を書きました。 
#  ファイル形式は無視してください。 
#   
#  [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。
#  今回はそれぞれの科目の期末テストが合格か否かを判定したい。
#  つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する
#  名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると
#  構造体が煩雑になって見た目にわかりにくくなることは否めない。
#  そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。
#  すなわち、構造体をもう1つ用意して
#  
#  struct each_score {
#       ???  ???;   //点数
#       ???  ???;    //合格・不合格
#  };
#  
#  struct SEISEKI {
#      char name[50];
#      struct each_score  kokugo;
#      struct each_score  sugaku;
#  };
#  
#  としてみよう。
#  見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。
#  しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが
#  点数のみならず、合格・不合格の情報を格納できるというわけである。
#  
#  struct each_score の「??? ???」部分を補った上で、
#  それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、
#  合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を
#  代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを
#  格納するデータ構造は、配列を利用して次のように定義できる。
#  
#  struct SEISEKI score[3];
#  
#  ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数
#  void check_score(int borderline,  struct SEISEKI *a)  /* 引数aの前に'*'が付いていることに注意されたい */
#  を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。
#  但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい)
#  
#  また、結果の表示を行うために、前回の課題同様に表示用の関数
#  void print_score(struct SEISEKI a);
#  を作りなおして、使用するように。今回は合格・不合格も表示する。
#  
#  ただし、答えの入力は前回と全く同じで、
#  ex. 入力例:
#  yamauchi 60 70 yamada 30 90 tougou 70 80
#  
#  表示はつぎのフォーマットで行うようにせよ。
#  最終出力の例:
#  name: yamauchi
#  kokugo  60 : accept
#  sugaku  70 : accept
#  name: yamada
#  kokugo 30 : rejection
#  sugaku 90 : accept
#  name: tougou
#  kokugo 70 : accept
#  sugaku 80 : accept

国語合否閾値(73).

数学合否閾値(80).

'国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :-
        abolish(テスト成績/5),
        国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数),
        合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定),
        '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定),
        _残り人数 = 0.

国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :-
        length(L,_入力する人数),
        append(Ln,[_|R],L),
        length(Ln,_何番目),
        氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数),
        length(R,_残り人数).

氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :-
        writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]),
        get_line(_氏名),
        国語点数の入力(_国語点数),
        数学点数の入力(_数学点数).

国語点数の入力(_国語点数) :-
        get_line(Line),
        国語点数の入力診断(Line,_国語点数),!.
国語点数の入力(_国語点数) :-
        国語点数の入力(_国語点数).

国語点数の入力診断(Line,_国語点数) :-
        atom_to_term(Line,_国語点数,_),
        integer(_国語点数),
        _国語点数 >= 0,
        _国語点数 =< 100,!.
国語点数の入力診断(Line,_国語点数) :-
        再入力指示(Line,国語).

数学点数の入力(_数学点数) :-
        get_line(Line),
        数学点数の入力診断(Line,_数学点数),!.
数学点数の入力(_数学点数) :-
        数学点数の入力(_数学点数).

数学点数の入力診断(Line,_数学点数) :-
        atom_to_term(Line,_数学点数,_),
        integer(_数学点数),
        _数学点数 >= 0,
        _数学点数 =< 100,!.
数学点数の入力診断(Line,_数学点数) :-
        再入力指示(Line,数学).

再入力指示(Line,_科目) :-
        writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]),
        fail.

合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :-
        国語が合格か否かを判定する(_国語点数,_国語の判定),
        数学が合格か否かを判定する(_数学点数,_数学の判定).

国語が合格か否かを判定する(_国語点数,合格) :-
        国語合否閾値(_下限値),
        _国語点数 >= _下限値,!.
国語が合格か否かを判定する(_国語点数,不合格).

数学が合格か否かを判定する(_数学点数,合格) :-
        数学合否閾値(_下限値),
        _数学点数 >= _下限値,!.
数学が合格か否かを判定する(_数学点数,不合格).

'氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :-
        assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)),
        assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)).