このディレクトリの索引

% 以下のサイトは # 出題場所 :: 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教科の合計点が計算され'(_合計点_変数番号ならび) :- findsetof(_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/1325685876/129 # # [1] 授業単元:計算機アルゴリズム(ファイルへの追加書込み) # [2] 問題文(含コード&リンク):一言日記をファイルに書き込むプログラムを作成した # い.以下の要件を満たすプログラムを作成せよ. # 実行例 # 一言日記ファイル名:test.txt # ファイルがありません。新規作成しますか(Yes…1 / # No…0):0 # プログラムを終了します。 # (以下,diary.txt に既に日記が書かれているとする) # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # # 一言日記ファイル名:diary.txt # ファイルが見つかりました。追記しますか(Yes…1 / # No…0):1 # 日記の文字列を入力:プログラミング演習中 # % cat diary.txt # 2011 年12 月6 日12 時23 分来週中間テスト # 2011 年12 月13 日10 時35 分これからテスト! # 2011 年12 月16 日9 時40 分風邪ひいた # 2011 年12 月22 日14 時28 分プログラミング演習中 # # # '一言日記をファイルに書き込む'(_一言日記ファイル) :- exists_file(_一言日記ファイル), write('ファイルが見つかりました。追記しますか(Yes…1\nNo…0):'), get_line(Line), '一言日記をファイルに追記'(Line,_一言日記ファイル),!. '一言日記をファイルに書き込む'(_一言日記ファイル) :- write('ファイルがありません。新規作成しますか(Yes…1\nNo…0):'), get_line(Line), 新規作成書き込み(Line,_一言日記ファイル),!. 新規作成書き込み('0',_) :- !. 新規作成書き込み('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,write,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). '一言日記をファイルに追記'('0',_) :- !. '一言日記をファイルに追記'('1',_一言日記ファイル) :- write('日記の文字列を入力:'), open(_一言日記ファイル,append,Outstream), 'eofになるまで書き込み'(Outstream), close(Outstream). 'eofになるまで書き込み'(Outstream) :- at_end_of_stream(current_input),!. 'eofになるまで書き込み'(Outstream) :- get_line(Line), writef(Outstream,'%t\n',[Line]), 'eofになるまで書き込み'(Outstream). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/155 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/xmcn6oBoをもとに以下の構造体を、 # struct student{ # int num; # char name[10]; # int score; # }; # 構造体のデータ設定は # struct student St[]={{1, "Ichi", 90}, {2, "Ni", 60}, {3, "San", 70},{4, "Yon", 85}, {5, "Go", 80}}; # を用いること。 # また、構造体データの退避用として。同じstudent構造体の変数(ここではtmp)を定義すること # yes. ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/679 # # 【 課題 】(1) (0)や、過去の配布プリントやノートを参考にして、httpサーバにアクセスしてhtmlを取って #   来て表示するJavaプログラムを作成せよ。 #   そのプログラムで http://ime.nu/www.infosys.tuis.ac.jp/~ichirou/np/uhoho-?.html にアクセスしてどんな #   内容かを調べよ。(既存WWWブラウザでアクセスしてはならない!) #   Shift-JIS環境の人は uhoho-s.html、JIS環境の人は uhoho-j.html、EUC環境の人は uhoho-e.html # にアクセスすること。Vineを使ってるならEUC #   ヒント: HTTP/1.1 より HTTP/1.0 を使うほうがプログラムしやすいよ〜。 #   仕様:(a) コマンドラインから使用サーバ、ファイル名を入力。全て入力された後に実際に #        サーバと接続して通信させること。 #        あるいはそれらは引数としてプログラムに与えてもよい。 #      (b) HTMLタグを解釈させなくてよい。(つまりHTMLファイルがそのまま表示されて構わない) #      (c) メッセージヘッダのフィールドに書く User-Agent: は好きに命名してよい。 #        例:  User-Agent: HogeBrowser/1.3 (PlayStation) Gakko/20080702 # # こんなかんじ # # (2) 過去の課題01の(1)と同じことを行うJavaプログラムを作成せよ。 #   仕様:(a) コマンドラインから使用メールサーバ、あて先や、自分のメールアドレス、Subject、 #        メール本文を入力。全て入力された後に実際にサーバと接続して通信させること。 #      (b) 表示されるメッセージやインタフェースは各自好きにしてよい。 #      (c) To:やX-Mailer: フィールドをメールヘッダにつけること。 #        X-mailer: には各自好きなメールソフト名をつけてよい。 #        例:    X-mailer: HogegeMailer ver.1.01 powered by Java #      (d) 今回の課題ではサーバからのエラーメッセージが出た場合の処理まで考慮しなくて #        もよい。 #      (e) 日本語に対応しなくてもよい。 # # yes. ?- 'a##'. # 出典:: 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,_評価の分布) :- 評価の分布(LL2,[[],[],[],[],[]],_評価の分布). 評価の分布([],[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. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/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([_全科目の総点,_行],( append(_,[_行|_],LL), _行=[_学籍番号|_成績ならび]), sum(_成績ならび,_全科目の総点)), LL2), 昇順に並べ替えを行い(LL2,LL3). 昇順に並べ替えを行い(LL2,LL3) :- sort(LL2,LL3). 結果を表示する(_整列済み成績ならび) :- write('成績順に整列したseiseki(['], append(_,[[_合計|_学籍番号・成績ならび]|R],_整列済み成績ならび), write_formatted(' [%t,%t,%t,%t,%t]',_学籍番号・成績ならび), 改行と終了(R). 改行と終了([]) :- write(']]).\n'),!. 改行と終了(R) :- \+(R=[]), write(']),\n'). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/510 # # 【 課題 】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). 学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示(_名前) :-   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]). 学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示(_名前の一部) :-   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   sub_atom(_名前,_,_,_,_名前の一部),   write_formatted('%t,%t,%t,%t\n',[_名前の一部,_学籍番号,名前,_欠席日数]). '各学生の全てのデータを席次順(昇順)に表示' :-   findall([_学年,_席次],学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),L1),   sort(L1,L2),   member([_学年,_席次],L2),   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]),   fail.   '各学生の全てのデータを席次順(昇順)に表示'. % 以下のサイトは # 出典:: 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 = [],!.