このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 148代目 #436 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # :- dynamic(電話帳/1). :- abolish(電話帳/1). 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- '名前、電話番号を入力する'(_名前,_電話番号), 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). '名前、電話番号を入力する'(_名前,_電話番号) :- 名前を入力する(_名前). 電話番号を入力する(_電話番号). 名前を入力する(_名前) :- 行入力(_名前). 電話番号を入力する(_電話番号) :- 行入力(_行), 電話番号入力診断(_行,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(_行,_電話番号) :- 構成文字は数字かハイフンだけ(_行),!. 電話番号入力診断(_行,_電話番号) :- 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび), writef('入力された %w には電話番号としてふさわしくない文字 %w が含まれています。再入力をお願いします。\n',[_行,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび) :- atom_chars(_行,_文字ならび), 数字かハイフン以外の構成文字を選別する(_文字ならび,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める(L1,L2_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). :- 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する(L1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L2],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L) :- 数字かハイフン以外の文字を持つもので(_文字), 既出文字ではない(_文字,L). 数字かハイフン以外の文字を持つもので(_文字) :- \+(数字かハイフン(_文字)). 既出文字ではない(_文字,L) :- \+(既出文字(_文字,L)). 既出文字(_文字,L) :- member(_文字,L). 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- 数字かハイフン(_文字),!. 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- member(_文字,L). 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳) :- retract(電話帳(_更新前電話帳)), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳), assertz(電話帳(_更新後電話帳)). ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳) :- 電話帳(_電話帳), 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳) :- tell(_サフィックス付きファイル名), writef('%t.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳) :- 電話帳を読み込み(_サフィックス付きファイル名,_電話帳), 電話帳を述語として定義する(_電話帳). 電話帳を読み込み(_サフィックス付きファイル名,_電話帳) :- see(_サフィックス付きファイル名), read(_電話帳), seen. 電話帳を述語として定義する(_電話帳) :- abolish(電話帳/2), assertz(電話帳(_電話帳)), 'ファイル名にはサフィックスとして.txtが付く'(_サフィックス付きファイル名,_サフィックス付きファイル名) :- sub_atom(_サフィックス付きファイル名,_,4,0,'.txt'),!. 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名) :- atom_concat(_ファイル名,'.txt',_サフィックス付きファイル名). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび).