このディレクトリの索引

# 出典 :: C/C++言語の宿題片付けます 140代目 #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 :- 'ユーザーパラメータからファイル名とキーとなる日付を得て、キーとなる日付に食べた昼食を得る'(_日付_昼食ならび), '_日付_昼食ならびを表示する'(_日付_昼食ならび), プログラムを終了する. 'ユーザーパラメータからファイル名とキーとなる日付を得て、キーとなる日付に食べた昼食を得る'(_日付_昼食ならび) :- 'ユーザーパラメータからファイル名とキーとなる日付を得て、'(_ファイル,_日付), 'キーとなる日付に食べた昼食を得る'(_ファイル,_日付,_日付_昼食ならび). 'ユーザーパラメータからファイル名とキーとなる日付を得て、'(_ファイル,_日付) :- ユーザーパラメータを得る(_ユーザーパラメータ), 診断(_ユーザーパラメータ,_ファイル,_日付),!. ユーザーパラメータを得る(_ユーザーパラメータ) :- current_prolog_flag(argv,_ユーザーパラメータ). 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), プログラムを終了する. 'キーとなる日付に食べた昼食を得る'(_ファイル,_日付,_日付_昼食ならび) :- get_split_lines(_ファイル,',',LL), 日付をキーに検索する(_日付,LL,_日付_昼食ならび). 日付をキーに検索する(_日付,_日付_昼食ならび,LL) :- findall([_日付,_昼食], member([_日付,_昼食],_日付_昼食ならび),LL). '_日付_昼食ならびを表示する'(_日付_昼食ならび) :- forall(member([_日付,_昼食],_日付_昼食ならび), writef('%w,%w\n',[_日付,_昼食])). get_split_lines(_ファイル,_区切り文字,_項目区切り行ならび) :- open(_ファイル,read,_入力), findall([_日付,_情報], 'at_end_of_streamになるまで日付・情報を得る'(_入力,_区切り文字,_日付,_情報),_項目区切り行ならび), close(_入力). 'at_end_of_streamになるまで日付・情報を得る'(_入力,_,_,_) :- at_end_of_stream(_入力),!,fail. 'at_end_of_streamになるまで日付・情報を得る'(_入力,_区切り文字,_日付,_情報) :- 行入力(_入力,_行), split_atom(_行,_区切り文字,'',[_日付,_情報]). 'at_end_of_streamになるまで日付・情報を得る'(_入力,_区切り文字,_日付,_情報) :- 'at_end_of_streamになるまで日付・情報を得る'(_入力,_区切り文字,_日付,_情報). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). split_atom(_行,_区切り文字,_埋め込み文字,L) :- split_string(_行,_区切り文字,_埋め込み文字,L1), '全ての要素をStringからAtomに変換する'(L1,L). '全ての要素をStringからAtomに変換する'(L1,L) :- findall(Atom, 要素をStringからAtomに変換する(L1,Atom),L). 要素をStringからAtomに変換する(L1,Atom) :- member(String,L1), atom_string(Atom,String). プログラムを終了する :- halt.