このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/737
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH 
#  
#  試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。
#   
#   例:
#     0001 55 66 66 77 77
#     0002 44 55 33 44 33
#     0003 33 43 53 53 53
#                  . 
#                  .
#   
#  1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。
#  なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。
#   
#  2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」
#  の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、
#  入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。
#   
#  ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、
#  ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) )
#  などを習いました

'出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録する'(_ファイル) :-
        open(_ファイル,write,Outstream),
        出席番号を標準入力から入力(_最初の出席番号),
        '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_最初の出席番号),
        close(Outstream).

'出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(_,end_of_file) :- !.
'出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_出席番号) :-
        各科目の点数を標準入力から入力(_各科目の点数ならび),
        上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび),
        出席番号を標準入力から入力(_次の出席番号),
        '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_次の出席番号).

出席番号を標準入力から入力(_出席番号) :-
        get_line(Line),
        '診断: 出席番号を標準入力から入力'(Line,_出席番号),!.

'診断: 出席番号を標準入力から入力'(Line,_出席番号) :-
        write('出席番号を入力してください(終了する時はend_of_file) : '),
        atom_to_term(Line,_出席番号整数,_),
        integer(_出席番号整数),
        頭部零文字列(4,_出席番号整数,_出席番号),!.        
'診断: 出席番号を標準入力から入力'(_,end_of_file).

各科目の点数を標準入力から入力(_各科目の点数ならび) :-
        findall(_点数,(
                    member(_科目,[体育,美術,英語,数学,社会]),
                    整数を得る(_科目,(_点数>=0,_点数=<100),_点数)),
                _各科目の点数ならび).

上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび) :-
        atomic_list_concat([_出席番号|_各科目の点数ならび],' ',_表示行文字列),
        writef(Outstream,'%t\n',[_表示行文字列]).