このディレクトリの索引

% 以下のサイトは # 出典 :: # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 :- dynamic(成績データ/2). 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)', 上位11名の選別(_上位11名の成績ならび), 上位11名を表示する(_上位11名の成績ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)' :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '),flush, length(Ln,100), 行入力(_行), 成績データを得る(Ln,_行). 成績データを得る(_,'0 0') :- !. 成績データを得る([],_). 成績データを得る([_|Ln],_行) :- '行の空白を区切り文字列として学籍番号と点数を取り出して成績データを定義して行く。点数は数に変換する。'(Ln,_行). '行の空白を区切り文字列として学籍番号と点数を取り出して成績データを定義して行く。点数は数に変換する。'(Ln,_行) :- '行の空白を区切り文字列として学籍番号と点数を取り出して行く。'(_行,_学籍番号,_点数), 成績データを定義する(_学籍番号,_点数), 行入力(_次の行), 成績データを得る(Ln,_次の行). '行の空白を区切り文字列として学籍番号と点数を取り出して行く。'(_行,_学籍番号,_点数) :- split(_行,[' '],[_学籍番号,_点数文字列]), 点数は文字列を数に変換する(_点数文字列,_点数). 点数は文字列を数に変換する(_点数文字列,_点数) :- read_term_from_atom(_点数文字列,_点数,[]). 成績データを定義する(_学籍番号,_点数) :- assertz(成績データ(_学籍番号,_点数)). 上位11名の選別(_上位11名の成績ならび) :- 成績データから降順点数ならびを得る(_降順点数ならび), 上位11名を取り出す(_降順点数ならび,_上位11名の成績ならび). 成績データから降順点数ならびを得る(_降順点数ならび) :- setof(_点数,[_学籍番号,_点数] ^ 成績データ(_学籍番号,_点数),_点数ならび), 降順に整列する(_点数ならび,_降順点数ならび). 降順に整列する(_点数ならび,_降順点数ならび) :- sort(_点数ならび,_昇順点数ならび), reverse(_昇順点数ならび,_降順点数ならび). 上位11名を取り出す(_降順点数ならび,_上位11名の成績ならび) :- findnsols(11,[_学籍番号,_点数],降順点数順に学籍番号と点数を取り出す(_降順点数ならび,_学籍番号,_点数),_上位11名の成績ならび),!. 降順点数順に学籍番号と点数を取り出す(_降順点数ならび,_学籍番号,_点数) :- member(_点数,_降順点数ならび), 成績データ(_学籍番号,_点数). 上位11名を表示する(_上位11名の成績ならび) :- forall(member([_学籍番号,_点数],_上位11名の成績ならび),writef('%w \t%w\n',[_学籍番号,_点数])). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). split(_文字列,_区切り文字列ならび,L) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), split(_前文字列,_区切り文字列ならび,_後文字列,L),!. split(_文字列,_,[_文字列]). split('',_区切り文字列ならび,_後文字列,L) :- split(_後文字列,_区切り文字列ならび,L),!. split(_前文字列,_区切り文字列ならび,_後文字列,[_前文字列|R]) :- split(_後文字列,_区切り文字列ならび,R). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: 現在はリンクが切れています (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績), '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号). '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績) :- member(_成績,_降順に整列した成績鍵ならび). '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号) :- setof(_学籍番号_1,[_学籍番号_1,_成績] ^ 成績表(_学籍番号_1,_成績),L), member(_学籍番号,L). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび) :- setof([_学籍番号,_成績],[_学籍番号,_成績] ^ 成績(_学籍番号,_成績),_学籍番号を鍵に昇順に整列した成績ならび). 上位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])). % 以下のサイトは http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の定義位置が上位のデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), 成績表(_学籍番号,_成績). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典 :: 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(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 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」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_成績順に整列した成績ならび), 上位11名の選別(_成績順に整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), 成績データを得る(1,_行,_整列鍵ならび,_成績ならび). 成績データと整列鍵を得る(_,'0 0',[],[]) :- !. 成績データと整列鍵を得る(100,_,[],[]). 成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :- split(_行,[' '],[_学籍番号,_成績]), succ(M,M_2), get_line(_行_2), 成績データと整列鍵を得る(M_2,_行_2,R1,R2). 成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :- sort(_整列鍵ならび,_整列した整列鍵ならび), 成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :- nth1(M,_成績ならび,[_学籍番号,_成績]), 成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび). 上位11名の選別(L,_上位11名ならび) :- findnsols(11,X,member(X,L),_上位11名ならび),!. 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは ?- 'a##'. http://toro.2ch.net/test/read.cgi/tech/1342966104/130 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し、 # 平均点より20点以上を S # +20点未満+10点以上をA # +10点未満平均点以上をB # 平均点未満-20点以上をC #      -20点未満を F # と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力するプログラムを作成してください。 # # '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し、平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する' :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(_学籍番号_得点ならび), '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_学籍番号_得点ならび). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(_学籍番号_得点ならび) :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'([],_学籍番号_得点ならび). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL,LL) :- at_end_of_stream(user_input),!. '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL) :- 整数を得る('学籍番号(数字1〜10)',(_学籍番号>=1,_学籍番号=<10),_学籍番号), \+(member([_学籍番号,_],LL_1)), 整数を得る(得点を得る,(_得点>=0,_得点=<100),_得点), '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'([[_学籍番号,_得点]|LL_1],LL). '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL) :- '学籍番号(数字1〜10)と、それぞれの学籍番号ごとの得点を入力し'(LL_1,LL). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_学籍番号_得点ならび) :- 平均点を得る(_学籍番号_得点ならび,_平均点), member(_評価,['S','A','B','C','F']), member([_学籍番号,_得点],_学籍番号_得点ならび), '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,_評価), writef('評価: %t, 学籍番号: %t 得点: %t\n',[_評価,_学籍番号,_得点]), fail. '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し、学籍番号とその得点をS〜Fの評価によって分けて出力する'(_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'S') :- '平均点より20点以上をS'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'A') :- '+20点未満+10点以上をA'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'B') :- '+10点未満平均点以上をB'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'C') :- '平均点未満-20点以上をC'(_得点,_平均点,_). '平均点より20点以上をS +20点未満+10点以上をA +10点未満平均点以上をB 平均点未満-20点以上をC -20点未満をF と評価し'(_得点,_平均点,'F') :- '-20点未満をF'(_得点,_平均点,_). 平均点を得る(_学籍番号_得点ならび,_平均点) :- findavg(_得点,( member([_,_得点],_学籍番号_得点ならび)), _平均点). '平均点より20点以上をS'(_得点,_平均点,'S') :- _得点 >= _平均点 + 20,!. '+20点未満+10点以上をA'(_得点,_平均点,'A') :- _得点 < _平均点 + 20, _得点 >= _平均点 + 10,!. '+10点未満平均点以上をB'(_得点,_平均点,'B') :- _得点 < _平均点 + 10, _得点 >= _平均点,!. '平均点未満-20点以上をC'(_得点,_平均点,'C') :- _得点 < _平均点, _得点 >= _平均点 - 20,!. '-20点未満をF'(_得点,_平均点,'F') :- _得点 < _平均点 - 20,!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- setof(_XX,[_XX,_番号] ^ ( 成績(_XX,番号,_番号)),_XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)),_合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/526 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):このスレの../test/read.cgi/tech/1325685876/464と同じ質問ですhttp://ime.nu/2ch.ac.la/read.php/tech/1201083176/ # # 「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、 # それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を # 画面に出力するプログラムを作成せよ」という問題がでました。 '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ' :- '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび), '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび), 整列(_鍵の付加されたならび,_整列されたならび), '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび). '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび) :- length(_入力されたならび,8), findall([_氏名,_学籍番号,_身長],( append(_,[L|_],_入力されたならび), '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長)), _入力されたならび). '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長) :- 催促付き入力('氏名を入力してください : ',_氏名), 催促付き入力('学籍番号を入力してください : ',_学籍番号), 催促付き入力('身長を入力してください : ',_身長文字列), atom_to_term(_身長文字列,_身長,_). '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび) :- findall([_身長,_氏名,_学籍番号,_身長],( member([_氏名,_学籍番号,_身長],_入力されたならび)), _鍵の付加されたならび). 整列([],[]). 整列([_軸要素|R1],_整列されたならび) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), 整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), 整列(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],_整列されたならび). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @>= _軸要素, 分割(_軸要素,R1,R2,R3). '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび) :- append(_,[[_身長,_氏名,_学籍番号,_身長]|R],_整列されたならび), writef('%t, %t, %t\n',[_氏名,_学籍番号,_身長]), R = []. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1325685876/159 # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/nbsATV4X # # 課題: # ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を # 読み込み、A+〜Dの成績評価を行い、下記の項目を計算して表示するプログラムを # 作成せよ。 # # 表示項目: # 1.全履修者の平均点 # 2.評価の分布(A+〜D評価のそれぞれの人数) # # データファイルの説明: # 学籍番号と試験の点数(100点満点)が、スペース区切りで格納されている # # 要求仕様: # ファイルの行数(=履修者数)が変わっても動作するようにすること。 # ただし配列を使う場合は、履修者数の上限値は150名とする # 補足: # 1.試験の点数は、今回の場合は0.5点刻みである。fscanfなどで得点を読み込む # 際は、整数型でなく実数型(double または float)で処理する必要がある # 2.評価は、A+が90点〜100点、Aが80点以上90点未満(今回は89.5点まで)、Bが # 70点以上80点未満、Cが60点以上70点未満、Dが0点〜60点未満とする # 3.0点は未受験を表すが、今回の課題では受験して0点を取ったとみなす。 # つまり、E評価は行わない # 4.配列や構造体は、使っても使わなくてもよい # # 追加課題: # ・最終評価の平均点で、0点の者を除外して計算したものも表示 # score.txtの内容  # 12X1102 20.5 # 12X1115 85 # 12X1117 90.5 # 12X1117 75.5 # 12X1118 79.5 # 12X1120 68.5 # 12X1121 75 # 12X1303 0 # 12X1304 54.5 # 12X1309 95.5 # 12X1310 65.5 # 12X1311 78.5 # 12X1313 0 # 12X1313 40 # 12X1314 83 # 12X1315 0 # 12X1321 0 # 12X1321 81 # 12X1324 77.5 # 12X1324 90.5 # 12X1326 80 # 12X1601 56 # 12X1604 79.5 # 12X1611 68.5 # 12X1703 61 # 12X1808 0 # 12X1808 74.5 # 12X1811 68.5 # 12X1813 87 # 12X1814 85.5 # 12X1815 74.5 # 12X1816 92.5 # 12X1901 82 # 12X1903 88.5 # 12X1906 91 # 12X1911 84.5 # 12X1912 93.5 # 12X1913 86.5 # 12X1916 73.5 # 12X3117 82 # 12X3118 65.5 # 12X3123 0 # 12X3141 77 # 12X3151 74.5 # 12X3152 80.5 # 12X3159 0 # 12X3164 0 # 12X3167 70 # 12X3305 80 # 12X3315 68 # 12X3326 0 # 12X3326 78 # 12X3328 83 # 12X3329 71.5 # 12X3333 0 # 12X3334 85 # 12X3336 78 # 12X3338 88 # 12X3339 79.5 # 12X3342 88.5 # 12X3345 73.5 # 12X3346 84.5 # 12X3347 81.5 # 12X3353 90.5 # 12X3359 83 # 12X3362 70.5 # 12X3365 82.5 # 12X3368 78 # 12X3372 72.5 # 12X3379 84.5 # 12X3383 88.5 # 12X3384 68 # 12X3387 86.5 # 12X3390 78 # 12X3399 78 # 12X3400 74.5 # 12X3403 87 # 12X3404 79 # 12X3407 64.5 # 12X3604 67.5 # 12X3608 85.5 # 12X3619 75 # 12X3621 61.5 # 12X3628 89 # 12X3703 89 # 12X3707 61 # 12X3708 88 # 12X3731 95 # 12X3733 78 # 12X3739 87 # 12X3807 0 # 12X3809 63.5 # 12X3813 81.5 # 12X3814 0 # 12X3832 89 # 12X3838 82 # 12X3909 85 # 12X3918 87.5 # 12X3920 60 # 12X3922 73.5 # 12X3923 62.5 # 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み、A+〜Dの成績評価を行い、1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して表示する' :- 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1), 'A+〜Dの成績評価を行い'(LL1,LL2), '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布), 表示する(_全履修者の平均,_評価の分布). 'ある授業の、約100人の履修者の試験の点数を収めたデータファイル(score.txt)を読み込み'(LL1) :- get_split_lines('score.txt',[' '],LL1). 'A+〜Dの成績評価を行い'([],[]). 'A+〜Dの成績評価を行い'([[_学籍番号,_履修者の点数]|R1],[[_学籍番号,_履修者の点数,_評価]|R2]) :- 評価表(_履修者の点数,_評価), 'A+〜Dの成績評価を行い'(R1,R2). 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 90.0. 評価表(_履修者の点数,'A+') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'A') :- _履修者の点数 >= 80.0, _履修者の点数 < 90.0. 評価表(_履修者の点数,'B') :- _履修者の点数 >= 70.0, _履修者の点数 < 80.0. 評価表(_履修者の点数,'C') :- _履修者の点数 >= 60.0, _履修者の点数 < 70.0. 評価表(_履修者の点数,'D') :- _履修者の点数 < 60.0. '1.全履修者の平均点 2.評価の分布(A+〜D評価のそれぞれの人数)を計算して'(LL2,_全履修者の平均,_評価の分布) :- 全履修者の平均点(LL2,_全履修者の平均), 評価の分布(LL2,_評価の分布), 全履修者の平均点(LL2,_全履修者の平均) :- findavg(_履修者の試験の点数,( append(_,[[_,_履修者の試験の点数,_]|_],LL2)), _全履修者の平均). 評価の分布(LL2,[_Ap,_A,_B,_C,_D]) :- 評価の分布(LL2,[[],[],[],[],[]],_Ap,_A,_B,_C,_D). 評価の分布([],[L1,L2,L3,L4,L5],_評価の分布) :- ならびの要素数を整数に変換([L1,L2,L3,L4,L5],_評価の分布),!. 評価の分布([[_,_,_評価]|R1],[L1,L2,L3,L4,L5],_評価の分布) :- 分布に加算(_評価,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 評価の分布(R1,[L1_2,L2_2,L3_2,L4_2,L5_2],_評価の分布). ならびの要素数を整数に変換([],[]). ならびの要素数を整数に変換([L|R1],[Len|R2]) :- length(L,Len), ならびの要素数を整数に変換(R1,R2). 分布に加算('A+',L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布に加算('A',L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布に加算('B',L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布に加算('C',L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布に加算('D',L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 表示する(_全履修者の平均,_評価の分布) :- writef('全履修者の平均は %t です\n評価の分布\n',[_全履修者の平均]), 評価と分布数(_評価の分布,_評価,_評価の分布数,R), writef('%4r, %4r\n',[_評価,_評価の分布数]), R = []. 評価と分布数(_評価の分布,_評価,_評価の分布数,R) :- append(L0,[_評価|R],['A+','A','B','C','D']), length(L0,Len), length(L0_1,Len), append(L0_1,[_評価の分布数|_],_評価の分布). % 以下のサイトは 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の点数]),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- write('\n'), 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点), write('\n学生平均 ::::\n'), 各学生の平均点を表示する(_各学生の平均点ならび), write('\n科目平均 ::::\n'), 各科目の平均点を表示する(_各科目の平均点). 各学生の平均点([],[]). 各学生の平均点([[_学籍番号|L]|R1],[[_学籍番号,_平均点]|R2]) :- 相加平均(L,_平均点), 各学生の平均点(R1,R2). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), 転置された点数ならびから科目別平均点を得る(_科目名ならび,_科目別点数ならび,_各科目の平均点). 転置された点数ならびから科目別平均点を得る([],[],[]). 転置された点数ならびから科目別平均点を得る([_科目名|R1],[L|R2],[[_科目名,_平均点]|R3]) :- 相加平均(L,_平均点), 転置された点数ならびから科目別平均点を得る(R1,R2,R3). 各学生の平均点を表示する([]). 各学生の平均点を表示する([[_学籍番号,_平均点]|R]) :- writef('%8r : %5r\n',[_学籍番号,_平均点]), 各学生の平均点を表示する(R). 各科目の平均点を表示する([]). 各科目の平均点を表示する([[_科目名,_平均点]|R]) :- writef('8r : %5r\n',[_科目名,_平均点]), 各科目の平均点を表示する(R). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # '住所録に登録されているすべての個人データを表示するものとする。未使用領域も表示する' :- 住所録(名前,_名前ならび), 住所録(住所,_住所ならび), 住所録(電話番号,_電話番号ならび), 住所録(名前,_学籍番号ならび), 全ての個人データを表示する(_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび). 全ての個人データを表示する(_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび) :- 転置([_名前ならび,_住所ならび,_電話番号ならび,_学籍番号ならび],_転置された個人データならび), append(_,[[_名前,_住所,_電話番号,_学籍番号]|R],_転置された個人データならび), writef('名前 : %t\n住所 : %t\n電話番号 : %t\n学籍番号 : %t\n\n',[_名前,_住所,_電話番号,_学籍番号]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 引数で指定されたデータ項目を住所録から検索する関数(_データ項目,_名前,_住所,_電話番号,_学籍番号) :- 登録位置を得る(_データ項目,_n番目), 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号). 登録位置を得る(_データ項目,_n番目) :- 住所録(名前,_名前ならび), append(L0,[_名前|_],_名前ならび), sub_atom(_名前,_,_,_,_データ項目), length([_|L0],_n番目). 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号) :- n番目の名前(_n番目,_名前), n番目の住所(_n番目,_住所), n番目の電話番号(_n番目,_電話番号), n番目の学籍番号(_n番目,_学籍番号). n番目の名前(_n番目,_名前) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_名前). n番目の電話番号(_n番目,_電話番号) :- 電話番号録(名前,_電話番号ならび), nth1(_n番目,_電話番号ならび,_電話番号). n番目の学籍番号(_n番目,_学籍番号) :- 学籍番号録(名前,_学籍番号ならび), nth1(_n番目,_学籍番号ならび,_学籍番号). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # '引数で指定されたデータ項目と合致する個人データを住所録から削除する'(_データ項目) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_データ項目), 各項目を住所録から削除する(_n番目). 各項目を住所録から削除する(_n番目) :- 名前を削除する(_n番目,_名前ならび,_削除された名前ならび), 住所を削除する(_n番目,_住所ならび,_削除された住所ならび), 電話番号を削除する(_n番目,_電話番号ならび,_削除された電話番号ならび), 学籍番号を削除する(_n番目,_学籍番号ならび,_削除された学籍番号ならび). 名前を削除する(_n番目,_名前ならび) :- retract(住所録(名前,_名前ならび)), n番目の文字項目を削除(_n番目,_名前ならび,_削除された名前ならび), assertz(住所録(名前,_削除された名前ならび)). 住所を削除する(_n番目,_住所ならび) :- retract(住所録(住所,_住所ならび)), n番目の文字項目を削除(_n番目,_住所ならび,_削除された住所ならび), assertz(住所録(住所,_削除された住所ならび)). 電話番号を削除する(_n番目,_電話番号ならび) :- retract(住所録(電話番号,_電話番号ならび)), n番目の文字項目を削除(_n番目,_電話番号ならび,_削除された電話番号ならび), assertz(住所録(電話番号,_削除された電話番号ならび)). 学籍番号を削除する(_n番目,_学籍番号ならび) :- retract(住所録(学籍番号,_学籍番号ならび)), n番目の数値項目を削除(_n番目,_学籍番号ならび,_削除された学籍番号ならび), assertz(住所録(学籍番号,_削除された学籍番号ならび)). n番目の文字項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[''|R],L1), append(L0,R,L2). n番目の数値項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[0|R],L1), append(L0,R,L2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 住所録に新規データの追加(_名前,_住所,_電話番号,_学籍番号) :- 住所録(名前,_名前ならび), 名前が空の位置を捜す(_名前ならび,_n番目), 各項目を置換してから登録(_n番目,_名前,_住所,_電話番号,_学籍番号),!. 名前が空の位置を捜す(_名前ならび,_n番目) :- append(L0,[''|R],_名前ならび), length([_|L0],_n番目). 各項目を置換してから登録(_n番目_名前,_住所,_電話番号,_学籍番号) :- 名前を置換してから登録(_n番目,_名前), 住所を置換してから登録(_n番目,_住所), 電話番号を置換してから登録(_n番目,_電話番号), 学籍番号を置換してから登録(_n番目,_学籍番号). 名前を置換してから登録(_n番目,_名前) :- retract(住所録(名前,_名前ならび)), length([_|L0],_n番目), append(L0,[_|R],_名前ならび), append(L0,[_名前|R],_置換された名前ならび), assertz(住所録(名前,_置換された名前ならび)). 住所を置換してから登録(_n番目,_住所) :- retract(住所録(住所,_住所ならび)), length([_|L0],_n番目), append(L0,[_|R],_住所ならび), append(L0,[_住所|R],_置換された住所ならび), assertz(住所録(住所,_置換された住所ならび)). 電話番号を置換してから登録(_n番目,_電話番号) :- retract(住所録(電話番号,_電話番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_電話番号ならび), append(L0,[_電話番号|R],_置換された電話番号ならび), assertz(住所録(電話番号,_置換された電話番号ならび)). 学籍番号を置換してから登録(_n番目,_学籍番号) :- retract(住所録(学籍番号,_学籍番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_学籍番号ならび), append(L0,[_学籍番号|R],_置換された学籍番号ならび), assertz(住所録(学籍番号,_置換された学籍番号ならび)). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # 個人データは、以下の3項目から構成されることとする。 # 1 氏名 : (アルファベット) char[256](文字列) # 2 住所 : (アルファベット) char[256](文字列) # 3 電話番号 : char[16] (文字列) # 4 学籍番号 : int # 1) 最大5名分のデータが管理できること。 # 2) 新規追加が可能であること。 # 3) 指定されたデータの削除が可能であること。削除されたデータは次の仕様に従って登録がない状態とすること。 # 4) 登録がないデータ項目は氏名、住所、電話番号については、ヌル文字列、学籍番号は0が格納されていることとする。 # 5) 上記仕様を用いて、一度削除された項目は以降の新規追加処理で再利用可能であること。 # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 個人データの初期化 :- assertz(住所録(名前,['','','','',''])), assertz(住所録(住所,['','','','',''])), assertz(住所録(電話番号,['','','','',''])), assertz(住所録(学籍番号,[0,0,0,0,0])). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/305 # ../test/read.cgi/tech/1308749241/304に加えてもう1問お願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 次に示す個人情報を構造体として作成し、 # それぞれの科目の平均点とそれぞれの学生の平均点を # 構造体のポインタを用いて求めなさい。 # 学籍番号 英語 数学 物理 # 1 81 24 63 # 2 28 15 7 # 3 89 92 88 # 4 32 88 66 # 5 92 46 81 # -1 0 0 0 # 学籍番号英語数学物理 #  [3.1] OS:windows #  [3.2] コンパイラ名とバージョン:cygwin #  [3.3] 言語: C # [4] 期限: 2011/7/6 # [5] その他の制限: # 現在ポインタを習っているところです。 # 出来るだけ簡単に書いてもらえると助かります。 # '個人情報を構造体として作成し、それぞれの科目の平均点とそれぞれの学生の平均点を構造体のポインタを用いて求める'(_科目の平均点ならび,_学生の平均点ならび) :- 個人情報を登録する, 'それぞれの科目の平均点とそれぞれの学生の平均点を求める'(_科目の平均点ならび,_学生の平均点ならび). 個人情報を登録する :- repeat, 個人情報を得る(_学籍番号,_英語,_数学,_物理), 個人情報を登録する(_学籍番号,_英語,_数学,_物理). _学籍番号 = -1,!. 個人情報を得る(_学籍番号,_英語,_数学,_物理) :- write('学籍番号 英語 数学 物理 を空白区切りで入力してください '), readln([_学籍番号,_英語,_数学,_物理]). 個人情報を登録する(-1,_,_,_) :- !. 個人情報を登録する(_学籍番号,_英語,_数学,_物理) :- assertz(個人成績(学籍番号(_学籍番号),英語(_英語),数学(_数学),物理(_物理)). 'それぞれの科目の平均点とそれぞれの学生の平均点を求める'(_科目の平均点ならび,_学生の平均点ならび) :- それぞれの科目の平均点を求める(_科目の平均点ならび), それぞれの学生の平均点を求める(_学生の平均点ならび). それぞれの科目の平均点を求める(_科目の平均点ならび) :- findall([_科目,_科目の平均点],( append(_,[_科目|R],[英語,数学,物理]), 科目の平均点(_科目,_科目の平均点)), _科目の平均点ならび). 科目の平均点(_科目,_科目平均点) :- findavg(_成績,( P =.. [科目,_成績], 個人成績(学籍番号(_),英語(_英語),数学(_数学),物理(_物理)), append(_,[P|_],[英語(_英語),数学(_数学),物理(_物理)])), _科目の平均点). それぞれの学生の平均点を求める(_学生の平均点ならび) :- findall([_学籍番号,_学生の平均点],( 個人成績(学籍番号(_),英語(_英語),数学(_数学),物理(_物理)), _学生の平均点 is (_英語 + _数学 + _物理) / 3), _学生の平均点ならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1307166756/342 # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #721 # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生年の和暦) :- 誕生年を西暦で返す(_学籍番号,_誕生年の西暦), 和暦西暦変換(_誕生年の和暦,_誕生年の西暦). 誕生年を西暦で返す(_学籍番号,_誕生年の西暦) :- 学生(_氏名,_誕生日の西暦,_学籍番号), _誕生年の西暦 is _誕生日の西暦 // 10000. 入学年度を返す(_学籍番号,_入学年度) :- _入学年度 is _学籍番号 // 10000. すべてが数字(_文字ならび) :- forall(member(_文字,_文字ならび),数字(_文字)). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('6'). 数字('8'). 数字('9'). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. 和暦西暦変換(_和暦,_西暦) :- 西暦が整数の時は西暦から和暦を得る(_和暦,_西暦). 和暦西暦変換(_和暦,_西暦) :- 和暦が文字列の時は和暦から西暦を得る(_西暦,_和暦). 西暦が整数の時は西暦から和暦を得る(_西暦,_和暦) :- 西暦が整数の時は(_西暦), 西暦から和暦を得る(_西暦,_和暦). 西暦が整数の時は(_西暦) :- integer(_西暦). 西暦から和暦を得る(_和暦,_西暦) :- 西暦から年間と年を得る(_西暦,_年間,_年), 和暦年文字列(_年間,_年,_和暦). 西暦から年間と年を得る(_西暦,_年間,_年) :- 年間(_年間,_元年,_最終年), between(_元年,_最終年,_西暦), _年 is _西暦 - _元年 + 1. 和暦が文字列の時は和暦から西暦を得る(_和暦,_西暦) :- 和暦が文字列の時は(_和暦), 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年), _西暦 is _元年 + _年 - 1. 和暦が文字列の時は(_和暦) :- atom(_和暦). 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年) :- sub_atom(_和暦,_,_,_,_年間,S2,年,L1,L2,L3), 年間(_年間,_元年,_最終年), 漢数字アラビア数字対応(L2,_年). 和暦年文字列(_年間,_年,_和暦年) :- _年 =< 10, nth1(_年,[元,二,三,四,五,六,七,八,九,十],A), concat_atom([_年間,A,年],_和暦年),!. 和暦年文字列(_年間,_年,_和暦年) :- _年 >= 11, Div is _年 // 10, Mod is (_年 mod 10) + 1, nth1(Div,['',二,三,四,五,六,七,八,九],A), nth1(Mod,['',一,二,三,四,五,六,七,八,九],B), concat_atom([_年間,A,十,B,年],_和暦年),!. 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 漢数字アラビア数字対応([A,十,B],N) :- 漢数字アラビア数字対応(A,N1), 漢数字アラビア数字対応(B,N2), N is N1 * 10 + N2,!. 漢数字アラビア数字対応([A,十],N) :- 漢数字アラビア数字対応(A,N1), N is N1 * 10,!. 漢数字アラビア数字対応([十,B],N) :- 漢数字アラビア数字対応(B,N2), N is 10 + N2,!. 漢数字アラビア数字対応([十],10) :- !. 漢数字アラビア数字対応([A],N) :- 漢数字アラビア数字対応(A,N). 年間(安政,1854,1860). 年間(万延,1860,1861). 年間(文久,1861,1864). 年間(元治,1864,1865). 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2018). % 以下のサイトは # 出典 :: #498 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 0列目に学籍番号,1-4列目の要素に各テストの点数が格納されている二次元配列がある. # 全科目総点で昇順に並べ替えを行い,結果を表示するプログラムを作成せよ. # int seiseki[5][5]= {{1, 75, 68, 45, 91}, # {2, 87, 5, 100, 61}, # {3, 45, 79, 81, 77}, # {4, 53, 55, 55, 66}, # {5, 82, 32, 85, 74}, # seiseki([[1,75,68,45,91], [2,87,5,100,61], [3,45,79,81,77], [4,53,55,55,66], [5,82,32,85,74]]). '0列目に学籍番号,1-4列目の要素に各テストの点数が格納されている二次元配列がある.全科目総点で昇順に並べ替えを行い,結果を表示するプログラムを作成せよ.' :- seiseki(LL), 全科目総点で昇順に並べ替えを行い(LL,LL3), 結果を表示する(LL3). 全科目総点で昇順に並べ替えを行い(LL,LL3) :- findall([_全科目の総点,_行],全科目総点(LL,_行,_全科目の総点),LL2), 昇順に並べ替えを行い(LL2,LL3). 全科目総点(LL,_行,_全科目の総点) :- member(_行,LL), _行 = [_|_科目成績ならび], sum_list(_科目成績ならび,_全科目の総点). 昇順に並べ替えを行い(LL2,LL3) :- sort(LL2,LL4), reverse(LL4,LL3). 結果を表示する(_整列済み成績ならび) :- write('\n成績順位を昇順に整列したseiseki(['), append(L1,[[_合計,_学籍番号_成績ならび]|R],_整列済み成績ならび), ならび部分表示(L1,_学籍番号_成績ならび), 改行と終了(R),!. ならび部分表示([],_学籍番号_成績ならび) :- writef('%w',[_学籍番号_成績ならび]),!. ならび部分表示(_,_学籍番号_成績ならび) :- writef(' %w',[_学籍番号_成績ならび]). 改行と終了([]) :- write(']).\n\n'). 改行と終了(_) :- write('),\n'), fail. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1276873238/295 # 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10839.txt # コピーさせていただきました # ホームページ上からデータを追加、検索したりする問題です。 # OS:Linux # # [1]学籍番号(stnum char(14))、名前(name char(30))、国語(kokugo int)、数学(math int)、理科(science int) # からなるテーブルseisekiをデータベース上に作る。 # # [2]ホームページからデータを追加、検索できるようにする。 # 表示結果には、学籍番号、名前、国語、数学、理科、合計を表示させる # # 学籍番号による検索(_学籍番号) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 名前による検索(_名前) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]). 国語の成績による検索(_国語,_国語成績) :- seiseki(_学籍番号,_名前,_国語,_数学,_理科), _国語成績. 数学の成績による検索(_数学,_数学成績) :- seiseki(_学籍番号,_名前,_数学,_数学,_理科), _数学成績. 理科の成績による検索(_理科,_理科成績) :- seiseki(_学籍番号,_名前,_理科,_数学,_理科), _理科成績. 成績の追加(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の変更(_学籍番号,_名前,_国語,_数学,_理科) :- 学籍番号(_学籍番号), 名前(_名前), 国語(_国語), 数学(_数学), 理科(_理科), retract(seiseki(_学籍番号,_,_,_,_)), assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)). 成績の削除(_学籍番号) :- retract(seiseki(_学籍番号,_,_,_,_)). 学籍番号(_学籍番号) :- atom_length(_学籍番号,Len), Len =< 14, atom_chars(_学籍番号,Chars), すべてが数字(Chars),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). 名前(_名前) :- atom(_名前), atom_length(_名前,Len), Len =< 30,!. 国語(_国語) :- integer(_国語). 数学(_数学) :- integer(_数学). 理科(_理科) :- integer(_理科). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1200175247/877 # [1] 授業単元:2分探索法 # [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 # _学籍番号+_氏名+_誕生_月+_誕生_日 :- open('data_b.txt',append,Output), write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]), close(Output). 'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :- get_split_lines('data_b.txt',[' '],LL), 鍵項目の付加(LL,LL2), 整列(LL2,LL3), 鍵項目を除去しながら出力する(LL3). 鍵項目の付加([],[]) :- !. 鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_2), 鍵項目の付加(R1,R2). '1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!. '1-3月を13-15月に修正'(_誕生_月,_誕生月). 鍵項目を除去しながら出力する([]) :- !. 鍵項目を除去しながら出力する([[_,_|L]|R]) :- open('out_b.txt',append,Output), write_formatted(Output,'%t %t %t月 %t日\n',L), close(Output), 鍵項目を除去しながら出力する(R). 'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :- get_split_lines('output_b.txt',[' ',月,日],LL), 二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]), write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]). 二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_0), length(LL,Len), Len0 is Len // 2, append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL), length(L0,Len0), '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10), 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !. 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1], 二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1], 二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1200175247/861 # [1] 授業単元:ファイル操作、2分探索法 # [2] 問題文:学生の身長、体重のデータを読み込みある学籍番号を入力した # ときにその学生の学籍番号、身長、体重を2分探索法により求め、出力しなさい。 # 学生のデータは、txtファイルでxx yyy zzという風に記載されています。 # (例)出力結果 # 学生番号:xx # 身長:yyy (cm) # 体重:zz (kg) # 学生の身長、体重のデータを読み込む(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 二分木を育てる(LL). ある学籍番号を入力したときにその学生の学籍番号、身長、体重を2分探索法により求める(_学籍番号,_身長,_体重) :- 二分木の根(_根), 葉まで辿る([_学籍番号,_身長,_体重],_根). 二分木を育てる([A|R]) :- assertz(二分木(A,_,_)), assertz(二分木の根(A)), 二分木を育てる(L,_根). 二分木を育てる([],_) :- !. 二分木を育てる([A|R],_根) :- 根・葉の成長(A,_根), 二分木を育てる(R,_根). 葉まで辿る(_値,_値) :- 二分木(_値,_左,_右). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 葉まで辿る(_値,_左). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 葉まで辿る(_値,_右). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 根・葉の成長(_値,_左). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 根・葉の成長(_値,_右). 根・葉の成長(_値,_根) :- retract(二分木(_根,_左,_右1)), 根・葉の成長(_値,_根,_左,_右1),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@<,_値,_根), var(_左), assertz(二分木(_根,_値,_右1)), assertz(二分木(_値,_,_)),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@>=,_値,_根), var(_右), assertz(二分木(_根,_左,_値)), assertz(二分木(_値,_,_)),!. 変数を含む値を較べる(@<,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@<,R1,R2),!. 変数を含む値を較べる(@<,[A|R1],[B|R2]) :- \+(var(A)), A @< B,!. 変数を含む値を較べる(@>=,[],[]) :- !. 変数を含む値を較べる(@>=,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@>=,R1,R2),!. 変数を含む値を較べる(@>=,[A|R1],[B|R2]) :- \+(var(A)), A @> B,!. 変数を含む値を較べる(@>=,[A|R1],[A|R2]) :- \+(var(A)), 変数を含む値を較べる(@>=,R1,R2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/226 # 上記を参考に、malloc関数を用いて、氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する、任意の人数の処理が可能な、プログラムを、malloc.cという名前で作成せよ。 # malloc.cをVisual Studioで実行して(5名以上入力)、実行結果をmalloc.c内の文末に「コメント行」として記載せよ。(コメント行を追加後も、ビルド可能か再確認) # % malloc()に相当する述語はさすがにない。assertzで代用。 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する :- get_line(Line), 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line), 学生(_氏名,_学籍番号,_身長), write_formatted('%t,%t,%t\n',[_氏名,_学籍番号,_身長]), fail. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(end_of_file) :- !. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line) :- split(Line,[' '],[_氏名,_学籍番号,_身長]), assertz(学生(_氏名,_学籍番号,_身長)), get_line(Line2), 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line2). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 68 ★★ #51 # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/842.txt # (1)学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示する。 # 次のデータは学生の学籍番号、名前、欠席日数、席次を配列linesで格納したものです。 # String[] lines = { "0001, 山田太郎,2,3,42", "0002, 田中一郎,2,6,31", "0003, 斎藤花子,2,2,4" }; # splitとequalsメソッドを利用する。区切り記号はスペース。 # 引数 -n # (2) (1)を利用して学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示する。 # 引数 -q # (3) (1)を利用して各学生の全てのデータを席次順に表示する。 学籍簿('0001', 山田太郎,2,3,42). 学籍簿('0002', 田中一郎,2,6,31). 学籍簿('0003', 斎藤花子,2,2,4). '学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示'(_名前) :- 学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次), writef('%w,%w,%w,%w\n',[_名前,_学籍番号,学年,_席次]). '学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示'(_名前の一部) :- '学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を'(_名前の一部,_学籍番号,_名前,_欠席日数), writef('%w,%w,%w,%w\n',[_名前の一部,_学籍番号,_名前,_欠席日数]). '学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を'(_名前の一部,_学籍番号,_名前,_欠席日数) :- 学籍簿(_学籍番号,_名前,_欠席日数,_,_), sub_atom(_名前,_,_,_,_名前の一部). '各学生の全てのデータを学年・席次順(昇順)に表示' :- '全てのデータを学年・席次順(昇順)に'(_鍵付き学籍簿ならび), '表示'(_鍵付き学籍簿ならび). '全てのデータを学年・席次順(昇順)に'(_鍵付き学籍簿ならび) :- setof([_学年,_席次,_学籍番号,_名前,_欠席日数,_学年,_席次],[_学籍番号,_名前,_欠席日数,_学年,_席次] ^ 学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),_鍵付き学籍簿ならび). '表示'(_鍵付き学籍簿ならび) :- forall(member([_,_,_学籍番号,_名前,_欠席日数,_学年,_席次],_鍵付き学籍簿ならび),writef('%w,%w,%w,%w,%w\n',[_学籍番号,_名前,_欠席日数,_学年,_席次])). % 以下のサイトは http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび), 上位11名の選別(_整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), length(Ln,100), get_line(_行), 成績データを得る(Ln,_行,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_成績,N行,_学籍番号]|R]) :- split(_行,[' '],[_学籍番号,_成績]), length([_|Ln],N行), get_line(_行2), 成績データを得る(Ln,_行2,R). 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび) :- sort(_成績ならび,_点数が少ない順に整列した成績ならび), reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび). 上位11名の選別(L,X) :- length(X,11), append(X,_,L),!. 上位11名の選別(X,X). 上位11名を表示する(_上位11名ならび) :- append(_,[[A,B,C]|R],_上位11名ならび), writef('%t %t\n',[C,A]), R = [],!. % 以下のサイトは http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび), 上位11名の選別(_整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), length(Ln,100), get_line(_行), 成績データを得る(Ln,_行,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_成績,N行,_学籍番号]|R]) :- split(_行,[' '],[_学籍番号,_成績]), length([_|Ln],N行), get_line(_行2), 成績データを得る(Ln,_行2,R). 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび) :- sort(_成績ならび,_点数が少ない順に整列した成績ならび), reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび). 上位11名の選別(L,X) :- length(X,11), append(X,_,L),!. 上位11名の選別(X,X). 上位11名を表示する(_上位11名ならび) :- append(_,[[A,B,C]|R],_上位11名ならび), writef('%t %t\n',[C,A]), R = [],!.