このディレクトリの索引

% 以下のサイトは # 出典 :: 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_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 整数検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは % % 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/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/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/1354070278/907 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum_list(_数値ならび,_合計), writef('%t\n',[_合計]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _利用者引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % % 以下のサイトは 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/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/1328276597/956 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次のプログラムをstrcpy(a,b)を使わずに # whileを使って同じことを行うプログラムを作れ。 # int main(void){ # char a[64],*b; # b="INFORMATION"; # strcpy(a,b); # printf("%s\n",a); # return 0; # } # b("INFORMATION"). '次のプログラムをstrcpy(a,b)を使わずに同じことを行うプログラムを作れ。' :- b(_b), strcpyもどき(_a,_b), writef('%t\n',[_a]). strcpyもどき([],[]). strcpyもどき([A|R1],[A|R2]) :- strcpyもどき(R1,R2). % ここではINFORMATIONがstringつまり文字コードのリストとして定義されている。 % % 今日的にはstringはあまり使われないが、atom_charsなどを介さずリスト処理に % 入れる魅力はある。アトムテーブルが無闇に増えない点も利点だが、 % その代わりリストとしてスタックに負荷がかかる。 % % 今日、あまり使われなくなった理由は、 % 1) ダブルクォーツが情報として邪魔。この理由が一番大きいと思う。 % 2) 効率が悪い。どんなに工夫しても、リストのユニフィケーションは高負担。 % 3) 少なくとも、関数名はストリングではなく、アトムであり、functorや % =.. を使用するときに不整合な部分が現れる。 % 4) 表示文字に変換する記法が何通りもあり、それをoptionのprolog_flagで % 指定することになっている。この指定方法を知らなかったり、習熟して % いないことがプログラムエラーの原因となる。 % 5) sub_atom/5のようなatom操作の強力な組込述語が開発された。 % 以上のような理由からだと思われる。 % % % 一般にProlog述語を定義する時は、引数の前半に入力引数、後半に % 出力引数を集めるものだが、ここはstrcpyとstrcpyもどきの対応を % くっきりとさせるため、敢えて引数をひっくり返した。 % ひっくり返してもまったく機能的には削がれることがないことを確認して下さい。 % % 以下のサイトは 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/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/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/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/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). % 以下のサイトは # C/C++の宿題片付けます 132代目 #354 # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # (1)http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10174.txt # 次のように各0番目の列要素にテストの点数を初期設定にしてある大きさ # 10×2の配列がある。この配列の1番目の列要素に点数の高い順から順位を格納するプログラムを作成しなさい。 # #   [0] [1] # [0] 67 # [1] 43 # [2] 56 # [3] 97 # [4] 30 # [5] 88 # [6] 76 # [7] 55 # [8] 66 # [9] 78 :- set_prolog_flag(answer_write_options,[quoted(true), portray(true), max_depth(10000000), attributes(portray)]). 配列([[67,_],[43,_],[56,_],[97,_],[30,_],[88,_],[76,_],[55,_],[66,_],[78,_]]). 配列の1番目の列要素に点数の高い順から順位を格納する(L) :- 配列(L), 順位付け(L,[],_順位ならび), 第二要素に順位をセット(L,_順位ならび). 順位付け([],X,X). 順位付け([[A,_]|R1],Y1,X) :- 挿入(A,Y1,Y2), 順位付け(R1,Y2,X). 挿入(A,[],[A]). 挿入(A,[B|R],[A,B|R]) :- A @> B,!. 挿入(A,[B|R1],[B|R2]) :- A @=< B, 挿入(A,R1,R2). 第二要素に順位をセット([],_). 第二要素に順位をセット([[A,V]|R],_順位ならび) :- nth1(V,_順位ならび,A), 第二要素に順位をセット(R,_順位ならび). % 以下のサイトは # 出典 :: # [1] 授業単元:プログラミング # [2] HEADコマンドを実装せよ #   構文head[-Ln][filename] # 実現する機能:ファイルの先頭の複数行を画面に出力する。 #   引数:Ln:出力する行数nを指定する(デフォルトは10行) # # file = myhead -l%1 %2 # swipl %1 %2 -f head.pro -g head head :- current_prolog_flag(argv,_パラメータリスト), ファイル名と表示行数の取得(_パラメータリスト,_ファイル名,_表示行数), 行ならび入力(_ファイル名,_行ならび), length(_表示行ならび,_表示行数), forall((append(_表示行ならび,L2,_行ならび),member(_行,_表示行ならび)),writef('%w\n',[_行])). ファイル名と表示行数の取得([_ファイル名,A|_],_ファイル名,_行数) :- read_term_from_atom(A,_行数_1,[]), _行数 is _行数_1 * (-1),!. ファイル名と表示行数の取得([_ファイル名,A|_],_ファイル名,_行数) :- sub_atom(A,0,2,J,_), sub_atom(A,2,J,0,B), read_term_from_atom(B,_行数,[]). 行ならび入力(_ファイル,_行ならび) :- open(_ファイル,read,_入力), findall(_行,(repeat,(at_end_of_stream(_入力),close(_入力),!,fail;行入力(_入力,_行))),_行ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). :- head,halt. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 68 ★★ #380 # 【 課題 】 # 1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は # 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。 入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。 # また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。。 # # 2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。 # もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を # 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。 # 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、 # 1番目の文字列が複数する場合は、すべて置き換わっていること。 # # 3・コマンドライン引数で入力された文字列が # 3文字以下なら、その文字列を20個文字列連結して表示 # 4文字以上なら”たくさん” を表示しなさい。 # 文字列連結の際はStringBufferクラスを使用しなさい # for文を使用しなさい # コマンド引数(_コマンド引数ならび) :- current_prolog_flag(argv,_コマンド引数ならび). '1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。 また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。' :- コマンド引数([_文字列_1,_文字列_2]), '文字列_1の中に文字列_2が含まれるかどうかを診断し結果を表示する'(_文字列_1,_文字列_2). '文字列_1の中に文字列_2が含まれるかどうかを診断し結果を表示する'(_文字列_1,_文字列_2) :- '文字列_1の中に文字列_2が含まれるかどうかを診断し'(_文字列_1,_文字列_2,_診断), 結果を表示する(_診断). '文字列_1の中に文字列_2が含まれるかどうかを診断し'(_文字列_1,_文字列_2,_診断) :- '1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は'(_文字列_1,_文字列_2,_診断). '文字列_1の中に文字列_2が含まれるかどうかを診断し'(_文字列_1,_文字列_2,_診断) :- '存在しない場合は'(_文字列_1,_文字列_2,_診断). '1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は'(_文字列_1,_文字列_2,_診断) :- sub_atom(_文字列_1,S,_,_,_文字列_2), S2 is S + 1, atomic_list_concat([この文字列はあります。,S2,文字目],_診断). '存在しない場合は'(_文字列_1,_文字列_2,この文字列は存在しません) :- \+('1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は'(_文字列_1,_文字列_2,_診断)). 結果を表示する(_診断) :- writef('%w\n',[_診断]). % 二問目 '2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。 もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、 1番目の文字列が複数する場合は、すべて置き換わっていること。' :- コマンド引数([_文字列_1,_文字列_2]), 内部で指定した置換対象文字列(_置換対象文字列), 文字列置換(_置換対象文字列,_文字列_1,_文字列_2,_置換された文字列), writef('%w\n',[_置換された文字列]). 文字列置換(_置換対象文字列,_文字列_1,_文字列_2,置き換えなし) :- \+(sub_atom(_置換対象文字列,_,_,_,_文字列_1)),!. 文字列置換(_置換対象文字列,_文字列_1,_文字列_2,_置換された文字列) :- 文字列置換_1(_置換対象文字列,_文字列_1,_文字列_2,_置換された文字列). 文字列置換_1(_置換対象文字列,_文字列_1,_文字列_2,_置換された文字列) :- 副文字列(_置換対象文字列,_前文字列,_文字列_1,_後文字列), 文字列置換_2(_前文字列,_文字列_1,_後文字列,_文字列_2,_置換された文字列),!. 文字列置換_1(_文字列,_,_,_文字列). 文字列置換_2(_前文字列,_文字列_1,_後文字列,_文字列_2,_置換された文字列) :- 文字列置換_1(_後文字列,_文字列_1,_文字列_2,_置換された文字列_2), atomic_list_concat([_前文字列,_文字列_2,_置換された文字列_2],_置換された文字列),!. 内部で指定した置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり). %三問目 '3・コマンドライン引数で入力された文字列が 3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい。 文字列連結の際はStringBufferクラスを使用しなさい' :- コマンド引数([_文字列]), 'コマンドライン引数で入力された文字列が 3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい'(_文字列). 'コマンドライン引数で入力された文字列が 3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい'(_文字列) :- sub_atom(_文字列1,0,_文字列長,0,_文字列), '3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい'(_文字列,_文字列長). '3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい'(_文字列,_文字列長) :- '3文字以下なら、その文字列を20個文字列連結して表示'(_文字列,_文字列長). '3文字以下なら、その文字列を20個文字列連結して表示 4文字以上なら"たくさん"を表示しなさい'(_文字列,_文字列長) :- 4文字以上なら"たくさん"を表示しなさい'(_文字列,_文字列長). '3文字以下なら、その文字列を20個文字列連結して表示'(_文字列,_文字列長) :- _文字列長 =< 3, 'その文字列を20個文字列連結して表示'(_文字列). 'その文字列を20個文字列連結して表示'(_文字列) :- 'その文字列を20個文字列連結して(_文字列,_表示文字列), 表示(_表示文字列). 'その文字列を20個文字列連結して(_文字列,_表示文字列) :- findall(_文字列,between(1,20,_),_文字列ならび), atomic_list_concat(_文字列ならび,_表示文字列). 表示(_表示文字列) :- writef('%w\n',[_表示文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 129代目 #660 # [1] C言語 # [2] 2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を #   標準出力に表示するプログラムを作成せよ。 #   ファイル名はコマンドライン入力により受け取ることとする。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ:gcc 3.4 #  [3.3] 言語:C # [4] 期限:2009年7月31(金) # [5] その他の制限:ポインタ履修済みです '2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を標準出力に表示する。ファイル名はコマンドライン入力により受け取ることとする。' :- 'ファイル名はコマンドライン入力により受け取ることとする。'(_ファイル_1,_ファイル_2), '2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を標準出力に表示する'(_ファイル_1,_ファイル_2). 'ファイル名はコマンドライン入力により受け取ることとする。'(_ファイル_1,_ファイル_2) :- current_prolog_flag(argv,[_ファイル_1,_ファイル_2]). '2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を標準出力に表示する'(_ファイル_1,_ファイル_2) :- '2つのファイルの内容が異なっている最初の行の行番号と内容を'(_ファイル_1,_ファイル_2,_行番号,_1,_2), 標準出力に表示する(_行番号,_ファイル_1,_1,_ファイル_2,_2). '2つのファイルの内容が異なっている最初の行の行番号と内容を'(_ファイル_1,_ファイル_2,_行番号,_1,_2) :- '2つのファイルを読み取り、それぞれ行ならびに変換する'(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2), 内容が異なっている最初の行の行番号と内容(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2,_行番号,_1,_2). '2つのファイルを読み取り、それぞれ行ならびに変換する'(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2) :- ファイルから行ならびを得る(_ファイル_1,_行ならび_1), ファイルから行ならびを得る(_ファイル_2,_行ならび_2). ファイルから行ならびを得る(_ファイル,_行ならび) :- ファイルから(_ファイル,_入力), 行ならびを得る(_入力,_行ならび). ファイルから(_ファイル,_入力) :- open(_ファイル,read,_入力). 行ならびを得る(_入力,[]) :- at_end_of_streamを検出したらファイルを閉じる(_入力),!. 行ならびを得る(_入力,L) :- 行入力を続ける(_入力,L). at_end_of_streamを検出したらファイルを閉じる(_入力) :- at_end_of_stream(_入力), ファイルを閉じる(_入力). 行入力を続ける(_入力,[_行|R]) :- 行入力(_入力,_行), 行ならびを得る(_入力,R). 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). ファイルを閉じる(_入力) :- close(_入力). 内容が異なっている最初の行の行番号と内容(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2,_行番号,_1,_2) :- 内容が異なっている最初の行の(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2,L,_1,_2), 行番号(L,_行番号). 内容が異なっている最初の行の(_ファイル_1,_ファイル_2,[],[],_,_,_) :- write('二つのファイルには相違がない\n'),!. 内容が異なっている最初の行の(_ファイル_1,_ファイル_2,[],_,L,_,_) :- length([_|L],_行目), writef('%w行目%wがat_end_of_stream状態\n',[_行目,_ファイル_1]),!. 内容が異なっている最初の行の(_ファイル_1,_ファイル_2,_,[],L,_,_) :- length([_|L],_行目), writef('%w行目%wがat_end_of_stream状態\n',[_行目,_ファイル_2]),!. 内容が異なっている最初の行の(_ファイル_1,_ファイル_2,_行ならび_1,_行ならび_2,L,_1,_2) :- append(L,[_1|_],_行ならび_1), append(L,[_2|_],_行ならび_2), 内容が異なっている(_1,_2). 内容が異なっている(_1,_2) :- \+(_1 = _2). 行番号(L,_行番号) :- length(L,Len), _行番号 is Len + 1. 標準出力に表示する(_行番号,_ファイル_1,_1,_ファイル_2,_2) :- writef('行番号=%w %w=%w %t=%w\n',[_行番号,_ファイル_1,_1,_ファイル_2,_2]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 129代目 #457 # [1] 授業単元 C++ # # [2] 問題文(含コード&リンク) # テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、 # 新たなファイルに書き出しなさい。ただし、N≧0とする。 # コマンドパラメーター:入力ファイル名、出力ファイル名、N # # <解答例> # Hello( )Bye←入力ファイル # N=3の場合 # Hello( )Bye←出力ファイル 'テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、 新たなファイルに書き出しなさい。ただし、N≧0とする。 コマンドパラメーター:入力ファイル名、出力ファイル名、N' :- 'コマンドパラメーター:入力ファイル名、出力ファイル名、N'(入力ファイル名、出力ファイル名,_N個), 'テキストファイルを新たなファイルに書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて。'(_入力ファイル名,_出力ファイル名,_N個). 'コマンドパラメーター:入力ファイル名、出力ファイル名、N'(_入力ファイル名,_出力ファイル名,_N個) :- current_prolog_flag(argv,[_入力ファイル名,_出力ファイル名,_N個]). 'テキストファイルを新たなファイルに書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて。'(_入力ファイル名,_出力ファイル名,_N個) :- read_file_to_codes(_入力ファイル,_コードならび,[]), '新たなファイルに書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて。'(_出力ファイル,_コードならび). '新たなファイルに書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて。'(_出力ファイル,_コードならび) :- tell(_出力ファイル), 'コードならびを文字として書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて書き出す。'(_N個,_コードならび), told. 'コードならびを文字として書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて書き出す。'(_N個,_コードならび) :- forall('コードならびを文字として書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて'(_N個,_コードならび,_出力する文字コード),書き出す(_出力する文字コード)). 'コードならびを文字として書き出す。ただし、タブコードをそれぞれ、空白N個に置き換えて'(_N個,_コードならび,_出力する文字コード) :- member(_文字コード,_コードならび), 'タブコードをそれぞれ、空白N個に置き換えて'(_N個,_文字コード,_出力する文字コード). 'タブコードをそれぞれ、空白N個に置き換えて'(_N個,9,_出力する文字コード) :- 'N個の空白'(_N個,_出力する文字コード). 'タブコードをそれぞれ、空白N個に置き換えて'(_,_文字コード,_出力する文字コード) :- 'タブコードでなかったら'(_文字コード). 'N個の空白に置き換えて'(_N個,32) :- between(1,_N個,_). 'タブコードでなかったら'(_文字コード) :- _文字コード \== 9. 書き出す(_文字コード) :- put_char(_文字コード). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 129代目 #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 'ファイルの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' :- 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名), 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび). 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび) :- 行入力(_行_1), atom_number(_行_1,_2行目以降の各行に含まれる文字列の数), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,_その数の不定長文字列のならび), catch(open(_ファイル名,write,Output),error(E,I),open_error(_ファイル名,I)), print_tlist(Output,_その数の不定長文字列のならび), close(Output). 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名) :- ユーザパラメータの取得(_ファイル名). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). ユーザパラメータの取得(_ファイル名) :- current_prolog_flag(argv,_ファイル名),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(end_of_file,[]) :- !. その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行,[L|R]) :- 項目区切り(_行,[' '],L), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,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]) :- swritef(S,'%w\n',[A]), writef(Output,S), print_tlist(Output,R). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは 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 までの和を返すもとのとする. '課題 I コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ. コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること.' :- コマンド引数から自分の姓と名を得て(_コマンド引数ならび), 'そのまま表示する.コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させる.'(_コマンド引数ならび). コマンド引数から自分の姓と名を得て(_コマンド引数ならび) :- current_prolog_flag(argv,_コマンド引数ならび). 'そのまま表示する.コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させる.'(_コマンド引数ならび) :- 'そのまま表示する.'(_コマンド引数ならび),!. 'そのまま表示する.コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させる.'(_コマンド引数ならび) :- コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させる.'(_コマンド引数ならび) :- 'そのまま表示する.'([_姓,_名]) :- writef('%w %w\n',[_姓,_名]),!. コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させる.'(_コマンド引数ならび) :- tell(user_error), writef('%w\n',[_コマンド引数ならび]), told. '課題 II コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ. コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること. また,コマンド引数に整数以外が与えられた場合にも,標準エラー出力にエラー分を 表示させること.' :- 'コマンド引数から任意の個数の整数を得て、引数の長さが1以上であり、すべて整数であるかを調べる'(_整数ならび), その和を表示する(_整数ならび). 'コマンド引数から任意の個数の整数を得て、引数の長さが1以上であり、すべて整数であるかを調べる'(_整数ならび) :- 'コマンド引数から任意の個数の整数を得て、'(_整数ならび), すべて整数であるかを調べる(_整数ならび). 'コマンド引数から任意の個数の整数を得て、'(_整数ならび) :- current_prolog_flag(argv,_整数ならび). '引数の長さが1以上であり、すべて整数であるかを調べる'(_整数ならび) :- '引数の長さが1以上であり、'(_整数ならび), すべて整数であるかを調べる(_整数ならび). '引数の長さが1以上であり、'(_整数ならび) :- length(_整数ならび,_要素数), _要素数 > 0. すべて整数であるかを調べる(_整数ならび) :- forall(member(_整数,_整数ならび),integer(_整数)). その和を表示する(_整数ならび) :- sum_list(_整数ならび,_和), writef('引数に与えられた整数の合計は%wです\n',[_和]). '課題 III n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m)'(_n,_m,__整数の和) :- 'n から m までの整数の和を求める'(_n,_m,0,_整数の和). 'n から m までの整数の和を求める'(N,N,_ここまでの累計,_整数の和) :- _整数の和 is _ここまでの累計 + N. 'n から m までの整数の和を求める(N,M,_ここまでの累計,_整数の和) :- 'NがMより小さい間、ここまでの累計にNを加えて行く'(N,M,_ここまでの累計,_整数の和). 'NがMより小さい間、ここまでの累計にNを加えて行く'(N,M,_ここまでの累計,_整数の和) :- 'NがMより小さい間、ここまでの累計にNを加える'(N,M,_ここまでの累計,_Nを加えた累計), succ(N,N2), 'n から m までの整数の和を求める'(N2,M,_Nを加えた累計,_整数の和). 'NがMより小さい間、ここまでの累計にNを加える'(N,M,_ここまでの累計,_Nを加えた累計), N < M, ここまでの累計にNを加える(N,_ここまでの累計,_Nを加えた累計). ここまでの累計にNを加える(N,_ここまでの累計,_Nを加えた累計) :- _Nを加えた累計 is _ここまでの累計 + N. 引数の長さ検査(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. % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,UserParameterList).