このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/243
#  [1] 授業単元: 3DGAME 
#  [2] 問題文:下記  
# 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り) 
# 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。 
# ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。 
# ・ 氏名で昇順、降順に並び替えてファイルに出力する。 
# ・ 点数で昇順、降順に並び替えてファイルに出力する。 
# ・ 各項目について修正を行えるようにする。 
# ・ 点数の平均を画面に出力する。 
# ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。 
# 
# 【画面例】 
# <メニュー> 
# 1 学生番号で並び替え  2.氏名で並び替え 
# 3.点数で並び替え  4.修正 
# 5.平均の出力   6.クラス別で出力 
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 
# メニュー番号=>  
# 【データ】 
# 学生番号 8桁   
# 氏名  12桁  
# カナ  12桁 
# 点数   3桁(小数点第1まで)  
# クラス  3桁 
# 12000001, 田中太郎, タナカタロウ, 40.5, 003 

'学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)'(_出力ファイル) :-
      open(_出力ファイル,append,Output),
      '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス),
      write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]),
      close(Output),!.

'学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス):-
      write('ガイドに従って入力し改行してください\n学生番号 : '),get_line(_学生番号),
      write('氏名 : '),get_line(_氏名),
      write('カナ : '),get_line(_カナ),
      write('点数(少数第一位まで) : '),get_line(_点数文字列),
      atom_to_term(_点数文字列,_点数,_),
      write('クラス(3桁) : '),get_line(クラス),!. 

メニューに示された機能を選択して実行するパターン(_ファイル名) :-
      get_split_lines(_ファイル名,[','],L),
      メニューに示された機能を実行する(_ファイル名,L).

メニューに示された機能を実行する(_ファイル名,L) :-
      メニュー画面,
      write('メニュー番号=> '),
      get_integer(N),
      機能選択(_ファイル名,N,L,_診断),
      診断(_診断),!.
メニューに示された機能を実行する(_ファイル名,L) :- メニューに示された機能を実行する(_ファイル名,L).

機能選択(0,_,_,終了) :- !.
機能選択(1,_ファイル名,L,_診断) :- 学生番号で並び替え(_ファイル名,L,_診断).
機能選択(2,_ファイル名,L,_診断) :- 氏名で並び替え(_ファイル名,L,_診断).
機能選択(3,_ファイル名,L,_診断) :- 点数で並び替え(_ファイル名,L,_診断).
機能選択(4,_ファイル名,L,_診断) :- 修正(_ファイル名,L,_診断).
機能選択(5,_,L,_診断) :- 平均の出力(L,_診断),
機能選択(6,_,L,_診断) :- クラス別で出力(L,_診断).

診断(終了) :- !.

メニュー画面 :-
      write('0  終了 \n'),
      write('1  学生番号で並び替え  2.氏名で並び替え \n'),
      write('3.点数で並び替え  4.修正 \n'),
      write('5.平均の出力   6.クラス別で出力 \n'),
      write('ーーーーーーーーーーーーーーーー\n').

学生番号で並び替え(_ファイル名,L,_診断) :-
      並べ替え(_ファイル名,1,L,_診断).

点数で並び替え(_ファイル名,L,_診断) :-
      並べ替え(_ファイル名,4,L,_診断).

修正(_ファイル名,L,正常終了) :-
      write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で入力して対象レコードを指定してください : '),
      get_line(Line),
      atom_to_term(Line,[_学生番号,_氏名,_カナ,_点数,_クラス],_),
      修正(_ファイル名,[_学生番号,_氏名,_カナ,_点数,_クラス],L,L2,_),
      open(_ファイル名,write,Output),
      カンマならび出力(Output,L2),
      close(Output),!.

修正(_,L,L,打ち切り) :- !.
修正(_,[],[],_診断) :- !.
修正([_学生番号,_氏名,_カナ,_点数,_クラス],[[_学生番号,_氏名,_カナ,_点数,_クラス]|R1],[L|R2],_診断) :-
      write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で正確に入力して修正してください : '),
      get_line(Line),
      atom_to_term(Line,L,_),
      打ち切り診断(L,_診断),
      修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断),!.
修正([_学生番号,_氏名,_カナ,_点数,_クラス],[L|R1],[L|R2]_診断) :-
      修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断).

打ち切り診断([_|_],_診断) :- !.
打ち切り診断(Atom,打ち切り) :- atomic(Atom).

平均の出力(L,正常終了) :-
      findavg(_点数,(memer(L0,L),list_nth(4,L0,_点数)),_平均点),
      write_formatted('平均点は %t です\n',[_平均点]).

クラス別で出力(L,正常終了) :-
      write('クラスを指定してください : ',
      get_line(_クラス),
      findall(L0,(member(L0,L),list_nth(5,L0,_クラス)),L2),
      カンマならび出力(L2).

並べ替え(_ファイル名,N,L,正常終了).
      findall([A|L1],(member(L1,L),list_nth(N,L1,A)),L2),
      sort(L2,L3),
      open(_ファイル名,write,Output),
      カンマならび出力(Output,L2),
      close(Output),!.

カンマならび出力(Output,[]) :- !.
カンマならび出力(Output,[[_|L1]|R]) :-
      concat_atom(L1,',',S),
      write_formatted(Output,'%t\n',[S]),
      カンマならび出力(Output,R).

カンマならび出力([]) :- !.
カンマならび出力([[_|L1]|R]) :-
      concat_atom(L1,',',S),
      write_formatted('%t\n',[S]),
      カンマならび出力(R).