このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/782 # # 読み込むiniファイルのセクション名を、string配列にpushし続けて、 # セクション名すべてpushしたらループから外れるって仕組みなんですけど、tmp = strtok_s()の代入がうまくいきません # どうしたらいいですか # # char SectionNames[1024]; # GetPrivateProfileSectionNames(SectionNames,1024,FilePath.c_str()); # # char *WTF;//謎の内部パラメータ,strtok_sの仕様 # vector<string> SquadNameList; # SquadNameList.push_back(strtok_s( SectionNames, "0" ,&WTF)); # # for(int i=0; i < SquadNameList.size();i++){ # char tmp[256]; # tmp = strtok_s( NULL, "0" ,&WTF); # if( tmp != NULL){ # SquadNameList.push_back(tmp); # } # } # # '読み込むiniファイルのセクション名を、string配列にpushし続けて、 セクション名すべてpushしたらループから外れるって仕組みなんですけど、 tmp = strtok_s()の代入がうまくいきませんどうしたらいいですか'(_iniファイル,_セクション名ならび) :- 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,[],_セクション名ならび). 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび) :- get_chars(_iniファイル,_iniファイル文字ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,L1,_セクション名ならび) :- セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_セクション名後の文字ならび,[_セクション名|L1],_セクション名ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,_セクション名ならび,_セクション名ならび). セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび) :- append(L0,['['|_セクション名からの文字ならび],_iniファイル文字ならび), 'L0に[も]も存在しない'(L0), append(L0_1,[']'|_セクション名後の文字ならび],_セクション名からの文字ならび), 'L0_1に]が存在しない'(_セクション名後の文字ならび), atom_chars(_セクション名,_セクション名後の文字ならび). 'L0に[も]も存在しない'(L0) :- \+(member('[',L0)), \+(member(']',L0)),!. 'L0_1に]が存在しない'(L0_1) :- \+(member(']',L0_1)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/74 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/ideone.com/V4h6ti # #include # #include # # int main(){ # char filename[FILENAME_MAX]; # char buffer; # FILE*fp; # # strcpy(filename,"/dev/stdin"); # if((fp = fopen(filename,"r")) == NULL){ # printf("ファイル%sが見つかりません。\n",filename); # return(-1); # } # # while((buffer = fgetc(fp))!=EOF){ # printf("%c",buffer); # } # fclose(fp); # } # # 1. 上記のプログラムをfgetsを使ったプログラムに書きかえなさい. # fgets の書式はfgets(結果を格納する変数(配列変数なのでポインタ), 読み込むバイト数, ファイルポインタ)である. # # 2. 上記のプログラムをファイル名を「コマンドラインの引数」で指定するプログラムに変更しなさい. # # 上記のプログラムに相当するPrologプログラム(_ファイル名) :- ファイルを開きstreamを確保する(_ファイル名,_Instream), ファイルを表示する(Instream), 'stream解放しファイルを閉じる'(Instream). ファイルを開きstreamを確保する(_ファイル名,_Instream) :- catch(open(_ファイル名,read,Instream),_,'ファイルが見つかりません。'(_ファイル名)). ファイルを表示する(Instream) :- at_end_stream(Instream),!. ファイルを表示する(Instream) :- get_char(Instream,Char), write(Char), ファイルを表示する(Instream). 'stream解放しファイルを閉じる'(Instream) :- close(Instream). 'ファイルが見つかりません。'(_ファイル名) :- write('ファイル%tが見つかりません。\n',[_ファイル名]), fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'strcpy(filename,"/dev/stdin"); if((fp = fopen(filename,"r")) == NULL){ printf("ファイル%sが見つかりません。\n",filename); return(-1); }'(_fp) :- ファイルを開きstreamを確保する('/dev/stdin',_fp). 'while((buffer = fgetc(fp))!=EOF){ printf("%c",buffer);'(_fp) :- ファイルを表示する(_fp). 'fclose(fp);'(_fp) :- 'stream解放しファイルを閉じる'(_fp). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/666 # # [1] 配列ポインタ # [2] n件の浮動小数点型データを配列に入力して、その最大値を出力するプログラムを作成。 # ただし、配列の定義以外で添字演数子[ ]を用いないまた、*(p+i)、*p++の形式2つを用いた場合をそれぞれ作成。また、入出力処理をファイル処理に変更して、入出力ファイル名はコマンドラインで指定する。 # [3]Linux、gcc、C # # [4] 至急 # [5] 緊急で無理とは思いますがお願いします # # 'n件の浮動小数点型データをならびに入力して、その最大値を出力する'(_n件,_最大値) :- 'n件の浮動小数点型データをならびに入力して'(_n件,_浮動小数点型データならび), その最大値を出力する(_浮動小数点型データならび). 'n件の浮動小数点型データをならびに入力して'(_n件,_浮動小数点型データならび) :- length(_浮動小数点型データならび,_n件), findall(_浮動小数点型データ,( member(_,_浮動小数点型データならび), 実数を得る('浮動小数点型データ',浮動小数点型データ)), _浮動小数点型データならび). その最大値を出力する(_浮動小数点型データならび) :- その最大値を(_浮動小数点型データならび,_最大値), writef('最大値は %t です\n',[_最大値]). その最大値を([A|R],A,_最大値) :- その最大値を(R,A,_最大値). その最大値を([],_最大値,_最大値). その最大値を([A|R],_最大値_1,_最大値) :- A > _最大値_1, その最大値を(R,A,_最大値). その最大値を([A|R],_最大値_1,_最大値) :- A =< _最大値_1, その最大値を(R,_最大値_1,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」の順にファイルに出力する'(_入力ファイル,_出力ファイル) :- '作成したファイルを読み込み'(LL), '受験者ごとの合計点、順位を求め'(LL,LL3), '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL3),!. '作成したファイルを読み込み'(LL) :- get_split_lines(_入力ファイル,[' '],LL). '受験者ごとの合計点、順位を求め'(LL,LL3) :- findall([_合計点,_出席番号],( 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会), 合計点(_体育,_美術,_英語,_数学,_社会,_合計点)), LL1), 順位を求め(LL1,LL3). 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会) :- member([_出席番号,_体育,_美術,_英語,_数学,_社会],LL). 合計点(_体育,_美術,_英語,_数学,_社会,_合計点) :- _合計点 is _体育 + _美術 + _英語 + _数学 + _社会. 順位を求め(LL1,LL3) :- 合計点の大きい順に(LL1,LL2), 順位を張る(1,LL2,LL3). 合計点の大きい順に(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 順位を張る([],[]). 順位を張る(_順位,[[_合計点,_出席番号_1],[_合計点,_出席番号_2]|R1],[[_出席番号_1,_合計点,_順位]|R2]) :- 順位を張る(_順位,[[_合計点,_出席番号_2]|R1],R2),!. 順位を張る(_順位,[[_合計点,_出席番号]|R1],[[_出席番号,_合計点,_順位]|R2]) :- _順位_2 is _順位 + 1, 順位を張る(_順位_2,R1,R2). '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL) :- open(_出力ファイル,write,Outstream), append(_,[[_出席番号,_合計点,_順位]|R],LL), writef(Outstream,'%t %t %t\n',[_出席番号,_合計点,_順位]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録する'(_ファイル) :- open(_ファイル,write,Outstream), 出席番号を標準入力から入力(_最初の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_最初の出席番号), close(Outstream). '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(_,end_of_file) :- !. '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_出席番号) :- 各科目の点数を標準入力から入力(_各科目の点数ならび), 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび), 出席番号を標準入力から入力(_次の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_次の出席番号). 出席番号を標準入力から入力(_出席番号) :- get_line(Line), '診断: 出席番号を標準入力から入力'(Line,_出席番号),!. '診断: 出席番号を標準入力から入力'(Line,_出席番号) :- write('出席番号を入力してください(終了する時はend_of_file) : '), atom_to_term(Line,_出席番号整数,_), integer(_出席番号整数), 頭部零文字列(4,_出席番号整数,_出席番号),!. '診断: 出席番号を標準入力から入力'(_,end_of_file). 各科目の点数を標準入力から入力(_各科目の点数ならび) :- findall(_点数,( member(_科目,[体育,美術,英語,数学,社会]), 整数を得る(_科目,(_点数>=0,_点数=<100),_点数)), _各科目の点数ならび). 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび) :- atomic_list_concat([_出席番号|_各科目の点数ならび],' ',_表示行文字列), writef(Outstream,'%t\n',[_表示行文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/758 # # ●正規表現の使用環境 # Firefox 3.6.28の*.uc.js # # ●検索か置換か? # 検索?置換? # # ●説明 # ・以前、別のスレでAのURLをBのように、v=以外のパラメータを消すものを書いてもらいました。 #  A: http://ime.nu/www.youtube.com/watch?v=abcdef123456&feature=related&etc=sexample #  B: http://ime.nu/www.youtube.com/watch?v=abcdef123456 # ・正規表現 #  [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'] # # 今回は別のURLからパラメータを消したいです。 # # ●対象データ # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html?ref=rss # # ●希望する結果 # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html # # # ※このようにしてみたのですが、上手くいきませんでした。 # var patterns = [ # //置換したいURLパターンを記述 # [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'], # [/^(http:\/\/www\.forest\.impress\.co\.jp\/docs\/news\/)[0-9]_[0-9]\.html\?ref=rss, '$1'] # ]; # # 'URLからパラメータを消したい'(_URL文字列,_パラメータの消されたURL文字列) :- split(_URL文字列,['?'],[_パラメータの消されたURL文字列|_]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '2. () を用いた演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を削除する(Chars,Chars1), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars1,Chars2), atom_chars(Line2,Chars2), split(Line2,[' '],_項ならび). 一旦空白要素を削除する([],[]). 一旦空白要素を削除する([' '|R1],R2) :- 一旦空白要素を削除する(R1,R2),!. 一旦空白要素を削除する([A|R1],[A|R2]) :- 一旦空白要素を削除する(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(['-'|R1],['-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['(','-'|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(['-'|R1],R2),!. 演算子の前後に空白を入れる([')','-'|R1],[' ',')',' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['('|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([')'|R1],[' ',')',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '2. () を用いた演算'(_項ならび,X) :- '先に()グループを演算する'(_項ならび,_項ならびの一), '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X). '先に()グループを演算する'([],[]). '先に()グループを演算する'(['('|R1],[X|R2]) :- '()グループを演算して置換'(R1,X), '先に()グループを演算する'(R1,R2),!. '先に()グループを演算する'([A|R1],[A|R2]) :- '先に()グループを演算する'(R1,R2),!. '()グループを演算して置換'([],LX,X,[]) :- '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'([')'|R],LX,X,R) :- '+,-でグループ化する'(LX,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'(['('|R],LX,X,R) :- '()グループを演算して置換'(['('|R],[],Y,R1), append(LX,[Y],LY), '()グループを演算して置換'(R1,LY,X,R),!. '()グループを演算して置換'([A|R1],LX,X,R) :- append(LX,[A],LY), '()グループを演算して置換'(R1,LY,X,R). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/128 # # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1番:コマンドライン引数を用いて2つの10進数を入力し, # その2つの数を2進数表示したものについて,論理和,論理積, # 排他的論理和,を表示するプログラムを作成せよ。 # また,2進数で直接入力して計算できるようにせよ。 # # 2番:1番で求めた論理和,論理積,排他的論理和について、 # 指定したビット目の値、連続する0の数および1の数をそれぞれ数えて # 交互に表示するプログラムを作成せよ。 # # 3番目:1番で求めた論理和,論理積,排他的論理和について、 # 4桁ずつ区切って16進数で表示するプログラムを作成せよ. # # 例: # 論理和 : 000111101001001 # 1番目の区切り:0001 = 1 # 2番目の区切り:1110 = e # 3番目の区切り:1001 = 9 # 4番目の区切り:001 = 1 # '4桁ずつ区切って16進数で表示する'(L) :- '4桁ずつ区切って16進数で表示する'(_n,L). '4桁ずつ区切って16進数で表示する'(_n,L) :- length(L0,4), append(L0,L1,L), 表示する(_n,L0), _n_2 is _n + 1, '4桁ずつ区切って16進数で表示する'(_n_2,L1). '4桁ずつ区切って16進数で表示する'(_n,L) :- 表示する(_n,L). 表示する(_n,L) :- '16進数表示'(L,_16進数表示), concat_atom(L,_2進数表示), writef('%t番目の区切り : %t = %t\n',[_n,_2進数表示,_16進表示]),!. '16進数表示'([1,0,1,0],a) :- !. '16進数表示'([1,0,1,1],b) :- !. '16進数表示'([1,1,0,0],c) :- !. '16進数表示'([1,1,0,1],d) :- !. '16進数表示'([1,1,1,0],e) :- !. '16進数表示'([1,1,1,1],f) :- !. '16進数表示'([A,B,C,D],N) :- N is A * 8 + B * 4 + C * 2 + D,!. '16進数表示'(L,N) :- '16進数表示'(L,0,N). '16進数表示'([],N,N). '16進数表示'([B|R],N_1,N) :- N_2 is N_1 * 2 + B, '16進数表示'(R,N_2,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/128 # # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1番:コマンドライン引数を用いて2つの10進数を入力し, # その2つの数を2進数表示したものについて,論理和,論理積, # 排他的論理和,を表示するプログラムを作成せよ。 # また,2進数で直接入力して計算できるようにせよ。 # # 2番:1番で求めた論理和,論理積,排他的論理和について、 # 指定したビット目の値、連続する0の数および1の数をそれぞれ数えて # 交互に表示するプログラムを作成せよ。 # # 3番目:1番で求めた論理和,論理積,排他的論理和について、 # 4桁ずつ区切って16進数で表示するプログラムを作成せよ. # # 例: # 論理和 : 000111101001001 # 1番目の区切り:0001 = 1 # 2番目の区切り:1110 = e # 3番目の区切り:1001 = 9 # 4番目の区切り:001 = 1 # ビット目の指定(_ならび,_nビット目,_nビット目の値) :- nth1(_nビット目,_ならび,_nビット目の値). '連続する0の数および1の数をそれぞれ数えて交互に表示する'(L) :- '連続する0の数および1の数をそれぞれ数えて'(L,L2), concat_atom(L2,',',_表示文字列), writef('%t\n',[_表示文字列]). '連続する0の数および1の数をそれぞれ数えて'(L,[Len|R2]) :- append(L0,[A|R],L), \+(member(A,L0)), length(L0,Len), '連続する0の数および1の数をそれぞれ数えて'([A|R],R2). '連続する0の数および1の数をそれぞれ数えて'(L,[Len]). length(L,Len). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '1. 2 〜5項式までの四則演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を除去する(Chars,Chars2), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars2,Chars3), atom_chars(Line2,Chars3), split(Line2,[' '],_項ならび). 一旦空白要素を除去する([],[]) :- !. 一旦空白要素を除去する([' '|R1],R2) :- 一旦空白要素を除去する(R1,R2),!. 一旦空白要素を除去する([A|R1],[A|R2]) :- 一旦空白要素を除去する(R1,R2). '先頭の符号に注意して、演算子の前後に空白を入れる'([-,A|R1],[-,A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '1. 2 〜5項式までの四則演算'(_項ならび,X) :- '+,-でグループ化する'(_項ならび,_項ならびの一), '要素の四則演算'(_項ならびの一,X). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # # 1): # n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力するプログラムを作成し、動作を確認せよ。 # ただし、整数nと入力ファイル名はコマンドライン引数とすること。 # また、プログラム内ではn個の実数は配列x[]に読み込むこと、すなわち、 # double *x; # int n; # n=atoi(argv[1]); # x=(double *)malloc(sizeof(double)*n); # # 2): # #include # int main(){ # int x=100; # int y=500; # int *ptr=&x; # # printf("*ptr=%d\n",*ptr); # *ptr=400; # printf("x=%d\n",x); # printf("y=%d\n",y); # # return 0; # } # を関数化せよ。 # すなわち、実数からなる配列x[]とその要素数nが与えられたとき、それらnこの実数の最大値、採草地、および平均値を求める関数。 # void max_min_mean(double x[],int n,double *a,double *b,,double *c) # を作成し、動作を確認せよ。 # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # # 4): # 身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求めるプログラムを作成する。身長検査データは標準入力からでもプログラムに記述でもどちらでもいい。 # # 結果 平均身長 〇〇cm #    視力の分布 0.0〜:○人 #          0.1〜:○人(以下略 # # struct{ # # } 'n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力する'(_n個,_残り実数ならび) :- 'n個の実数からなるファイルを読み込み'(_実数ならび,_残り実数ならび), 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび). 'n個の実数からなるファイルを読み込み'(_n個,_ファイル,_実数ならび), get_lines(_ファイル,Lines), 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび). 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび) :- length(_実数ならび,_n個), findall(_実数,( append(L0,[_実数|_],Lines), float(_実数)), _実数ならびの一), append(_実数ならび,_残り実数ならび,_実数ならびの一),!. 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび) :- 最大値(_実数ならび,_最大値), 最小値(_実数ならび,_最小値), 平均値(_実数ならび,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|L],_最大値) :- !. 最大値(L,A,_最大値), 最大値([],_最大値,_最大値) :- !. 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値). 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([_最大値],_最大値) :- !. 最大値([A1,A2],_最大値) :- 大きい方が最大値(A1,A2,_最大値),!. 最大値(_実数ならび,_最大値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最大値(L1,Max1), 最大値(L2,Max2), 大きい方が最大値(Max1,Max2,_最大値),!. 最大値([A|_実数ならび],_最大値) :- 最大値(_実数ならび,Max1), 大きい方が最大値(A,Max1,_最大値). 大きい方が最大値(Max1,Max2,Max1) :- Max1 @>= Max2,!. 大きい方が最大値(Max1,Max2,Max2) :- Max1 @< Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([A|L],_最小値) :- !. 最小値(L,A,_最小値), 最小値([],_最小値,_最小値) :- !. 最小値([A|R],_最小値_1,_最小値) :- A @< _最小値_1, 最小値(R,A,_最小値). 最小値([A|R],_最小値_1,_最小値) :- 最小値(R,_最小値_1,_最小値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([_最小値],_最小値) :- !. 最小値([A1,A2],_最小値) :- 小きい方が最小値(A1,A2,_最小値),!. 最小値(_実数ならび,_最小値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最小値(L1,Max1), 最小値(L2,Max2), 小きい方が最小値(Max1,Max2,_最小値),!. 最小値([A|_実数ならび],_最小値) :- 最小値(_実数ならび,Max1), 小きい方が最小値(A,Max1,_最小値). 小きい方が最小値(Max1,Max2,Max1) :- Max1 @< Max2,!. 小きい方が最小値(Max1,Max2,Max2) :- Max1 @> Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 平均値(L,_平均値) :- sum(L,_合計), length(L,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/665 # # [1] 元:P入門 [2] 文 # # 数字が書かれているtxtFからそれを読み込んで # 別のtxtFに出力するCPを作成せよ。 # 入出力Fはコマンドラインから任意で指定すること。 # # 数字のみを標準出力するCPを入力Fとして、txtFに # その結果を出力するCPを作れ。 # 入力、出力Fはコマンドラインから任意に指定すること。 # '数字が書かれているtxtFからそれを読み込んで別のtxtFに出力するCPを作成せよ。入出力Fはコマンドラインから任意で指定すること' :- user_parameters([_txtF_In,_txtF_Out]), get_chars(_txtF_In,Chars), put_chars(_txtF_Out,Chars). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは # 大学の試験で出題された問題 by @shokinon on twitter at 2011-08-10 # # 第1パラメータの要素で、第2パラメータに与えたリストを2分割にし、 # 前半のリストを第3パラメータに、後半のリストを第4パラメータに求める # Prologプログラムsep(A,InL,L,R)を作成せよ。 sep(A,[A|R],[],R). sep(A,[B|R1],[B|R2],R) :- sep(A,R1,R2,R). % 以下のサイトは # 大学の試験で出題された問題 by @shokinon on twitter at 2011-08-10 # # 第1パラメータの要素で、第2パラメータに与えたリストを2分割にし、 # 前半のリストを第3パラメータに、後半のリストを第4パラメータに求める # Prologプログラムsep(A,InL,L,R)を作成せよ。 sep(A,InL,L,R) :- append(L,[A|R],InL). % 以下のサイトは # 大学の試験で出題された問題 by @shokinon on twitter at 2011-08-10 # # Prologプログラムcomp(L1,L2,Result)を作成せよ。ただし、リストの個数が # 異なるときは、リストがない方を小さいとする。 # comp([6,2,4,3],[1,2,5],R). の実行結果は、R = [gt.eq,lt,gt]. である。 # 具体的には、L1のリストのi番目をL_1i , L2のリストのi番目をL_2i としたとき、 # L_1i > L_2iのときはgt、L_1i < L_2i のときは、lt、L_1i = L_2iのときは # eqと第3パラメータに求める % % IF/Prologによる別解 組込述語 compare/3を使ってみよう。 % comp(L1,[],L3) :- findall(gt,member(_,L1),L3). comp([],L2,L3) :- findall(lt,member(_,L2),L3). comp([A|R1],[B|R2],[_記号2|R3]) :- compare(_記号1,A,B), 比較記号(_記号1,_記号2), comp(R1,R2,R3). 比較記号(>,gt). 比較記号(<,lt). 比較記号(=,eq). % 以下のサイトは # 大学の試験で出題されたもの by @shokinon on twitter at 2011-08-10 # # Prologプログラムcomp(L1,L2,Result)を作成せよ。ただし、リストの個数が # 異なるときは、リストがない方を小さいとする。 # comp([6,2,4,3],[1,2,5],R). の実行結果は、R = [gt.eq,lt,gt]. である。 # 具体的には、L1のリストのi番目をL_1i , L2のリストのi番目をL_2i としたとき、 # L_1i > L_2iのときはgt、L_1i < L_2i のときは、lt、L_1i = L_2iのときは # eqと第3パラメータに求める comp([],[],[]). comp([_|R1],[],[gt|R3]) :- comp(R1,[],R3). comp([],[_|R2],[lt|R3]) :- comp([],R2,R3). comp([A|R1],[A|R2],[eq|R3]) :- comp(R1,R2,R3). comp([A|R1],[B|R2],[gt|R3]) :- A > B, comp(R1,R2,R3). comp([A|R1],[B|R2],[lt|R3]) :- A < B, comp(R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/434 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://codepad.org/FYsQ9RGx # # 13-1 標準入出力 # # 標準入力を標準出力する簡易catコマンドを作成せよ. # # $ cat sample.txt # 1. Software Engineering # # Based on the tenets of software engineering and computing science, # the Department of Software Engineering provides students with # a comprehensive grounding in software development and information # processing. As society becomes increasingly dependent on various # ... 略 ... # # $ ./ex1301-10se000 < sample.txt > sample-out.txt # $ cat sample-out.txt # 1. Software Engineering # # Based on the tenets of software engineering and computing science, # the Department of Software Engineering provides students with # a comprehensive grounding in software development and information # processing. As society becomes increasingly dependent on various # ... 略 ... # # sample.txtをダウンロードしてデバッグに使用すると良い. # 標準入力のファイルポインタはstdinである.p.222の「標準入力と標準出力」を参照.p.153の関数getchar(), putchar()を用いるのもよい. # 13-2 ファイル入出力 # # ファイルを読み込んで,ファイル中の英小文字を英大文字に,英大文字を英小文字に変換してファイルに書き出すプログラムを作成せよ. # # $ cat sample.txt # 1. Software Engineering # # Based on the tenets of software engineering and computing science, # the Department of Software Engineering provides students with # a comprehensive grounding in software development and information # processing. As society becomes increasingly dependent on various # ... 略 ... # # $ ./ex1303-10se000 # 入力ファイル名 > sample.txt # 出力ファイル名 > sample-out.txt # $ cat sample-out.txt # 1. sOFTWARE eNGINEERING # # bASED ON THE TENETS OF SOFTWARE ENGINEERING AND COMPUTING SCIENCE, # THE dEPARTMENT OF sOFTWARE eNGINEERING PROVIDES STUDENTS WITH # A COMPREHENSIVE GROUNDING IN SOFTWARE DEVELOPMENT AND INFORMATION # PROCESSING. aS SOCIETY BECOMES INCREASINGLY DEPENDENT ON VARIOUS # ... 略 ... # # 13-3 ファイル入力.コマンドライン入力 # # 行数,単語数,バイト数,ファイル名を以下の様に出力するような簡易wcを作成せよ.オプションは指定できなくても良い. # # $ ./ex1303-10se000 sample.txt # 33 230 1674 sample.txt # $ wc sample.txt # 33 230 1674 sample.txt # # 行数,単語数,バイト数は,(C言語の)整数で表せる大きさであると仮定して良い.本問題における「単語」は,コマンドwcにおける定義で考えよ.コマンド wc は man wc で調べることができる. # 13-4 ファイル入力,コマンドライン入力 # # 第2引数で示された(単一の)ファイル内において第1引数の単語が出現する行をすべて出力するプログラムを作成せよ. # # $ ./ex1304-10se000 Software sample.txt # 1. Software Engineering # the Department of Software Engineering provides students with # $ grep Software sample.txt # 1. Software Engineering # the Department of Software Engineering provides students with '行数,単語数,バイト数,ファイル名を以下の様に出力する' :- user_parameters([wc,_ファイル名]), get_chars(_ファイル名,Chars), length(Chars,_バイト数), '行数,単語数'(Chars,_行数,_単語数), writef('%t %t %t %t\n',[_行数,_単語数,_バイト数,_ファイル名]),!. '行数,単語数'([],[],0,0) :- !. '行数,単語数'(['\n'|R1],[],_行数,_単語数) :- '行数,単語数'(R1,W,_行数_1,_単語数_1), 単語数加算(W,_単語数_1,_単語数), _行数 is _行数_1 + 1,!. '行数,単語数'([C|R1],[],_行数,_単語数) :- member(C,[' ',' ',',','.']), '行数,単語数'(R1,W,_行数,_単語数_1), 単語数加算(W,_単語数_1,_単語数),!. '行数,単語数'([C|R1],[C|R2],_行数,_単語数) :- \+(member(C,[' ',' ',',','.'])), '行数,単語数'(R1,R2,_行数,_単語数). 単語数加算([],_単語数,単語数) :- !. 単語数加算([_|_],_単語数_1,単語数) :- _単語数 is _単語数_1 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # wcコマンドを使って、ファイルの行数・単語数・バイト数を数えるプログラム。 # 各ファイルごとに、wcコマンドを無引数で実行、 # その結果をファイルnに書き込むプログラムを書け。 # http://codepad.org/2Y5RTFYrを元にせよ 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), wcの実行(_実行ならび), 出力ファイルへ書きこむ(_出力ファイル,_実行ならび). 'ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_ファイル名ならび,[_出力ファイル名],_ユーザパラメータ),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出しwcの結果を出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出しwcの結果を出力する(Outstream,_ファイル名ならび) :- append(_,[_ファイル名|R],_ファイル名ならび), concat_atom(['wc ',_ファイル名],S), shs(S,_実行結果), writef(Outstream,'%t: %t\n',[_ファイル名,_実行結果]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # の内容を連結し、 その結果をファイルnに書き込むプログラムを書け。 # ただし、標準入力と標準出力を当該のファイルにリダイレクトした状態で # UNIX標準コマンドを実行することで行うこと。 入力ファイルに関して # エラーが発生した場合、 そこで処理を終了せず、残りのファイルの処理を # 続けること。 ただし、以下のオプションをとることができるようにせよ。 # # -a # 書き込む際に、 ` を *' に、 ~ を *^ に、 それぞれ変換する。 # -b # 書き込む際に、 { を *[ に、 } を *] に、 # | (縦棒)を *\ (アスタリスク バックスラッシュ)に、 それぞれ変換する。 # -l # 書き込む際に、 アルファベット小文字を、 対応する大文字の # 前に * (アスタリスク)を添えた二文字に変換する。 # # 注意1 # ファイルをcloseした後に同名のファイルをopenすると、セキュリティ上の # 問題が生じる。出力のリダイレクトで、そのようなことにならないよう # 注意してプログラミングすること 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), フィルタの定義(_オプションならび), 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名). 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_オプションまたはファイル名ならび,[_出力ファイル名],_ユーザパラメータ), オプションとファイル名の分離(_オプションまたはファイル名ならび,_オプションならび,_ファイル名ならび),!. オプションとファイル名の分離([],[],[]) :- !. オプションとファイル名の分離([_オプション指定|R1],[_オプション指定|R2],_ファイル名ならび) :- sub_atom(_オプション指定,0,1,_,'-'), オプションとファイル名の分離(R1,R2,_ファイル名ならび), オプションとファイル名の分離([_ファイル名|R1],R2,[_ファイル名|R3]) :- \+(sub_atom(_オプション指定,0,1,_,'-')), オプションとファイル名の分離(R1,R2,R3),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[]) :- !. 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[_ファイル名|R]) :- open(_ファイル名,read,Instream), フィルタを通しながら出力する(Instream,Outstream), close(Instream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,R). フィルタを通しながら出力する(Instream,Outstream) :- at_end_of_stream(Instream),!. フィルタを通しながら出力する(Instream,Outstream) :- get_char(Instream,_文字), フィルタ(_文字,_変換された文字列), writef(Outstream,'%t',[_変換された文字列]), フィルタを通しながら出力する(Instream,Outstream). フィルタの定義(_オプションならび) :- member('-a',_オプションならび), asserta((フィルタ('`','*''') :- !)), asserta((フィルタ('~','*^') :- !)), fail. フィルタの定義(_オプションならび) :- member('-b',_オプションならび), asserta((フィルタ('{','*{') :- !)), asserta((フィルタ('}','*}') :- !)), fail. フィルタの定義(_オプションならび) :- member('-l',_オプションならび), asserta((フィルタ(A,B) :- A @>= 'a', A @=< 'z', to_upper(A,A1), concat_atom(A1,B),!)), fail. フィルタの定義(_) :- assertz((フィルタ(A,A))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/974 # # ●正規表現の使用環境 # linux コマンドラインの grep # # ●検索か置換か? # 検索 # # ●説明 # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい # # ●対象データ # aaabbbcccあああいいい # aaabbbcccううういいい # aaabbbcccえええいいい # # ●希望する結果 # aaabbbcccううういいい # aaabbbcccえええいいい # # 「説明」がうまく書けないのですが。 # よろしくお願いします # # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_文字列ならび,_対象文字列,_特定のパターン,_末尾部分,_特定パターンを除去した文字列ならび) :- findall(_文字列,( sub_atom(_文字列,S,_,0,_末尾部分), sub_atom(_文字列,0,S,_,_対象文字列), \+(call(_特定パターン))), _特定パターンを除去した文字列ならび). % % _特定パターン述語の引数に必ず_対象文字列を持つこと % 例えば、 削除パターン(_対象文字列) :- sub_atom(_対象文字列,_,_,_,あああ). ?- _対象データ = [aaabbbcccあああいいい,aaabbbcccううういいい,aaabbbcccえええいいい], 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_対象データ,_対象文字列,削除パターン(_対象文字列),いいい,_特定パターンを除去した文字列ならび). _特定パターンを除去した文字列ならび = [aaabbbcccううういいい,aaabbbcccえええいいい]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/313 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。 # ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と # 氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前は # プログラムの引数として与えられるものとする。 program :- user_parameters([_n個文字列,_ファイル]), atom_to_term(_n個文字列,_n個,_), キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n個,_ファイル), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n個,_ファイル) :- length(L,_n個), 学生番号と氏名の組を読み込む(L), open(_ファイル,write,Outstream), append(_,[[_学生番号,_氏名]|R],L), write_foratted(Outstream,'%t,%t\n',[_学生番号,_氏名]), R = [], close(Outstream),!. 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個) :- length(L,_n個), get_line(_ファイル,Lines), append(L,_,Lines), sort(L,_整列済みデータ), append(_,[[_学生番号,_氏名]|R],_整列済みデータ), write_formatted('%t,%t\n',[_学生番号,_氏名]), R = [],!. 学生番号と氏名の組を読み込む([]) :- !. 学生番号と氏名の組を読み込む([[_学生番号,_氏名]|R]) :- 学生番号を読み込む(_学生番号), 氏名を読み込む(_氏名), 学生番号と氏名の組を読み込む(R). 学生番号を読み込む(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号),!. 学生番号を読み込む(_氏名) :- write('氏名を入力してください : '), get_line(_氏名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/11 # # [1] 授業単元:C言語の基礎 # [2] 問題文 #  「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 #  ファイルの読込とができるプログラムを作成しなさい。 #  たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを #  読込、書込、保存をする。可能なら、検索もできるようにすると良い。 #  複数のデータを扱うために、構造体を持つ配列を使うこと。 #  また、メンバ数は6個以上の情報を扱うこと。 #  ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 #  別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 #  データファイルはプログラム起動時にコマンドラインから入力できること。 #  また、そうではないことにも対応すること。」 # リーディング情報の読み込み(_データファイル,LL) :- get_split_lines(_データファイル,[','],LL), append(_,[L|R],LL), P =.. [リーディング情報|L], assertz(P), R = [],!. リーデング情報の保存(_データファイル) :- open(_データファイル,write,Outstream), リーデング情報の書き込み(Outstream), close(Outstream). リーデング情報の書き込み(Outstream) :- リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S), write_formatted(Output,'%t\n',[S]), fail. リーデング情報の書き込み(Outstream). 情報の回覧(LL) :- write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'), リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数), _1出走賞金 is truncate(_賞金 / _出走回数), _1頭平均賞金 is truncate(_賞金 / _出走頭数) _勝馬率 is _勝馬頭数 / _出走頭数, アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス), write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]), fail. 情報の回覧(LL). リーディング情報の追加 :- write('指示に従い各項目を入力してください\n'), リーディング情報項目(_項目,_項目のタイプ), リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび), P =.. [リーデング情報|_項目値ならび], assertz(P),!. リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :- findall(_項目値,( リーディング情報項目(_項目,_項目のタイプ), 項目の入力(_項目,_項目のタイプ,_項目値)), _項目値ならび). 項目の入力(_項目,文字列,_項目値) :- write_formatted('%t (文字列) を入力してください : ',[_項目]), get_line(_項目値),!. 項目の入力(_項目,整数,_項目値) :- write_formatted('%t (整数)を入力してください : ',[_項目]), get_line(Line), 項目の入力診断(_項目,整数,Line,_項目値),!. 項目の入力(_項目,整数,_項目値) :- 項目の入力(_項目,整数,_項目値). 項目の入力診断(_項目,整数,Line,_項目値) :- atom_to_term(Line,_項目値,_), integer(_項目値),!. 項目の入力診断(_項目,整数,Line,_項目値) :- write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]), fail. % 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。 % これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。 アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :- 産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金), 産駒の出走頭数(_種牡馬名,産駒の出走頭数), 全出走馬収得賞金(_全出走馬収得賞金), 総出走頭数(_総出走頭数), _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!. リーディング情報項目(順位,整数). リーディング情報項目(種牡馬名,文字列). リーディング情報項目(毛色,文字列). リーディング情報項目(産地,文字列). リーディング情報項目(出走頭数,整数). リーディング情報項目(勝馬頭数,整数). リーディング情報項目(出走回数,整数). リーディング情報項目(勝利回数,整数). リーディング情報項目(賞金,整数). /* リーディング情報項目(1出走賞金,整数). リーディング情報項目(1頭平均賞金,整数). リーディング情報項目(勝馬率,浮動小数点数).). リーディング情報項目(アーニング・インデックス,浮動小数点数). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/871 # # 【 課題 】 # 商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示するプログラムを作成します。添付のソースファイルにコードを追加して、以下の実行結果になるようなプログラムを作成してください。 # ☆商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する (個数が入力されない場合は1個とみなす) # C:\kadai>java Shopping Orange # 商品:Orange # 単価:100円 個数:1個 合計:100円 # # C:\kadai> java Shopping Orange 3 # 商品:Orange # 単価:100円 個数:3個 合計:300円 # # ☆ 商品が見つからなかった場合には、エラーメッセージを表示する # C:\kadai>java Shopping Melon 3 # Melonは商品ではありません。 # # ☆ 引数の数が0または3つ以上の場合は、エラーメッセージを表示する # C:\kadai>java Shopping Orange Apple Peach # 引数には商品名と個数を入力してください。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 Ver  】1.6.0_05 # 【 補足 】 Shoppingクラスはmain()メソッドを持つ。 # 実行時の引数には商品名と個数を入力する。 # 個数が入力されなかった場合は1とみなす。 # Fruitクラスのsearch()メソッドは、商品が存在するかどうかを検索する # メソッドで、商品が存在した場合は単価を戻す。商品が見つからなかった場合には-1を戻す。 # Fruitクラスのdisplay()メソッドは、商品名、単価、個数から合計金額を計算して表示するメソッドである。商品が登録されていない場合はメッセージを表示する # ソース # shopping http://ime.nu/www.dotup.org/uploda/www.dotup.org1383033.java.html # fruit http://ime.nu/www.dotup.org/uploda/www.dotup.org1383034.java.html # ../test/read.cgi/tech/1267796762/870さん その通りです。完全に丸投げになりますがよろしくお願い致します。 # # '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する' :- 商品名と個数を入力すると(_商品名,_個数), 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額), 表示する(_商品名,_単価,_個数,_合計金額),!. '商品リストに登録されている商品名と個数を入力すると、商品名、単価、個数、合計金額を表示する'. 商品名と個数を入力すると(_商品名,_個数) :- user_parameters([_商品名,_個数文字列]), atom_to_term(_個数文字列,_個数,_),!. 商品名、単価、個数、合計金額を(_商品名,_単価,_個数,_合計金額) :- 商品名リスト(_商品名,_単価), _合計金額 is truncate(_単価 * _個数 + 0.5),!. 商品名、単価、個数、合計金額を(_商品名,_,_,_) :- '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名), fail. 表示する(_商品名,_単価,_個数,_合計金額) :- write_formatted('商品:%t\n',[_商品名]), write_formatted('単価:%t円 個数:%t個 合計:%t円\n',[_単価,_個数,_合計金額]),!. '商品が見つからなかった場合には、エラーメッセージを表示する'(_商品名) :- write_formatted('%tは商品ではありません。\n',[_商品名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/820 # # eventId / eventName / userId の3つのカラムがあるイベント登録用テーブル(tableE)があります。 # これに対して、 # reportId / reportTxt / userId / eventId の形のイベントの感想用テーブル(tableR)を作ってます。 # # この時 tableE.eventId==tableR.eventIdとしたいです。(※) # # この条件で、tableRへのinsertクエリを書くとしたらどうすべきでしょうか。 # プログラム(php)からはeventIdがパラメータ(getメソッド)で送られてくるので # 単純にその値をセットしてのinsertは出来るんですが、getメソッドのためユーザーが # いくらでもeventIdを変更できてしまいます # sql文だけで、(※)の条件を実現することは出来ますか? # サブクエリ?を使うのかなと思ったもののよくわかりません # # 登録時に他テーブルに存在するIDの既出チェックを行う(_reportId,_reportTxt,_userId,_eventId) :- 'TableE'(_eventId,_eventName,_userId), assertz('TableR'(_reportId,_reportTxt,_userId,_eventId)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/778 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 # あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 # を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 # ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 # プログラムの要件として、以下の事項を定める。 # ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 # ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 # # % cat length.dat # 2 3 4 5 10 # % ./a.out length.dat # 最大周長=12 (3 4 5) # 最短周長=9 (2 3 4) # # %cat length.dat # 4 5 10 20 # % ./a.out length.dat # 0 # program :- user_parameters([_ファイル名]), get_lines(_ファイル名,Lines), findall(N,( append(_,[Line|_],Lines), sqlit(Line,[' '],L2), append(_,[N|_],L2)), _棒の長さならび), 周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]), 周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]), write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]). fail. program. 周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :- 最大周長を得る(_棒の長さならび,_最大周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最大周長を得る(_棒の長さならび,_最大周長) :- findmax(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最大周長),!. 周囲が最短の三角形(_棒の長さならび,[A,B,C]) :- 最短周長を得る(_棒の長さならび,_最短周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最短周長を得る(_棒の長さならび,_最短周長) :- findmin(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最短周囲). 周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :- 組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]), 組み合わせ(_棒の長さならび,3,[A,B,C]), _周長 is A + B + C, C > A + B, B > A + C, A > B + C. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/580 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1 テキストファイルのコピーを作るプログラムを作れ  # 問題2 問題1について下記のようにコピー元とコピー先のファイル名を引数で指定できるようにプログラムを変更せよ # # ./a. out <コピー元ファイル名> <コピー先ファイル名> program :- user_parameters(L), L = [_コピー元ファイル,_コピー先ファイル], テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル). テキストファイルのコピーを作る(_コピー元ファイル,_コピー先ファイル) :- 入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream), 一文字づつコピーする(Instream,Outstream), 入出力ファイルのオープン(Instream,Outstream),!. テキストファイルのコピーを作る(_,_). 入出力ファイルのオープン(_コピー元ファイル,_コピー先ファイル,Instream,Outstream) :- 入力ファイルのオーブン(_コピー元ファイル,Instream), 出力ファイルのオープン(_コピー先ファイル,Outstream),!. 入力ファイルのオーブン(_コピー元ファイル,Instream) :- error_protect(open(_コピー元ファイル,read,Instream),fail),!. 入力ファイルのオーブン(_コピー元ファイル,Instream) :- write_formatted('コピー元ファイル %t はオープンてきません\n',[_コピー元ファイル]), fail. 出力ファイルのオーブン(_コピー先ファイル,Outstream) :- error_protect(open(_コピー先ファイル,write,Outstream),fail),!. 出力ファイルのオーブン(_コピー先ファイル,Outstream) :- write_formatted('コピー先ファイル %t はオープンてきません\n',[_コピー先ファイル]), fail. 一文字づつコピーする(Instream,Outstream) :- at_end_of_stream(Instream),!. 一文字づつコピーする(Instream,Outstream) :- get_char(Instream,Char), put_char(Outstream,Char), 一文字づつコピーする(Instream,Outstream). 入出力ファイルのクローズ(Instream,Outstream) :- close(Instream), close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/613 # # MySQLダンプ内の # # /*------------------ここから--------------------*/ # DROP TABLE IF EXISTS `table100`; # /*!40101 SET @saved_cs_client = @@character_set_client */; # /*!40101 SET character_set_client = utf8 */; # CREATE TABLE `table100` ( # `code1` varchar(5) default NULL, # `zip1` varchar(7) default NULL, # `address1` varchar(250) default NULL, # `address2` varchar(250) default NULL, # `div_1` varchar(1) default NULL, # `div_2` varchar(1) default NULL, # `import_date` timestamp NULL default NULL, # `rec_key1` int(10) unsigned NOT NULL auto_increment, # PRIMARY KEY (`rec_key1`) # ) ENGINE=InnoDB AUTO_INCREMENT=121471 DEFAULT CHARSET=eucjpms; # /*!40101 SET character_set_client = @saved_cs_client */; # /*------------------ここまで--------------------*/ # # `table100` → `TABLE100` # `code1` → `CODE1` # など逆クォートで囲まれた小文字→大文字変換を一括で行いたいです。。 # できればlinux コマンドライン、perl などでお願いします。。 # '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_変換した文字列) :- sub_atom(_文字列,St,Len,_,S1,S2,S3,L1,['`'|R2],['`'|R3]), \+(append(_,['`'|_],R2)), concat_atom(R2,S22), to_upper(S22,_大文字化した文字列), concat_atom(S1,'`',_大文字化した文字列,'`'],_変換した文字列1), concat_atom(R3,_残り文字列), '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_残り文字列,_変換した文字列2), atom_concat(_変換した文字列1,_変換した文字列2,_変換した文字列),!. '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/329 # # 【質問テンプレ】 # [1] 授業単元: Cプログラミン # [2] 問題文(含コード&リンク): #     四則演算をコマンドラインから入力して答えを出せ。 #     例)keisan.exe 4 x 7 + 2 - 20 / 2 # 答え:20 # program :- user_parameters([_パラメータ]), atom_to_term(_パラメータ,_式,_), _答え is _式, write_formatted('答え: %t\n',[_値]), halt. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/830 # # [1]授業単元:OS # [2]問題: # # Cygwinで解答を作成してください. # 1. 引数にファイル名を指定すると, # そのファイルのサイズとファイルの種類(一般ファイル,ディレクトリ,パイプ等), # そして最終変更時刻を表示するコマンド(fviewという名称とする)を作成せよ. # ただし,引数には,複数のファイルを指定できるようにすること. # また,fstatを用いること. # # 実行 # $ fview aaa.txt bbb.txt ccc.txt … # ヒント # ファイルの種類は,fstat構造体メンバのst_modeの上位4ビットで表わされる. # program :- user_parameters(_user_parameters), '引数にファイル名を指定すると,そのファイルのサイズとファイルの種類(一般ファイル,ディレクトリ,パイプ等),そして最終変更時刻を表示する'([fview,_ファイル名]) :- get_file_info(_ファイル名,L), サイズを取得(L,_サイズ), 種類を取得(L,_種類), 最終変更時刻(L,_最終変更時刻), write_formatted('サイズ: %t\n',[_サイズ]), write_formatted('種類: %t\n',[_種類]), write_formatted('最終変更時刻: %t\n',[_最終変更時刻]),!. サイズを取得(L,_サイズ) :- append(_,[size(_サイズ)|_],L),!. 種類を取得(L,ファイル) :- append(_,[mode(_mode)|_],L), append(_,[ifreg|_],_mode),!. 種類を取得(L,ディレクトリ) :- append(_,[mode(_mode)|_],L), append(_,[ifdir|_],_mode),!. 種類を取得(L,パイブ) :- append(_,[mode(_mode)|_],L), append(_,[ifdir|_ifpipe],_mode),!. 最終変更時刻(L,_最終変更時刻) :- append(_,[atime(_atime)|_],L), localtime(_atime,_年,_月,_日,_,_,_,_時,_分,_秒), concat_atom([_年,'-',_月,'-',_日,' ',_時,':',_分,':',_秒],_最終変更時刻). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/831 # # 2. 引数に指定した複数のテキストファイルの内容を結合して, # 一つのファイルにまとめるコマンド(catfilesという名称とする)を作成せよ. # ただし,まとめた内容を格納するファイル名は,“concat.txt”とすること. # ただし,catコマンドをsystem関数の内部で呼ぶような構成は認めない. # システムコールとしては,open,close,read,writeを用いること. # また,結合してまとめた結果を格納するファイルが存在しない場合には, # creatシステムコールを用いて生成すること. # # 実行 # $ catfiles aaa.txt bbb.txt ccc.txt … # # program :- '引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマンド(catfilesという名称とする)を作成する。ただし,まとめた内容を格納するファイル名は,“concat.txt”とるすこと', halt. '引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマンド(catfilesという名称とする)を作成する。ただし,まとめた内容を格納するファイル名は,“concat.txt”とすること' :- '引数に指定した複数のテキストファイルの内容を'(_ファイルならび), 'まとめた内容を格納するファイル名は,"concat.txt"とする'(Outstream), '結合して,一つのファイルにまとめる'(_ファイルならび,Outstream). '引数に指定した複数のテキストファイルの内容を'(_ファイルならび) :- user_parameters([catfiles|_ファイルならび]). 'まとめた内容を格納するファイル名は,"concat.txt"とする'(Outstream) :- open('concat.txt',write,Outstream,[type(binary)]). '結合して,一つのファイルにまとめる'([],Outstream) :- close(Outstream),!. '結合して,一つのファイルにまとめる'([_ファイル|R],Outstream) :- file_test(_ファイル,read), open(_ファイル,read,Instream,[type(binary)]), get_byte(Instream,Code), バイナリコピー(Instream,Outstream,Code), '結合して,一つのファイルにまとめる'(R,Outstream),!. '結合して,一つのファイルにまとめる'([_ファイル|_],Outstream) :- write_formatted('オープンファイルエラーが発生しました ファイル名=%q\n',[_ファイル]), write('結合を中止します\n'), close(Outstream),!. バイナリコピー(Instream,Outstream,(-1)) :- !. バイナリコピー(Instream,Outstream,Code) :- put_byte(Outstream,Code), get_byte(Instream,Code2), バイナリコピー(Instream,Outstream,Code2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/747 # # [1] 授業単元:C言語 # [2] # 1.コピー元のファイル名とコピー先のファイル名を指定すると、ファイルの内容をコピーするプログラムを作成せよ。コピー元のファイルが存在しない場合と、コピー先が存在する場合は、その旨のメッセージを表示し処理を中止するようにせよ。 # 例:mycopysource.txt dest.txt # →source.txtの内容がdest.txtにコピーされる。 # 2.コマンドラインでファイル名、年、月を指定し、そのファイルにその年・月のカレンダーを出力するプログラムを作成せよ。 # 例:calendar cal1012.txt 2010 12 # →ファイルcal1012.txt に2010年12月のカレンダーを出力する(このファイルも添付して提出すること) # program :- user_parameters([_コピー元のファイル名,_コピー先のファイル名]), ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名). ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名) :- 読み出し可能(_コピー元のファイル名), 書き出し可能(_コピー先のファイル名), open(_コピー先のファイル名,read,Instream,[type(binary)]), open(_コピー先のファイル名,write,Outstream,[type(binary)]), get_byte(Instream,Code), ファイルの内容をコピー(Instream,Outstream,Code), close(Outstream), close(Instream),!. ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名). 読み出し可能(_コピー元のファイル名) :- get_file_info(_コピー元のファイル名,_), file_test(_コピー元のファイル名,read),!. 読み出し可能(_コピー元のファイル名) :- \+(get_file_info(_コピー元のファイル名,_)), write('コピー元のファイル %t が存在しません。\n',[_コピー元のファイル名]),!, faii. 読み出し可能(_コピー元のファイル名) :- get_file_info(_コピー元のファイル名,_), write('コピー元のファイル %t は存在しますが読み出し不能です。\n',[_コピー元のファイル名]),!, fail. 書き出し可能(_コピー先のファイル名) :- get_file_info(_コピー先のファイル名,_),!, write_formatted('コピー先のファイル %t は既に存在するため作業を中止します。\n',[_コピー先のファイル名]),!, fail. 書き出し可能(_コピー先のファイル名) :- \+(get_file_info(_コピー先のファイル名,_)), file_test(_コピー先のファイル名,write),!. 書き出し可能(_コピー先のファイル名) :- write_formatted('コピー先のファイル パス %t が存在しません。\n',[_コピー先のファイル名]),!, fail. ファイルの内容をコピー(Instream,Outstream,-1) :- !. ファイルの内容をコピー(Instream,Outstream,Code) :- put_byte(Outstream,Code), get_byte(Instream,Code2), ファイルの内容をコピー(Instream,Outstream,Code2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/725 # # 流れ変えがてら先生方お願いします # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):main関数中の実数配列(要素数は任意)の要素の平均と分散を計算してmain関数にその結果を返し、 # main関数でその結果を表示するmain関数と平均、分散を計算する関数を作り、下の例について実行しなさい。 # # データ{50.0, 62.0, 80.0, 90.5, 99.5} # # program :- main, halt. main :- user_parameters(_データならび), 平均(_データならび,_平均), 分散(_データならび,_分散), write_formatted('パラメータによって入力されたデータの 平均は%t,分散は%tでした。\n',[_平均,_分散]),!. 平均(_データならび,_平均) :- length(L,N), 平均(L,N,0.0e+00,M). 平均([],N,S,M) :- M is S / N,!. 平均([A|R],N,S,M) :- S1 is S + A, 平均(R,N,S1,M). 分散(L,V) :- length(L,N), 算術平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/620 # # [1] 授業単元:プログラミング及び演習 # [2] 問題文(含コード&リンク):コマンド名 vhswitch に続く記号「-n」の後に「繰り返し数」を、「-s」の後に「文字列」 # を、さらに「-v」または「-h」を書きます。 # コマンドラインから次のように入力します。スイッチ「-v」が入力された場合は垂直方向に文字列を表示します。 # 例) $./vhswitch -n 3 -s "abcdef" -v <Enter> # abcdef # abcdef # abcdef # 一方。スイッチ「-h」が入力された場合は水平方向に文字列を表示します。 # 例)$./vhswitch -s "abcdef" -h -n 3 <Enter> # # このような実装をするプログラムを書け。 # 〜プログラムの一部分の骨子〜 #  http://ime.nu/codepad.org/pXaw5yU8 # # 'コマンド名 vhswitch に続く記号「-n」の後に「繰り返し数」を、「-s」の後に「文字列」を、さらに「-v」または「-h」を書きます。コマンドラインから次のように入力します。スイッチ「-v」が入力された場合は垂直方向に文字列を表示します。' :- user_parameters(L), パラメータで指定された繰り返し数(L,_繰り返し数), パラメータで指定された文字列(L,_文字列), 'パラメータで指定された-vまたは-hオプション'(L,_v_または_h), length(Ln,_繰り返し数), 文字列を表示する(Ln,_文字列,_v_または_h). パラメータで指定された文字列(L,_文字列) :- append(_,[['-s',S|_],_,L),!. パラメータで指定された繰り返し数(L,_繰り返し数) :- append(_,[['-n',_繰り返し数|_],_,L),!. 'パラメータで指定された-vまたは-hオプション'(L,v) :- append(_,[['-v'|_],L),!. 'パラメータで指定された-vまたは-hオプション'(L,h) :- append(_,[['-h'|_],L),!. 文字列を表示する([],_,_) :- !. 文字列を表示する([_|Ln],_文字列,v) :- atom_chars(_文字列,Chars), append(_,[_文字|_],Chars), write_formatted('%t\n',[_文字]), 文字列を表示する(Ln,_文字列,v). 文字列を表示する([_|Ln],_文字列,h) :- write_formatted('%t\n',[_文字列]), 文字列を表示する(Ln,_文字列,v). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/669 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):コマンドライン./a.out <オプション> <引数1> <引数2> # について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、 # <オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示するプログラムを作れ。 # program :- 'コマンドライン./a.out <オプション> <引数1> <引数2>について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、<オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示する'. 'コマンドライン./a.out <オプション> <引数1> <引数2>について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、<オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示する' :- user_parameters(L), オプションの取得(L,_オプション), 引数1と引数2を取得(L,_引数1,_引数2), オプションによって機能の選択と実行(_オプション,_引数1,_引数2),!. オプションの取得(L,_オプション) :- append(_,[_ハイフン付きオプション|_],L), sub_atom(_ハイフン付きオプション,0,1,Len,'-'), sub_atom(_ハイフン付きオプション,1,Len,_オプション),!. 引数1と引数2を取得(_ユーザパラメータ,_引数1,_引数2) :- findall(_引数,( append(_,[_引数|_],_ユーザパラメータ), \+(sub_atom(_ハイフン付きオプション,0,1,Len,'-'))),[_引数1,_引数2]). オプションによって機能の選択と実行(cat,_引数1,_引数2) :- atom_concat(_引数1,_引数2,_連結した文字列), write_formatted('%t\n',[_連結した文字列]),!. オプションによって機能の選択と実行(cmp,_引数,_引数) :- write('same\n'),!. オプションによって機能の選択と実行(cmp,_引数1,_引数2) :- \+(_引数1=_引数2), write('diff\n'),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/825 # # すいませんが823は書き間違えました # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # ・ランダムな整数列を生成し,選択ソートにより並べ替えるプ # ログラムを作れ。 # (randを使用すること) # •またその実行時間を計測せよ # – UNIXのtime コマンドを使用すること # program :- user_parameters([A]), atom_to_term(A,_要素数,_), ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列), halt. ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列) :- ランダムな整数列を生成し(_要素数,_整数列), 選択ソート(_整数列,_整列された整数列). ランダムな整数列を生成し(_要素数,_整数列) :- length(_整数列,_要素数), ランダムな整数列を生成し(_整数列). ランダムな整数列を生成し([]) :- !. ランダムな整数列を生成し([_ランダムな数|R]) :- _ランダムな数 is random, ランダムな整数列を生成し(R). 選択ソート([],[]) :- !. 選択ソート(L1,L2) :- min(L1,Min), 選択ソート(Min,L1,L2). 選択ソート(_,[A],[A]) :- !. 選択ソート(Min,[Min|R],[Min|L2]) :- min(R,Min2), 選択ソート(Min2,R,L2),!. 選択ソート(Min,L1,[Min|L2]) :- append([A0|R0],[Min|R],L1), append(R0,[A0|R],L3), min(L3,Min2), 選択ソート(Min2,L3,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/728 # # [1] 授業単元:中級プログラミング # [2] 問題文(含コード&リンク):0から99までの範囲で整数の乱数を1000個、配列mとして生成させた後、ターゲットとなる整数を1つ定めて検索する。ターゲット数はコマンド引数 (プログラム開始時に与える引数 argv)として与える。 # 何番目の数字でターゲット整数が見つかるか、番兵を使わない関数 NonSentinel と、番兵を使う関数 Sentinel の 2つで求めるプログラムを完成させなさい。 # # #include # #include # #define LENGTH 1001 // 以降のLENGTH はすべて1001 に置き換えられる # #define MAX 100 // 以降のMAX はすべて100 に置き換えられる # /*---------------------------------------------- # prototypes # -----------------------------------------------*/ # void GenerateNumbers(int* m, int n); # int Sentinel(int target, int* m, int n); # int NoSentinel(int , int* , int ); # /*---------------------------------------------- # search target number from an array # with and without sentinel # -----------------------------------------------*/ # int main(int argc, char** argv) # { # int m[LENGTH]; // 番兵のために一つ余分に配列をとる # int target; # target = strtol(argv[1], NULL, 0); //2nd input to be the target # GenerateNumbers(m, LENGTH-1); # printf("no-banpei %d, banpei %d\n", NoSentinel(target, m, LENGTH-1), Sentinel(target, return 0; # }/ # *---------------------------------------------- # Search without Sentinel # input # int targe; # int m[]; # int n; number of elements # output # return ii; position of the value # -1; no position for the letter # -----------------------------------------------*/ # int NoSentinel(int target, int* m, int n) # { # // ここを作る # }/ # *---------------------------------------------- # Search with Sentinel # input # int targe; # int m[]; # int n; number of elements # output # return ii; position of the value # n; no position for the letter # -----------------------------------------------*/ # int Sentinel(int target, int* m, int n) # { # // ここを作る # }/ # *---------------------------------------------- # ** # Random number generator # * Generate n random numbers ranging from 0 to 100 # * and stored in m[]. # * input/output int m[]; # * input int n; # *-----------------------------------------------*/ # 40 # void GenerateNumbers(int* m, int n) # { # int ii; # for (ii=0; ii% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/464 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下のような動作をするプログラムを作成せよ。 # ・main()関数の引数を用いて整数値xを与える。 # ・fgetsを用いて、標準入力(キーボード)から英単語と英文字cを与える。 # ・英単語のx番目以降の文字をcに変える関数を作って使用する。 # ・変更された英単語と整数値を使って文字列"変更された後の英単語_整数値"を作る # ・puts()またはfputs()を用いて出力 # 実行例:./a.out 5 キーボード入力:information p 実行結果(表示):infoppppppp_5 # 英単語のx番目以降の文字をcに変える :- user_parameters([Arg]), atom_to_term(Arg,_x番目,_), 英単語と文字cの入力(_英単語,_c), 英単語のx番目以降の文字をcに変える(_英単語,_x番目,_c,_変換された英単語), write_formatted('%t\n',[_変換された英単語]). 英単語と文字cの入力(_英単語,_c) :- write('英単語を入力してください : '), get_line(_英単語), write('置換する文字cを入力してください : '), get_char(_c). 英単語のx番目以降の文字をcに変える(_英単語,_x番目,_c,_変換された英単語) :- sub_atom(_英単語,0,_x番目,R,_副文字列_1), length(L,R), all(L,_c), concat_atom(L,S), concat_atom([_副文字列_1,S],_変換された英単語). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/465 # # 【 課題 】 # 􀂄 2.3 完全数とはその数の約数の和がその数に等しい数. # 例) 6 = 1 + 2 + 3. 引数が完全数かを判定する # PerfectNumber.javaを書け. # 􀂉 実行例) PerfectNumber 28 # 1 2 4 7 14 = 28 is perfect number # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】10/27 am9:20まで # 【 Ver  】】"1.6.0_22" # 【 補足 】初心者なのでわからないことだらけです # 宜しくお願いします # # program :- user_parameters(_パラメータ), _パラメータ = [Atom], atom_to_term(Atom,N,_), 完全数かを判定する(N). 完全数かを判定する(N) :- findall(M,( for(1,M,N), \+(M=N), 0 is N mod M), L), sum(L,Sum), N is truncate(Sum), conat_atom(L,' + ',S), write_formatted('%t = %t 完全数です\n',[S,N]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/465 # # 【 課題 】 # 􀂄 2.2 IfLadder.javaを書換え,2桁の数値をカナで読む # IfLadder2.javaを書け. # 􀂉 実行例) > \IfLadder>java IfLadder4 2 # 2 はニー # \IfLadder>java IfLadder4 73 # 73 はナナサン program :- user_parameters(_パラメータ), _パラメータ = [Atom], atom_to_term(Atom,_2桁の数値,_), _2桁の数値 >= 10, _2桁の数値 =< 99, '2桁の数値をカナで読む'(_2桁の数値). '2桁の数値をカナで読む'(_2桁の数値) :- number_chars(_2桁の数値,L), append(_,[A|R],L), 数字カナ読み(A,_カナ読み), write_formatted('%t',[_カナ読み]), R = []. 数字カナ読み('0',ゼロ). 数字カナ読み('1',イチ). 数字カナ読み('2',ニー). 数字カナ読み('3',サン). 数字カナ読み('4',シー). 数字カナ読み('5',ゴー). 数字カナ読み('6',ロク). 数字カナ読み('7',シチ). 数字カナ読み('8',ハチ). 数字カナ読み('9',クー). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/465 # # 【 課題 】 # 􀂄 2.1 CommandLine.javaを書換え, # 全ての引数の和を計算するCommandLine3.javaを書け. # 􀂉 実行例) $ java CommandLine3 1 2 3 # + 1 + 2 + 3 = 6 program :- user_parameters(_パラメータならび), 全ての引数の和を計算する(_パラメータならび,_全ての引数の和), concat_atom(_パラメータならび,'+',_パラメータ表示), write_formatted('%t = %t\n',[_パラメータ表示,_全ての引数の和]). 全ての引数の和を計算する(_パラメータならび,_全ての引数の和) :- findall(N,( append(_,[A|_],_パラメータならび), atom_to_term(A,N,_), integer(N)), L), sum(L,_全ての引数の和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/374 # # 【 課題 】 コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、 # txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合には # FileChooser を使ってファイル名を自由に取得できるようにしなさい。 # 【 補足 】.txtという拡張子の時でもFileChooserが動いてしまうので、 # それをどうにか直したいのですが、うまくいきません。 # 以下がソースです。 # http://ime.nu/www.geocities.jp/lang_lang_true/ss.txt # prolog :- 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。'. 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。' :- user_parameters([_ファイル名]), '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名),!. 'コマンドラインからファイル名を受け取り、拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい。また、コマンドラインからファイル名が与えられなかった場合にはFileChooser を使ってファイル名を自由に取得できるようにしなさい。' :- \+(user_parameters([_])), ファイル名指定(_ファイル名), '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名),!. '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名) :- atom_suffix(_ファイル名,4,'.txt'), get_lines(_ファイル名,Lines), put_lines(Lines). '拡張子が txt の場合は内容を表示し、txt でない場合はファイル情報を表示しなさい'(_ファイル名) :- \+(atom_suffix(_ファイル名,4,'.txt')), get_file_info(_ファイル名,_ファイル情報ならび), write_formatted('%t\n',[_ファイル情報ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/570 # # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # 標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換 # して標準出力するプログラムを作成せよ。 # ただし最後の引数の文字列が現れた場合は最初に指定された文字列に # 置換するものとする。 # また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が # 現れたものと解釈する。 # # *入力文字に非ASCII文字が含まれないとして良い # '標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して標準出力する。ただし最後の引数の文字列が現れた場合は最初に最初に指定された文字列に置換するものとする。また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が現れたものと解釈する。' :- user_parameters(_指定文字列ならび), _指定文字列ならび = [A|R1], append(_指定文字列ならび,[A],_指定文字列ならびの二), 置換述語の生成(_指定文字列ならびの二), '標準入力を読み込み'(Chars), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars,Chars2), put_chars(Chars2). 置換述語の生成([_]) :- !. 置換述語の生成([_文字列1,_文字列2|R]) :- atom_chars(_文字列1,Chars1), atom_chars(_文字列2,Chars2), atom_length(_文字列1,Len), append(_文字列1,R1,L1), append(_文字列2,R2,L2), assertz((置換述語(L1,R1,Len,L2,R2))), 置換述語の生成([_文字列2|R]). 標準入力を読み込み(Chars) :- get_chars(Chars). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars1,Chars2x) :- findmax([Len,R1,Char2,R2],置換述語(Chars1,R1,Len,Char2,R2),[Lenx,R1x,Char2x,R2x]), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1x,R2x). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'([A|R1],[A|R2]) :- '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1,R2). 標準出力する(Chars) :- concat_atom(Chars,Atom), write(Atom). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/566 # # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # テキストファイルを読み込み、指定された文字列を検索し、指定文字列が含まれている行を抽出して出力するプログラムを作成せよ。 # プログラムの実行および引数は以下の通りである。 # 実行ファイル名 入力ファイル名 検索文字列 出力ファイル名 # # *1行50文字×1000行以上扱えること # program :- user_parameters([_入力ファイル名,_検索文字列,_出力ファイル名]), テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名). テキスト検索(_入力ファイル名,_検索文字列,_出力ファイル名) :- get_lines(_入力ファイル名,L), findall(_行,( append(_,[_行|R],L), 行検索(_行,_検索文字列)), _検索した行ならび), put_lines(_出力ファイル名,_検索した行ならび). 行検索(_行,_検索文字列) :- sub_atom(_行,_,_,_,_検索文字列),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1279286575/358 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):入力ファイルと出力ファイル名をコマンドラインから入力してコピーするプログラムを作成せよ。 # program :- 入力ファイルと出力ファイル名をコマンドラインから入力してコピーする. 入力ファイルと出力ファイル名をコマンドラインから入力してコピーする :- user_parameters([_入力ファイル,_出力ファイル]), open(_入力ファイル,read,Input,[type(binary)]), open(_出力ファイル,write,Output,[type(binary)]), コピーする(Input,Output), close(Output), close(Input). コピーする(Input,Output) :- 終了(Input),!. コピーする(Input,Output) :- get_byte(Input,C), put_byte(Output,C), コピーする(Input,Output). 終了(Stream) :- at_end_of_stream(Stream). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/317 # # [1] 授業単元:プログラミング言語 # [2] # リストに格納したデータを,データファイルとは # 別のファイル(出力先ファイルとよぶ)に書き出す. # データファイルと出力先ファイルのファイル名は # コマンドライン引数として指定する # 下記テンプレートを使用すること # http://ime.nu/codepad.org/d9CUmfae # program :- user_parameters([_データファイル,_出力先ファイル]), get_chars(_データファイル,Chars), put_chars(_出力先ファイル,Chars). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/138 # # 1] 授業単元:システムコール # [2] 問題文(含コード&リンク): # コマンドライン引数で指定された文字列のいずれかと一致する名前の環境変数についてのみ、 # #include <stdio.h> # #include <stdlib.h> # extern char **environ; # main() # { # char **p; # for (p = environ; *p != NULL; p ++) { # printf("%s\n", *p);} # return 0;} # や # #include <stdio.h> # #include <stdlib.h> # main(int argc, char *argv[], char *envp[]) # { # char **p; # for (p = envp; *p != NULL; p ++) { # printf("%s\n", *p);} # return 0;} # のように変数名と値を表示するプログラムを書け。 # ただし、コマンドライン引数に重複があっても、対応する環境変数について複数回表示してはならない #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語:C # [4] 期限:2010年5月24日12:59まで # [5] その他の制限:特になし # よろしくお願いします # # program :- user_parameters(L), append(_,[_環境変数名|R],L), 環境変数の表示(_環境変数名), R = []. 環境変数の表示(_環境変数名) :- getenv(_環境変数名,_値), write_formatted('%t=%t\n',[_環境変数名,_値]),!. 環境変数の表示(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/143 # # [1] データ構造とプログラミング # [2] # 演習問題4.5 逆ポーランド記法による入力文字列(空白で区切られている)に対して、 # 16進数と10進数で答えを返すプログラムrpnを作りなさい。 # (入力例)rpn 5 2 + 7 * # (出力例)0x31, 49(decimal) # program :- user_parameters(L), 逆ポーランド記法による演算(L,[],X), 'N進数'(16,4,X,_16進表示), write_formatted('0x%t, %t(decimal)\n',[_16進表示,X]). 逆ポーランド記法による演算([],[X|_],X) :- !. 逆ポーランド記法による演算([N|R1],Stack1,X) :- atom_to_term(N,N1,_), number(N1), 逆ポーランド記法による演算(R,[N1|Stack1],X) :- 逆ポーランド記法による演算([_演算記号|R],[A,B|Stack1],X) :- member(_演算記号,[+,-,*,/]), F =.. [_演算記号,A,B], X is F, 逆ポーランド記法による演算(R,[C|Stack1],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/595 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # sum(Sum) :- user_parameters(L), findall(N,(member(A,L),atom_to_term(A,N,_)),L2), sum_2(L2,Sum). sum_2([],0) :- !. sum_2([N|R],X) :- sum_2(R,Y),X is N + Y. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/75 # # [1] 授業単元:C言語プログラミング # [2] 問題文:コマンドライン引数に指定された文字列それぞれが # 16進数表記で表された0以上100万以下の整数であ # るをことをチェックした後、それを12進数に # 変換したものを表示するプログラムをつくれ # 16進数表記の先頭の0xはなくても良いがあってもエラーに # してはならない。16進数表記になっていない、あるいは # 指定された範囲に無い場合はその旨表示する。 # program :- user_parameters(L), append(_,[A|R],L), to_upper(A,A1), '100万以下の16進文字表現'(A1), '16進文字列表現を10進整数に変換'(A1,A1,_10進整数), 'N進数'(12,_10進整数,X), write_formatted('%t\n',[X]), fail. program. '16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :- atom_chars(_16進文字列表現,L), '16進文字列表現を整数に変換'(L,0,_整数),!. '16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :- write_formatted('%tは適切な16進文字列表記ではありません\n',[_16進文字列表現]),!. '16進文字列表現を10進整数に変換'([],X,X) :-!. '16進文字列表現を10進整数に変換'([A|R],Y,X) :- N進数利用文字(M,A), Y2 is 16 * Y + M, '16進文字列表現を10進整数に変換'(R,Y2,X). '100万以下の16進文字表現'(A) :- '16進文字列表現'(A,B), sub_atom(B,_,Len,_,B), Len < 5,!. '100万以下の16進文字表現'(A) :- '16進文字列表現'(A,B), sub_atom(B,_,5,_,B), B @=< 'F4240'. '16進文字列表現'(A,A) :- \+(sub_atom(A,0,2,R,'0X')),!. '16進文字列表現'(A,B) :- sub_atom(A,0,2,R,'0X'), sub_atom(A,2,R,_,B). N進数(N,_10進数,_N進数文字列) :- N進数(N,_10進数,[],X), concat_atom(X,_N進数文字列). N進数(N,J,Y,[M|Y]) :- J < N,N進数利用文字(J,M),!. N進数(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, N進数利用文字(M,M2), N進数(N,J2,[M2|Y],X). N進数利用文字ならび(N,_利用文字ならび) :- length(L1,N), findall(A,N進数利用文字(_,A),L), append(L1,_,L). N進数利用文字(0,'0'). N進数利用文字(1,'1'). N進数利用文字(2,'2'). N進数利用文字(3,'3'). N進数利用文字(4,'4'). N進数利用文字(5,'5'). N進数利用文字(6,'6'). N進数利用文字(7,'7'). N進数利用文字(8,'8'). N進数利用文字(9,'9'). N進数利用文字(10,'A'). N進数利用文字(11,'B'). N進数利用文字(12,'C'). N進数利用文字(13,'D'). N進数利用文字(14,'E'). N進数利用文字(15,'F'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/94 # # 【 課題 】※出力結果 # java Kadai3 1 2 3 # わん # にゃー # ぶー # # java Kadai3 2 1 1 # にゃー # わん # わん # # ※条件 # クラスは5つ # 配列を使用 # # 【 形態 】1. Javaアプリケーション(main()で開始)? # 【 GUI  】 # 【 期限 】 火曜日に提出 # 【 Ver  】java version "1.6.0_16" # Java(TM) SE Runtime Environment (build 1.6.0_16-b01) # Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing) # # 【 補足 】 なんか凄く初歩的で申し訳ない・・ # 自分なりに考えた結果のソースを上げときました # 何か勘違いしてそうですが。 # 何かしら助け舟をくださるとありがたいです。 # よろしくお願いします # # http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/969.zip # # 鳴き声('1',わん). 鳴き声('2',にゃー). 鳴き声('3',ぶー). program :- user_parameters(_ユーザ引数ならび), append(_,[_ユーザ引数|R],_ユーザ引数ならび), 鳴き声(_ユーザ引数,_鳴き声), write_formatted('%t\n',[_鳴き声]), R=[]. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/256 # # [1] 授業単元: 並列プログラミング # [2] 問題文(含コード&リンク): 配列をソートするために、クイックソートをMPIを用いて並列化せよ。 # % Prolog 友人(AZ-Prologの開発者)に解答を依頼したところ掲載してよいからとメールがきました。 % AZ-Prologの並列機能を使っています。 % 同様に偶数のNプロセスでソートすることもできます。 % 方法1) % 子プロセスのソート部分は従来のqsortそのままで、親がわであらかじめN個の % PartitionでN個のリストを作ってから並列実行させる。 % 方法2) % 深さ指定のパラメータをわたし、子側でさらに孫をつくるか、自分でソートするか % 分岐をいれておく。 % % % 2プロセスでソートする最も簡単な並列化です。 % ただし、データのプロセス間通信コストが発生するのであまりいい例ではありません。 % (このように単純なプログラムではシングルでソートしたほうが早い場合が多い!?) /* qsort.pl qsort を2プロセス並列で解を求める | ?- mlt_quick_sort([5,4,1,8,4,0,9],Ans). A = [0,1,4,4,5,8,9] yes 軽い説明: mlt_send(Prc,[[Goal,ReturnValue],[Goal2,ReturnValue2]...]) Procの個数分ゴールと戻し値を設定する mlt_receive(Proc,[ReturnValue,ReturnValue2....]) mlt_sendで起動した順、設定された戻し値がユニファイされ る */ mlt_quick_sort([A|L],Ans):- mlt_proc(2,prolog_c,'',consult('qsort.pl'),Proc), % 2つの子プロセスを立ち上げる partition(A,L,Ls,Lb), % 元データを2つに分割する mlt_send(Proc, [[qsort(Ls,X),X],[qsort(Lb,Y),Y]]), % 2つのリストを2つのプロセスで並列ソート mlt_receive(Proc,[ Ans-[A|Else], Else-[] ]), % 結果を起動順に受け取る(上のサブゴールの X,Y ) mlt_kill(Proc). % 子プロセスを削除する %%%%% Quick Sort %%%%% quick_sort(List,Ans):-qsort(List,Ans-[]). qsort([X|L],Ans-Tail):- !,partition(X,L,Lsmall,Lbig), qsort(Lsmall,Ans-[X|Else]), qsort(Lbig,Else-Tail). qsort([],L-L). partition(X,[A|L],Ls,[A|Lb]):-X @< A,!,partition(X,L,Ls,Lb). partition(X,[A|L],[A|Ls],Lb):-!,partition(X,L,Ls,Lb). partition(_,[],[],[]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/362 # # ../test/read.cgi/tech/1263824755/361 # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 # (実行) # >free1.exe test.txt test2.txt # # でしょ? # # program :-   user_parameters([FileIn,FileOut]),   open(FileIn,read,Input,[type(binary)]),   open(FileOut,write,Output),   get_byte(Input,C),   free1(0,Input,Output,C),   close(Output),   close(Input). free1(_,_,_,-1) :- !. free1(16,Input,Output,C) :-   write(Output,'\n'),   free1(0,Input,Output,C),!. free1(M,Input,Output,C) :-   free1(M,Input,Output,C) :-   N進数(16,C,A),   write(Output,A),   get_byte(Input,C2),   M2 is M + 1,   free1(M2,Input,Output,C2). % N進数/3の定義は http://nojiriko.asia/prolog/j68_493.html 参照 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/216 # # [1] 授業単元: オペレーティングシステム # [2] 問題文(含コード&リンク): #  2. 引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマ #    ンド(catfiles という名称とする)を作成せよ.ただし,まとめた内容を格納するファイル名は, #    “concat.txt”とすること.ただし,cat コマンドをsystem 関数の内部で呼ぶような構成は認め #    ない.システムコールとしては,open,close,read,write を用いること.また,結合してまとめ #    た結果を格納するファイルが存在しない場合には,creat システムコールを用いて生成するこ #    と. # #    実行 #    $ catfiles aaa.txt bbb.txt ccc.txt … # # program :- user_parameters(_パス名ならび), open('concat.txt',write,Output1), close(Output1), open('concat.txt',append,Output), ファイルを書き加える(Output,_パス名ならび), close(Output), halt. ファイルを書き加える(Output,[]) :- !. ファイルを書き加える(Output,[_パス名|R]) :- open(_パス名,read,Input), get_char(C), 一文字づつ書き加える(Input,Output,C), close(Input), ファイルを書き加える(Output,R). 一文字づつ書き加える(_,_,end_of_file) :- !. 一文字づつ書き加える(Input,Output,C) :- put_char(Output,C), get_char(Input,C2), 一文字づつ書き加える(Input,Output,C2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/216 # # [1] 授業単元: オペレーティングシステム # [2] 問題文(含コード&リンク): #  1. 引数にファイル名を指定すると,そのファイルのサイズとファイルの種類(一般ファイル,デ #    ィレクトリ,パイプ等),そして最終変更時刻を表示するコマンド(fview という名称とする)を作 #    成せよ.ただし,引数には,複数のファイルを指定できるようにすること.また,fstat システム #    コールを用いること. # #    実行 #    $ fview aaa.txt bbb.txt ccc.txt … #    ヒント #    ファイルの種類は,fstat 構造体メンバのst_mode の上位4 ビットで表わされる. # program :-   user_parameters(_パス名ならび),   write('パス名,サイズ,種類,最終変更時刻\n'),   ファイル情報を表示する(_パス名ならび),   halt. ファイル情報を表示する([]) :- !. ファイル情報を表示する([_パス名|R]) :-   ファイル情報を得る(_パス名,_サイズ,_種類,_最終変更時刻),   write_formatted('%t,%t,%t,%t,%t\n',[_パス名,_サイズ,_種類,_最終変更時刻]),   ファイル情報を表示する(R). ファイル情報を得る(_パス名,_サイズ,_種類,_最終変更時刻) :-   get_file_info(_パス名,[dev(Dev),ino(Ino),mode(Modes),nlink(Nlink),uid(Uid),uname(Uname),gid(Gid),gname(Gname),size(_サイズ),atime(Atime),mtime(Mtime),ctime(_最終変更時刻),blksize(Blksize),blocks(Blocks)]),   member(FI,Modes),   sub_atom(FI,0,2,_,if),   ファイル種類(FI,_種類). ファイル種類(ifblk,ブロックファイル). ファイル種類(ifchr,キャラクタファイル). ファイル種類(ififo,パイプ). ファイル種類(ifreg,一般ファイル). ファイル種類(ifdir,ディレクトリ). ファイル種類(iflnk,シンボリックリンク). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/949 # # # /* オリジナル関数calc */ # /* calc(入力データ、計算結果のアドレスを格納するポインタ) */ # int calc(double input_data, double * data_ptr) # { # /*ポインタを使って、呼び出し元のデータ格納場所に値を設定 */ # *data_ptr = input_data * 2; # return0; /* 正常終了 */ # } # # 上記プログラムを参考に、 # 二つの入力データの変数(倍精度実数型) # double input_data1, input_data2; # に対しての、四則演算(+、−、*、/)の結果を、それぞれ # double plus_data, minus_data, multiply_data, divide_data; # の4変数に設定する機能を持つ、オリジナル関数calcを作成せよ。 # ただし、main関数上でのcalc関数の呼び出し方法は、以下のようにすること。 # calc(inpt_data1, input_data2, &plus_data, &minus_data, &multiply_data, _data); # 最後に、main関数上で上記4変数に格納された計算結果を画面に出力せよ。 # 以上の仕様のプログラムを、calc.cという名前で作成せよ。 # calc.cをVisual Studioで実行して、実行結果をcalc.c内の文末に「コメント行」として記載せよ 。 # program :- user_parameters([Atom1,Atom2]), atom_to_term(Atom1,Input_data1,_), atom_to_term(Atom2,Input_data2,_), calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data), write_formatted('%t + %t = %t\n',[Input_data1,Input_data2,Plus_data]), write_formatted('%t - %t = %t\n',[Input_data1,Input_data2,Minus_data]), write_formatted('%t * %t = %t\n',[Input_data1,Input_data2,Multiply_data]), write_formatted('%t / %t = %t\n',[Input_data1,Input_data2,Divide_data]). calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data) :- Plus_data is Input_data1 + Input_data2, Minus_data is Input_data1 - Input_data2, Multiply_data is Input_data1 * Input_data2, Divide_data is Input_data1 / Input_data2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/841 # # [1] 授業単元: C言語演習編 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10252.txt # # 問題1: # 文字列(128文字未満)を読み込み、その長さを表示するプログラムを作成せよ。 # ただし、文字列の走査には、ポインタ変数を使用すること。文字列操作関数を用いないこと。 # # 問題2: # 問題1の読み込み部分をファイル処理に変更せよ。 fgetc()関数を使用すること。 # コマンドラインにファイル名が指定できること。ただし、ファイル名を指定しない場合は標準入力とすること。 '文字列(128文字未満)を読み込み、その長さを表示する' :- get_char(C), '文字列(128文字未満)を読み込む'(C,L), length(L,N), write_formatted('%t文字です\n',[N]). '文字列(128文字未満)を読み込む'('\n',[]) :- !. '文字列(128文字未満)を読み込む'(C,[C|R]) :- get_char(C2), '文字列(128文字未満)を読み込む'(C2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% program :- user_parameters([_ファイル名]), open(_ファイル名,read,Instream), get_char(Instream,C), '文字列(128文字未満)を読み込む'(Instream,C,L), length(L,N), write_formatted('%t文字です\n',[N]), close(Instream). '文字列(128文字未満)を読み込む'(_,'\n',[]) :- !. '文字列(128文字未満)を読み込む'(Instream,C,[C|R]) :- get_char(Instream,C2), '文字列(128文字未満)を読み込む'(Instream,C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/778 # # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10246.txt # 課題2-1の問題文とそのプログラムを下に示しときます。 # # [課題2-1] # n件の整数型データを配列に入力し、その平均値を出力するプログラムを作成せよ。 # なお、実行部において添字演算子を用いないこと。また、*(p+i)の形を用いること。 # # [課題2-2] # 課題2-1と同じ機能を持つプログラムを作成せよ。ただし、入出力処理をファイル処理に変更し、 # 入出力ファイルはコマンドラインで指定すること。 # % 課題2-2 program :- user_parameters([_入力ファイル名,_出力ファイル名]), see(_入力ファイル名), tell(_出力ファイル名), 'N件の整数型データを配列に入力し、その平均値を出力する', told, seen. 'N件の整数型データを配列に入力し、その平均値を出力する' :- get_integer(N), findavg(I,(for(1,M,N),get_integer(I)),_平均値), write_formatted('平均=%t\n',[_平均値]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/778 # # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10246.txt # 課題2-1の問題文とそのプログラムを下に示しときます。 # # [課題2-1] # n件の整数型データを配列に入力し、その平均値を出力するプログラムを作成せよ。 # なお、実行部において添字演算子を用いないこと。また、*(p+i)の形を用いること。 # # [課題2-2] # 課題2-1と同じ機能を持つプログラムを作成せよ。ただし、入出力処理をファイル処理に変更し、 # 入出力ファイルはコマンドラインで指定すること。 # 'N件の整数型データを配列に入力し、その平均値を出力する' :- write('データ数:'), get_integer(N), findavg(I,(for(1,M,N),write_formatted('%t番目 値:',[M]),get_integer(I)),_平均値), write_formatted('平均=%t\n',[_平均値]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/690 # # [1] 授業単元: # プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 # ただし、総和を求める部分はmain関数と別の関数を作ること。 # program :- user_parameters([A]), atom_to_term(A,N,_), write_formatted('一行にカンマ区切りで%t個、%t行の浮動小数点数を入力してください(eofはctrl-dを入力)\n',[N,N]), 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和), write_formatted('総和は%tです\n',[_総和]). 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和) :- get_split_lines(user_input,[','],L), findsum(S1,(member(Line,L),findsum(Line,S1)),_総和). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/610 # # >>606さん # # 問題 # A さんと B さんがゲームで対戦した.対戦は N 回にわたって行った.各回の対戦において, # より高い点数を獲得した人がその回の勝者となる. # すなわち,第 i 回目の対戦で # A さんの点数が B さんの点数より大きければ第 i 回目は A さんの勝ち, # B さんの点数が A さんの点数より大きければ B さんの勝ち, # 同点の場合はどちらの勝ちにもならない. # N 回の対戦における A さんと B さんの点数が与えられたとき, # A さんと B さんがそれぞれ何回勝ったかを出力するプログラムを作成せよ. # # 入力 # 入力は 1+N 行からなる. # 1 行目には対戦の回数 N (1 ≦ N ≦ 1000000) が書かれている. # 2 行目以降の i+1 行目 (1 ≦ i ≦ N) には i 回目の対戦における A さんと B さんの点数が空白区切りで書かれている. # 各々の点数は 0 以上 100 以下の整数である. # # 出力 # 出力は 1 行からなる. A さんが勝った回数と B さんが勝った回数をこの順に空白で区切って出力せよ. # # # # となっています # 入力データ2までとかならまだ件数が少ないので良いのですが、 # 入力データ5になると1万件の入力データがあるのでファイルを読み込む以外は無いと思いました # # そのサイトに行ってもどうすればいいか良く解りませんでした # ですので、書き方ではなくてソースを書いてください お願いします # # program :-   user_parameters([_ファイル名]),   get_split_lines(_ファイル名,[':',' ',','],L),   二数のどちらが大きいか(L,0,0,_カウンタA,_カウンタB),   write_formatted('A : %t,B : %t\n',[_カウンタA,_カウンタB]). 二数のどちらが大きいか([],_カウンタA,_カウンタB,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 > _後の方,   A2 is A + 1,   二数のどちらが大きいか(R1,A2,B,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 < _後の方,   二数のどちらが大きいか(R1,A,B2,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   二数のどちらが大きいか(R1,A,B,_カウンタA,_カウンタB). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/236 # # [1] C言語プログラミング演習 # [2] 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換するプログラム # (コマンドラインに 2 4 2 4 を与えた場合タブを入力したら3 7 10 17 20 27...が桁位置に # なるようスペースを挿入する) # 入力は半角文字に限って良い。またコマンドラインからは正の整数を表すものが # 与えられるとして良い # [3] Windows vista/Borland C++ 5.5/C言語でコード # 制限:fgetsを使う。 # [4] できるだけ早く # # 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する :- user_paramegers(L), findall(N,(member(A,L),atom_to_term(A,N,_)),L2), get_chars(Chars), 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,Chars,X). 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([],_タブストップサイクル,L2,L3) :- 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,L2,L3),!. 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_,_,[],[]) :- !. 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,['\t'|R2],L) :- length(L2,N), all(L2,' '), append(L2,L3,L), 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(R1,_タブストップサイクル,R2,L3),!. 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,[A|R2],[A|R3]) :- \+(A='t'), 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,R2,R3). % 以下のサイトは :- op(700,xfx,は). % *** user: 'ABC分析パラメータ' / 3 *** 'ABC分析パラメータ'('A',0.0e+00,0.7). 'ABC分析パラメータ'('B',0.7,0.9). 'ABC分析パラメータ'('C',9.0,1.0). 'ABC分析'(X,A,B,C) :- '加算'(X,[_,S]), findall([U,L1],(append(L1,L2,X) , '加算'(L1,[_,D]) , U is D / S , U < 0.7),L), max(L,A), A = [W1,L3], append(L3,L4,X), findall([V,L5],(append(L5,L6,L4) , '加算'(L5,[_,E]) , V is E / S , V < 0.2),L7), max(L7,B), B = [W2,L8], append(L8,L9,L4), W3 is 1 - W1 - W2, C = [W3,L9], !. % *** user: 'ABC分析' / 7 *** 'ABC分析'(X,PerA,PerB,PerC,A,B,C) :- '加算'(X,[_,S]), 'ABC分析パラメータ'('A',Ap1,Ap2), 'ABC分析の二'(X,S,Ap1,Ap2,PerA,A), append(A,L2,X), 'ABC分析パラメータ'('B',Bp1,Bp2), 'ABC分析の二'(L2,S,0.0e+00,Bp2 - PerA,PerB,B), append(B,C,L2), PerC is 1 - PerA - PerB, !. % *** user: 'ABC分析の二' / 6 *** 'ABC分析の二'(L,S,Per1,Per2,PerX,X) :- findall([U,L1],(append(L1,_,L) , '加算'(L1,[_,D]) , U is D / S , U > Per1 , U =< Per2),L2), max(L2,Y), Y = [PerX,X], !. % *** user: '加算' / 2 *** '加算'(trunc(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL), !. '加算'('四捨五入'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), !. '加算'('切捨て'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), !. '加算'('切り上げ'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), !. '加算'([],L) :- var(L), L = 0.0e+00, !. '加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), !. '加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '加算_2'(L1,SL), !. '加算'(X,S) :- '加算_1'(X,0.0e+00,S) . % *** user: ('は') / 2 *** _項 'は' (_ネットワーク :: _式) :- _ネットワーク :: _項 'は' _式, !. _評価項 'は' N : L :- M 'は' N, L1 'は' L, list_nth(M,L1,_評価項), !. _評価項 'は' prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 'は' [X|{P}] :- findall(X,P,_評価値), !. _評価項 'は' ` _値 :- !, _評価項 = _値, !. _項 'は' _式 :- var(_式), _項 = _式, !. _項 'は' _式 :- error_protect('一時関数定義'(_式,_項),fail) . _項 'は' _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, !. _項 'は' _式 :- '二項組込み関数'(_式), '二項組込み関数の評価'(_式,_項) . _項 'は' _式 :- '二項組込み関数'(_式), !, fail . _項 'は' _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y 'は' Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, !. _項 'は' _式 :- atom(_式), error_protect(get_global(_式,_項),fail), !. _項 'は' _式 :- real(_式), _項 = _式, !. _項 'は' _式 :- real(_式), !, fail . _項 'は' _式 :- list(_式), findall(X,(member(U,_式) , X 'は' U),_項) . _項 'は' _式 :- list(_式), !, fail . _項 'は' _erlang_module : _erlang関数 :- 'erlang関数評価'(_erlang_module : _erlang関数,_項), !. _項 'は' _式 :- '関数定義'(_式,_項), !. _項 'は' _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), '関数評価に於いて引数部分の関数評価'(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 'は' _評価関数 :- error_protect(_項 is _評価関数,fail), !. _評価項 'は' prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail), !. _項 'は' _評価項 :- '述語評価が可能'(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), '関数評価に於いて引数部分の関数評価'(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 'は' _評価項 :- \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 'は' _評価項 :- \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項, !. _項 'は' _式 :- atomic(_式), \+('述語評価が可能'(_式,_関数,_次数,_次数足す一)), _項 = _式, !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/657 # # [1] 授業単元: C言語のポインタ、配列、ファイルの問題です # [2] 問題文(含コード&リンク): # n件のデータを配列に入力しその平均値を出力するプログラムをつくり、 # 実行部において添字演算子は用いず、*(p+i)と*p++それぞれを用いるパターンを作る # ただし、入出力処理をファイル処理に、入出力ファイル名はコマンドラインで指定する 'n件のデータを配列に入力しその平均値を出力する'(N) :- user_parameters([_入力ファイル,_出力ファイル]), open(_入力ファイル,read,Input), findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_))),Avg), close(Input), open(_出力ファイル,write,Output), write_formatted(Output,'平均値は %t\n',[Avg]), /* この行訂正 */ close(Output),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/454 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm 822.txt # # (1) 入力された正の整数が素数であるか判定するプログラムを作成する。 # ただし、機能は以下のように実現するものとする。 # boolean 型の戻り値をもつメソッド isPrime は引数に正の整数をとり、 # 素数なら true を返し、そうでないなら false を返す。 # main メソッドから、isPrime を呼び出すようにせよ。 # # (2)入力された正の整数が素数であるか判定し、素数でない場合は最少の素因数を # 出力するプログラムを作成する。ただし、機能は以下のように実現するものとする。 # int 型の戻り値をもつメソッド minimumDivisor は引数に正の整数をとり、 # 素数なら0 を返し、そうでないなら最小の素因数を返す。 # main メソッドから、minimumDivisor を呼び出し、戻り値に応じた出力をすようにせよ。 % (1) program :- user_parameters([A]), atom_to_term(A,N,_), isPrime_test(N,_診断), write_formatted('%t\n',[_診断]). isPrime_test(N,true) :- isPrime(N). isPrime_test(N,false) :- \+(isPrime(N)). isPrime(1) :- !. isPrime(N) :- \+((for(2,M,N//2),0 is N mod M)),!. % (2) program :- user_parameters([A]), atom_to_term(A,N,_), minimumDiviso(N,_診断), write_formatted('%t\n',[_診断]). minimumDiviso(1,0) :- !. minimumDiviso(N,M) :- for(2,M,N//2),0 is N mod M,!. minimumDiviso(N,0). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号139) # # [1] 授業単元:プログラミング # [2] HEADコマンドを実装せよ #   構文head[-Ln][filename] # 実現する機能:ファイルの先頭の複数行を画面に出力する。 #   引数:Ln:出力する行数nを指定する(デフォルトは10行) program :- head. head :- user_parameters(_パラメータリスト), ファイル名と表示行数の取得(_パラメータリスト,_ファイル名,N), get_lines(_ファイル,Lines), length(L,N), append(L,L2,Lines), member(_行,L), write_formatted('%t\n',[_行]), fail. head. ファイル名と表示行数の取得(['-L',A,_ファイル名],_ファイル名,N) :- atom_to_term(A,N,_),!. ファイル名と表示行数の取得(['-l',A,_ファイル名],_ファイル名,N) :- atom_to_term(A,N,_),!. ファイル名と表示行数の取得([A,_ファイル名],_ファイル名,N) :- sub_atom(A,0,2,J,_), sub_atom(A,2,J,_,B), atom_to_term(B,N,_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # # 【 補足 】3問です。本日1日悩みましたが、わかりませんでした。 # いかなる場合でも予期しない例外が出ないこと。 # 1: コマンドライン引数に入力された日付から現在日まで何日かを計算し、「今日まで●日」と表示しなさい。 # 現在日より入力された日付が小さい場合は「-(マイナス)」をつけて表示すること。(日付その他のチェックも行う事) # 2: コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) # 3: コマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを # 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事) # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # # 【 形態 】1. Javaアプリケーション(main()で開始) # 1 t815_1 :-   user_parameters([_年月日]), 日付整数(今日,_今日の年整数,_今日の月整数,_今日の日整数), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), 何日前後から調べる(_今日の年整数/_今日の月整数/_今日の日整数, _年整数/_月整数/_日整数,N日後), write_formatted('入力された日付から今日まで%t日です\n',[N日後]). 日付整数を年、月、日に分割(_日付整数,_年整数,_月整数,_日整数) :- _年整数 is _日付整数 // 10000, Mod1 is _年整数 mod 10000, _月整数 is Mod1 // 100, _日整数 is Mod1 mod 100. 何日前後から調べる(_日付,_日付,0) :- !. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @> _日付2, 何日前後から調べる(_日付2,_日付1,N日後の一), N日後 is (-1) * _N日後の一,!. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @=< _日付2, 前日・今日(_日付1,_日付3), 何日前後から調べる(_日付3,_日付2,M日後), N日後 is M日後 + 1,!. # 2 コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) t815_2 :-   user_parameters([_年,_月]),   月末日は何日(_年,_月,_月末日),   write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]). 月末日は何日(_年,'2','29') :-   atom_to_term(_年,_年整数,_),   うるう年(_年整数),!. 月末日は何日(_年,'2','28'). 月末日は何日(_年,_月,'30') :-   member(_月,['4','6','9','11']). 月末日は何日(_年,_月,'31') :-   member(_月,['1','3','5','7','8','10','12']). t815_3 :-   user_parameters([_年月日]), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), findall(X,(曜日検索(_年整数/1/1,A,X,Y),Y=A,(X @> _年整数/_月整数/_日整数,!,fail;true)),L), length(L,N週目), write_formatted('この日は1月1日から数えて第%t週目です\n',[N週目]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 日付整数(今日,_年整数,_月整数,_日整数) :- A is time, localtime(A,_年整数,_月整数,_日整数,_,_,_,_,_). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_前日の年/12/31,_年/1/1) :- 一つ違い(_前日の年,_年). 前日・今日(_年/2/29,_年/3/1) :- うるう年(_年). 前日・今日(_年/2/28,_年/3/1) :- not(うるう年(_年)). 前日・今日(_年/_前月/30,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]). 前日・今日(_年/_前月/31,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]). 前日・今日(_年/_月/_前日,_年/_月/_日) :- 一つ違い(_前日,_日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/380 # # 【 課題 】 # 1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は # 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。 入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。 # また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。。 # # 2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。 # もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を # 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。 # 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、 # 1番目の文字列が複数する場合は、すべて置き換わっていること。 # # 3・コマンドライン引数で入力された文字列が # 3文字以下なら、その文字列を20個文字列連結して表示 # 4文字以上なら”たくさん” を表示しなさい。 # 文字列連結の際はStringBufferクラスを使用しなさい # for文を使用しなさい # % 一問目 program :- user_parameters([Atom1,Atom2]), t802検査(Atom1,Atom2,_診断), write_formatted('%t\n',[_診断]). t802検査(Atom1,Atom2,_診断) :- sub_atom(Atom1,S,_,_,Atom2), S2 is S + 1, concat_atom([この文字列はあります。,S2,文字目],_診断),!. t802検査(_,_,'この文字列は存在しません。'). % 二問目 program :- user_parameters([Atom1,Atom2]), 内部で指定した置換対象文字列(_置換対象文字列), t802文字列置換(_置換対象文字列,Atom1,Atom2,X), write_formatted('%t\n',[X]). t802文字列置換(_置換対象文字列,Atom1,Atom2,置き換えなし) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列). t802文字列置換(_置換対象文字列,Atom1,Atom2,_置換された文字列) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換された文字列). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列) :- \+(sub_atom(_置換対象文字列,S,Len,R,Atom1)). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,X) :- sub_atom(_置換対象文字列,S,Len,R,Atom1), sub_atom(_置換対象文字列,0,S,_,Atom0), sub_atom(_置換対象文字列,S+Len,R,_,_置換対象文字列の二), t802文字列置換の二(_置換対象文字列の二,Atom1,Atom2,Y), concat_atom([Atom0,Atom2,Y],X). 内部で指定した置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり). %三問目 program :- user_parameters([Atom1]), sub_atom(Atom1,0,Len,0,Atom1), t802文字連結(Atom1,Len,X), write_formatted('%t\n',[X]). t802文字列連結(Atom,Len,たくさん) :- Len >= 4. t802文字列置換(Atom,Len,X) :- Len < 4, findall(atom,for(1,N,20),L), concat_atom(L,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/231 # # 【 形態 】Javaアプリケーション(main()で開始) # 【 課題 】以下のようなサーバプログラムCountServer.javaとクライアントプログラム # CountClient.javaを作成してください。 # # [条件] # ・サーバは、クライアントから文字列を受信し、その文字数をカウントして #  結果をクライアントに返す。 # ・クライアントプログラムを実行時に、コマンドラインから、サーバホスト名 #  java CountClient サーバホスト名 "文字列" # ・クライアントは、サーバからの結果を受け取り、画面に表示する。 # ・サーバは、ポート番号 4321 で接続要求を受け付けるようにする。 # # サーバプログラムの実行 # >java CountServer # # クライアントプログラムの実行と実行結果 # >java CountClient host1 "Java Programming" # 16   server(Port) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket), socket_accept(Socket,Host : Port2,NewSocket), socket_raw_receive(NewSocket,8192,_,_受信コードならび,_実際に受信した長さ), atom_codes(_受信した文,_受信コードならび), server_1(_受信した文,NewSocket), Message = quit, socket_shutdown(Socket),!. server_1(quit,NewSocket,Input,Output) :- socket_shutdown(NewSocket),!. server_1(_受信した文,NewSocket) :- atom_codes(Message,L), atom_length(Message,Length), open(NewSocket,write,Output,[type(binary)]), write_formatted(Output,'%t\r\n',[Length]), flush_output(Output), close(Output), socket_shutdown(NewSocket), ! . client(Host,Port) :- get_line(_伝送する文), socket(internet, stream, Socket), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), write_formatted(Output,'%t\n',[_送信する文]), flush_output(Output), get_line(Input,_受信した文), client_1(_受信した文,Host,Socket,Input,Output), close(Input), close(Output), socket_shutdown(Socket). client_1(end_of_file,Input,Output) :- !. client_1(_受信した文,Input,Output) :- write_formatted('%t\n',[_受信した文]), get_line(Input,_次の受信した文), client_1(_次の受信した文,Input,Output). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/660 # # [1] C言語 # [2] 2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を #   標準出力に表示するプログラムを作成せよ。 #   ファイル名はコマンドライン入力により受け取ることとする。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ:gcc 3.4 #  [3.3] 言語:C # [4] 期限:2009年7月31(金) # [5] その他の制限:ポインタ履修済みです t584 :- user_parameters([File1,File2]), '二つのファイルの内容が異なっている最初の行'(_行番号,File1,A,File2,B), write_formatted('行番号=%t %t=%t %t=%t\n',[_行番号,File1,A,File2,B]). '二つのファイルの内容が異なっている最初の行'(_行番号,File1,A,File2,B) :- get_lines(File1,L1), get_lines(File2,L2), append(L,[A|_],L1), append(L,[B|_],L2), \+(A=B), length(L,Len), _行番号 is Len + 1,!. % 以下のサイトは # [1] 授業単元: プログラミング # [2]問題文:以下の2つの構造体を用い,sample_data2.txt を単方向連結リストに # 保存するプログラム extra8 を作成せよ.item_list 中の item は各行中の数値を # 保持し,t_list 中の itemset は1行分のデータを保持するものとする. # struct item_list { # int item; # struct item_list *next; # }; # struct t_list { # struct item_list itemset; # struct t_list *next # }; # ソースファイルの名前は extra8.c とする.また,extra8.c には, # 生成した単方向連結リストの内容を標準出力に出力する関数 print_tlist を # 含むものとし,以下の実行例のように print_tlist により各行の内容を出力 # するものとする. # なお,入力ファイル名はコマンドライン引数で指定するものとし,入力ファイルが # オープンできなかった場合の処理も含めること.また,プログラム自身を除く # 引数の数が0個,もしくは2個以上の場合は,何もせず適切なメッセージを出力して # 終了するものとする. # (実行例1) # > .\extra8 sample_data2.txt # Itemset: 1,3,9,13,23,25,34,36 # Itemset: 2,3,9,14,23,26,34,36,39,40,52,55,59 extra8 :- ユーザパラメータの取得(_ファイル名), get_lines(_ファイル名,Lines), findall(Item_list,(member(Line,Lines),split(Line,[','],Item_list)),T_list), assertz(t_list(T_list)). print_tlist :- t_list(T_list), member(Item_list,T_list), print_tlist_format(Item_list,Format), write_formatted(Format,Item_list), fail. print_tlist. print_tlist_format(Item_list,Format) :- length(Item_list,Len), length(L,Len), all(L,'%t'), concat_atom(L,',',S), concat_atom(['Items : ,S,'\n'],Format),!. ユーザパラメータの取得(_ファイル名) :- user_parameters([_ファイル名]),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/457 # # [1] 授業単元 C++ # # [2] 問題文(含コード&リンク) # テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、 # 新たなファイルに書き出しなさい。ただし、N≧0とする。 # コマンドパラメーター:入力ファイル名、出力ファイル名、N # # <解答例> # Hello( )Bye←入力ファイル # N=3の場合 # Hello( )Bye←出力ファイル t554(_入力ファイル,_出力ファイル,_空白文字数) :- length(L,_空白文字数), all(L,' '), get_chars(_入力ファイル,Chars), replace_chars(Chars,['\t'],L,Chars2), put_chars(_出力ファイル,Chars2). replace_chars([],_,_,[]) :- !. replace_chars(L1,L2,L3,L4) :- append(L2,R1,L1), replace_chars(R1,L2,L3,L5), append(L3,L5,L4),!. replace_chars([A|R1],L2,L3,[A|R4]) :- replace_chars(R1,L2,L3,R4). get_chars(File,L) :- open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y), get_chars(Input,Y,R) . put_chars(F,L) :- open(F,write,Output), stream_put_chars(Output,L), close(Output),!. stream_put_chars(_,[]) :- !. stream_put_chars(Stream,[Char|R]) :- put_char(Stream,Char), stream_put_chars(Stream,R),!. all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/256 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, # 2行目以降はその数の不定長文字列が空白で区切られているような入力 # ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに # 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ # を保持する. # struct t_list { # char **attributes; # struct t_list *next; # }; # またにはソースファイルには,生成した単方向連結リストの内容を # 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行 # に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. # なお,入力ファイル名はコマンドライン # 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も # 含めること.また,プログラム自身を除く引数の数が0個, # もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする # 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt program :- ユーザパラメータの取得(_ファイル名), get_line(Line), atom_to_term(Line,_文字列項目数,_), get_line(Line2), t527(Line2,X), exception_handler(open(_ファイル名,write,Output),error(E,I),open_error(_ファイル名,I)), print_tlist(Output,X), close(Output). program. ユーザパラメータの取得(_ファイル名) :- user_parameters([_ファイル名]),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). t527(end_of_file,[]) :- !. t527(Line,[L|R]) :- split(Line,[' '],L), get_line(Line2), t527(Line2,R). open_error(_ファイル名,Info) :- error_tell(Output), write(Output,'出力ファイル%tのオープンに失敗 :: %t\n',[_ファイル名,Info]), error_told(Output), fail. print_tlist(Output,[]) :- !. print_tlist(Output,[A|R]) :- write_formatted(Output,'%t\n',[A]), print_tlist(Output,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/825 # # 〔1〕授業単元:C言語 # 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt # 課題 I # コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ. # コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること. # 課題 II # コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ. # コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること. # また,コマンド引数に整数以外が与えられた場合にも,標準エラー出力にエラー分を # 表示させること. # 課題 III # n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m) # 再帰呼び出しを行う関数 sum を作成して問題を解くこと. # 関数 sum は,引数を n, m とし,n から m までの和を返すもとのとする. t419_1 :- user_parameters(L),split(L,[','],L1),length(L1,2),write_formatted('%t %t\n',L1),!. t419_1 :- tell(user_error),write(引数エラー),told. t419_2 :- user_parameters(L), split(L,[','],L1), length(L1,Len), 引数長さ検査(Len), 引数のすべてが整数(L1), sum(L1,Sum), write_formatted('引数に与えられた整数の合計は%tです\n',[Sum]). 'n から m までの整数の和を求める'(N,N,N) :- !. 'n から m までの整数の和を求める'(N,M,_和) :- N < M, N2 is N + 1, 'n から m までの整数の和を求める'(N2,M,_和2), _和 is N + _和2. 引数の長さ検査(Len) :- Len > 0,!. 引数の長さ検査(Len) :- Len < 1,tell(user_error),write('引数がありません\n'),told,!,fail. 引数のすべてが整数([]) :- !. 引数のすべてが整数([N|R]) :- integer(N),引数のすべてが整数(R). 引数のすべてが整数([A|R]) :- tell(user_error),write('引数に整数でない%tがあります\n',[A]),told,!,fail. sum([],0). sum([N|R],X) :- sum(R,Y),X is N + Y. % 以下のサイトは # 入力ファイルを読み込み、顧客別売上明細書を出力する # # ・支店が変われば、支店合計を印字し改ページをする # ・顧客が変われば、顧客合計を印字し、1行空白を印字する # ・入力ファイルはソートされているものとする # ・入力ファイル、出力ファイルはコマンドライン引数で受け取る # ・20行を超える場合は、改ページする #  ただし、合計出力途中の場合は20行を超えていても出力する # ・金額出力時のカンマ編集をする # # ・例外処理は、コマンドライン引数が正しくない場合、入力・出力ファイルがオープンできない場合、入力ファイルにデータがない場合の4種類 # # ・突合せ処理(コントロールブレイク>)を使用する # # ・入力ファイルの支店コードから売上金額までクラス分けをする # (クラス分けがよく解りませんが、Cの構造体のようなものを使用せよと言われました) # # ・例外処理を書いたメインメソッド、突合せ処理メソッド、ヘッダメソッドの3つに分ける # # 下記の処理をヘッダメソッドとする # ここから # 帳票明細 # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # ここまで # # # # ☆入力ファイル例 # ?支店コード ?支店名 ?販売日 ?販売先コード ?販売先名 ?売上金額 # # # 001 東京 20090601 0001 田中商店  1000 # 001 東京 20090602 0001 田中商店  5000 # 001 東京 20090603 0001 田中商店  10000 # 001 東京 20090601 0002 山田スーパー  3000 # 002 沖縄 20090604 0001 沖縄商店  7000 # ☆出力ファイル例 # # 帳票明細 # # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # 0001 田中商店 6月1日 1,000 # 0001 田中商店 6月2日 5,000 # 0001 田中商店 6月3日 10,000 # ---------------------------------------------------------------- # 販売合計 件数 3 16,000 # (空白行 1行) # 0002 山田スーパー 6月1日 3,000 # ---------------------------------------------------------------- # 販売合計 件数 1 3,000 # (空白行 1行) #    **支店合計 件数 4 19,000 # # # # # 帳票明細 # 002 沖縄 支店 出力日6月21日(出力した日)  P.2 # (空白行 1行) # 販売先 販売日 販売金額 # ---------------------------------------------------------------- # 0001 沖縄商店 6月4日 7,000 # ---------------------------------------------------------------- # 販売合計 件数 1 7,000 # (空白行 1行) #    **支店合計 件数 1 7,000 #    ***総合計 件数 5 26,000 # # # # 入力ファイルを以下のように変更しましょう。 顧客別売上明細書を出力する :- 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3), コントロールブレイク(L1,L2,L3,0,0,0,0,0,0,0). 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3) :- ファイルを全行読み取る(F1,L1), ファイルを全行読み取る(F2,L2), ファイルを全行読み取る(F3,L3). コントロールブレイク([L1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(6,L1,[],L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), write('---------------------------------------------------------------\n'), 改頁制御(_頁1,_頁2,_行1,_行2,L2,L3), 販売先合計表示(_行2,_行3,CX5,SX5), 改頁制御(_頁2,_頁3,_行3,_行4), 支店合計表示(_行4,_行5,CX4,SX4), 改頁制御(_頁3,_頁4,_行5,_行6), 総合計表示(_行3,_,CX3,SX3),!. コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(1,L1,L12,L2,L3), 合計加算(L1,SX1,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,[K|R11],L2,L3), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁1,_行1,CX4,CX5,CX6,SX4,SX5,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(2,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行1,_行2,CX5,SX5), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁2,_行2,CX,0,CX6,SX4,0,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(3,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細印刷(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行2,_行3,CX5,SX5), 支店合計表示(_頁2,_頁3,_行4,_行5,CX4,SX4), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁3,0,0,0,CX3,0,0,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(4,L1,_,L2,L3), コントロールブレイク([L1|R1],R2,[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(5,L1,_,L2,L3), コントロールブレイク([L1|R1],[L2|R2],R3,_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3). コントロールブレイクパターン(1,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(2,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL12|_]), not(KL11=KL12), 鍵項目(支店名L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(3,L1,L12,_,_) :- 鍵項目(売上明細,L1,[KL1,_|_]), 鍵項目(売上明細,L12,[KL12,_|_]), not(KL1=KL12),!. コントロールブレイクパターン(4,L1,_,L2,_) :- 鍵項目(売上明細,L1,[KL1|_]), 鍵項目(支店名,L2,[KL2|_]), KL1 @> KL2,!. コントロールブレイクパターン(5,L1,_,_,L3) :- 鍵項目(売上明細,L1,[_,KL11|_]), 鍵項目(販売先名,L3,[KL3|_]), KL11 @> KL3,!. コントロールブレイクパターン(6,L1,[],L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. 鍵項目(売上明細,[_支店コード,_,_販売先コード|_],[_支店コード,_販売先コード]). 鍵項目(支店名,[_支店コード|_],[_支店コード]). 鍵項目(販売先名,[_販売先コード|_],[_販売先コード]). 明細行表示(_頁,_次の頁,0,_次の行,L1,L2,L3) :- 鍵項目(支店名,L2,[_支店コード,_支店名|_]), 今日(_今日), sub_atom(_今日,4,2,_,_月), sub_atom(_今日,6,2,_,_日), 支店名見出し(_支店コード,_支店名,_月,_日,_頁), 明細行表示(_頁,_頁,0,6,L1,L2,L3),!. 明細行表示(_頁,_次の頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 > 20, _頁1 is _頁 + 1, 明細行表示(_頁1,_次の頁,1,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3),!. 明細行表示(_頁,_頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 < 20, sub_atom(_販売日,4,2,_,_月), sub_atom(_販売日,6,2,_,_日), カンマの挿入(10,_売上金額,_カンマ付き売上金額), write_formatted('%4d %-30s%2d月%2d日 %t\n',[_販売先コード,_販売先名,_月,_日,_カンマ付き販売金額]), _次の行 is _行 + 1,!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 支店合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' **支店合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 販売先合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 販売先合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 販売先合計表示(_頁,_頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' 販売合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _次の頁 is _頁 + 1, 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計,_カンマ付き合計), write_formatted(' 総合計 %t\n',[_カンマ付き合計]). 帳票明細見出し :- write('\n 帳票明細\n'). 支店名見出し(_支店コード,_支店名,_月,_日,_頁) :- write_formatted('\n%t %t 出力日%2d月%2d日 P.2d\n\n',[_支店コード,_支店名_月,_日,_頁]), write(' 販売先 販売日 販売金額\n'). write('---------------------------------------------------------------\n'). 明細行項目(L1,_支店コード,_販売日,_販売先コード,_売上金額) :- sub_atom(L1,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L1,3,8,A2),A2 = _販売日, sub_atom(L1,11,6,A3),atom_to_term(A3,_販売先コード), sub_atom(L1,19,8,A4),atom_to_term(A4,_売上金額). 支店名項目(L2,_支店コード,_支店名) :- sub_atom(L2,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L2,3,10,_支店名). 販売先名項目(L3,_販売先コード,_販売先名) :- sub_atom(L3,0,6,A),atom_to_term(A3,_販売先コード), sub_atom(L3,6,30,_販売先名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% カンマの挿入(_表示桁数,_数値,_表示文字列) :- number(_数値), number_codes(_数値,Codes), atom_codes(_数値文字列,Codes), カンマの挿入(_表示桁数,_数値文字列,_表示文字列),!. カンマの挿入(_表示桁数,_数値文字列,_表示文字列) :- atom_chars(_数値文字列,_数値文字ならび), 正数部の長さ(_数値文字ならび,_数値桁数), カンマの挿入の二(_数値桁数,_数値文字ならび,_空白のない数値ならび), length(_空白のない数値ならび,_空白のない数値ならびの桁数), _空白数 is _表示桁数 - _空白のない数値ならびの桁数, 空白文字を連結する(_空白数,_空白のない数値ならび,_表示文字列),!. カンマの挿入の二(0,X,X) :- ! . カンマの挿入の二(1,X,X) :- ! . カンマの挿入の二(N,[-|R],[-|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[ |R],[ |R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A,,|R1]) :- M is N - 1, 0 is M mod 3, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . 正数部の長さ([],0) :- !. 正数部の長さ([.|_],0) :- !. 正数部の長さ([_|R],N) :- 正数部の長さ(R,M), N is M + 1,!. 空白文字を連結する(N,[_|R],_表示文字列) :- N < 0, M is N + 1, 空白文字を連結する(M,R,_表示文字列),!. 空白文字を連結する(0,_表示文字ならび,_表示文字列) :- 文字列の結合(_表示文字ならび,_表示文字列),!. 空白文字を連結する(N,_表示文字ならび,_表示文字列) :- M is N - 1, 空白文字を連結する(M,[' '|_表示文字ならび],_表示文字列),!. 改頁 :- char_code(C,12), write_formatted('%c',[C]),!. ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList).