このディレクトリの索引

# 出典 :: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) このサイトは現在ない # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), once(成績データを得る(_成績ならび)). 成績データを得る(_成績ならび) :- findnsols(100,[_学籍番号,_成績],( 連続した行入力(_行), (行入力終了条件(_行),!,fail;split(_行,[' '],[_学籍番号,_成績]))),_成績ならび). 連続した行入力(_行) :- repeat, 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力終了条件('0 0'). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). split(_文字列,_区切り記号ならび,L) :- split_2(0,_文字列,_区切り記号ならび,L),!. sPLIT(_文字列,_区切り記号ならび,L) :- split_2(1,_文字列,_区切り記号ならび,L),!. 'SPLIT'(_文字列,_区切り記号ならび,L) :- split_2(2,_文字列,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 副文字列(_文字列,_前文字列,_区切り記号,_後文字列), member(_区切り記号,_区切り記号ならび), 'split_3'(N,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,L). 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび), 末尾に区切り記号が来た場合を配慮すると(N,_文字列,_区切り記号,_区切り記号ならび,L). 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび) :- forall(副文字列(_文字列,_前文字列,_区切り記号,_後文字列),\+(member(_区切り記号,_区切り記号ならび))). 末尾に区切り記号が来た場合を配慮すると(0,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(1,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(_,_文字列,_区切り記号,_区切り記号ならび,[_文字列]). 'split_3'(0,_区切り記号ならび,'',_区切り記号,_後文字列,L) :- 'split'(_後文字列,_区切り記号ならび,L),!. 'split_3'(0,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列|R]) :- 'split'(_後文字列,_区切り記号ならび,R). 'split_3'(1,_区切り記号ならび,'',_区切り記号,_後文字列,[_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R),!. 'split_3'(1,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R). 'split_3'(2,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'SPLIT'(_後文字列,_区切り記号ならび,R). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列).