このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/277
#  [1] 授業単元:プログラミング C言語  
#  [2] 問題文(含コード&リンク): 次の投稿に 
#  
#  ../test/read.cgi/tech/1296387672/277   住所録を以下の条件で作成 
#   ―蚕袁燭涼羶箸六疚勝⇒絞愴峭罅⊇蚕蝓電話番号のみ。以下の構造体を使用。 
#  typedef struct jusyoroku { 
#      char name[32];     
#      char yubin[32];  
#      char add[32];  
#          char tel[32];       
#  } 
#  ◆―蚕袁燭魯謄ストファイルに保存。氏名、郵便番号、住所、電話番号が1行ずつ記載され、 
#  1件ごとに「-----」区切られ、最後は「*****」となる。 
#  例: 
#  氏名 
#  郵便番号 
#  住所 
#  電話番号 
#  ----- 
#  : 
#  : 
#  : 
#  ----- 
#  氏名 
#  郵便番号 
#  住所 
#  電話番号 
#  ***** 
#  E佻新鐃瑤100件まで 
#  い海離愁侫箸六慊蠅靴織侫.ぅ襪ら住所録を読み込め、また、保存もできる。 
#  イ海離愁侫箸禄蚕袁燭ら氏名、または電話番号で一致する人物を検索、情報をすべて表示できる。 
#  新しい住所録の追加、既存の住所録の変更・削除が可能。 
#  それぞれの機能はわかりやすく関数に分割すること。 
#   
#  よろしくお願いします。 
# 
# 

住所録を読み取る(_テキストファイル,_住所録) :-
        open(_テキストファイル,read,Instream),
        get_line(Instream,Line),
        住所録を読み取る(Instream,Line,_住所録),
        住所録を登録(_住所録),
        close(Instream),!.

住所録を読み取る(Instream,Line,[]) :-
        sub_atom(Line,0,1,'*'),!.
住所録を読み取る(Instream,Line,_住所録) :-
        sub_atom(Line,0,1,'-'),
        get_line(Instream,Line2),
        住所録を読み取る(Instream,Line,_住所録).
住所録を読み取る(Instream,Line,[[_氏名,_郵便番号,_住所,_電話番号]|R]) :-
        \+(sub_atom(Line,0,1,'-')),
        \+(sub_atom(Line,0,1,'*')),
        Line = _氏名,
        郵便番号を読み取る(Instream,_郵便番号),
        住所を読み取る(Instream,_住所),
        電話番号を読み取る(Instream,_電話番号),
        get_line(Line2),
        住所録を読み取る(Instream,Line2,R).

氏名を読み取る(Instream,_氏名) :-
        get_line(Instream,_氏名),!.

郵便番号を読み取る(Instream,_郵便番号) :-
        get_line(Instream,_郵便番号),!.

住所を読み取る(Instream,_住所) :-
        get_line(Instream,_住所),!.

電話番号を読み取る(Instream,_電話番号) :-
        get_line(Instream,_電話番号),!.

住所録を登録(_住所録) :-
        abolish(住所録/4),
        append(_,[[_氏名,_郵便番号,_住所,_電話番号]|R],_住所録),
        assertz(住所録(_氏名,_郵便番号,_住所,_電話番号)),
        R = [].

テキスト名を指定して住所録の保存(_保存テキスト名) :-
        open(_保存テキスト名,write,Outstream),
        住所録の保存(Outstream),
        close(Outstream).

住所録の保存(Outstream) :-
        住所録(_氏名,_郵便番号,_住所,_電話番号),
        write_formatted(Outstream,'-----\n%32s\n%32s\n%32s\n%32s\n',[_氏名,_郵便番号,_住所,_電話番号]),
        fail.
住所録の保存(Outstream) :-
        write(Outstream,'*****\n'),!.

住所録から氏名、または電話番号で一致する人物を検索して情報を表示する :-
        write('検索語を入力してください : '),
        get_line(_検索語),
        氏名を鍵に住所録を検索する(_検索語),
        電話番号を鍵に住所録を検索する(_検索語).

氏名を鍵に住所録を検索する(_氏名) :-
        住所録(_氏名,_郵便番号,_住所,_電話番号),
        write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]),
        fail.
氏名を鍵に住所録を検索する(_).

電話番号を鍵に住所録を検索する(_住所) :-
        住所録(_氏名,_郵便番号,_住所,_電話番号),
        write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]),
        fail.
電話番号を鍵に住所録を検索する(_).

新しい住所録の追加 :-
        write('氏名を入力してください : '),
        get_line(_氏名),
        write('郵便番号を入力してください : '),
        get_line(_郵便番号),
        write('住所を入力してください : '),
        get_line(_住所),
        write('電話番号を入力してください : '),
        get_line(_電話番号),
        assertz((住所録(_氏名,_郵便番号,_住所,_電話番号)),
        住所録述語の保存.

既存の住所録を定義順の変更なしに変更 :-
        write('氏名を入力してください : '),
        get_line(_氏名),
        write('変更項目を選択してください : '),
        get_line(_変更項目),
        既存の住所録の変更(_氏名,_変更項目,_変更された住所録),
        住所録を登録(_変更された住所録),
        住所録述語の保存.

既存の住所録を定義順の変更なしに変更(_氏名,郵便番号,_住所録) :-
        write('郵便番号を入力してください : '),
        get_line(_郵便番号),
        findall([_氏名,_郵便番号,_住所,_電話番号],(
                    clause(住所録(_氏名,_郵便番号,_住所,_電話番号),_)),
                L1),
        郵便番号を置換(_氏名,L1,_住所録).
既存の住所録を定義順の変更なしに変更(_氏名,住所,_住所録) :-
        write('住所を入力してください : '),
        get_line(_住所),
        findall([_氏名,_住所,_住所,_電話番号],(
                    clause(住所録(_氏名,_住所,_住所,_電話番号),_)),
                L1),
        住所を置換(_氏名,L1,_住所録).
既存の住所録を定義順の変更なしに変更(_氏名,電話番号,_住所録) :-
        write('電話番号を入力してください : '),
        get_line(_電話番号),
        findall([_氏名,_電話番号,_住所,_電話番号],(
                    clause(住所録(_氏名,_電話番号,_住所,_電話番号),_)),
                L1),
        電話番号を置換(_氏名,L1,_住所録).


郵便番号を置換(_氏名,_郵便番号,[],[]) :- !.
郵便番号を置換(_氏名,_郵便番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_郵便番号,_住所,_電話番号]|R2]) :-
        郵便番号を置換(_氏名,_郵便番号,R1,R2).
郵便番号を置換(_氏名,_郵便番号,[L|R1],[L|R2]) :-
        郵便番号を置換(_氏名,_郵便番号,R1,R2).

住所を置換(_氏名,_住所,[],[]) :- !.
住所を置換(_氏名,_住所,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_住所,_住所,_電話番号]|R2]) :-
        住所を置換(_氏名,_住所,R1,R2).
住所を置換(_氏名,_住所,[L|R1],[L|R2]) :-
        住所を置換(_氏名,_住所,R1,R2).

電話番号を置換(_氏名,_電話番号,[],[]) :- !.
電話番号を置換(_氏名,_電話番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_電話番号,_住所,_電話番号]|R2]) :-
        電話番号を置換(_氏名,_電話番号,R1,R2).
電話番号を置換(_氏名,_電話番号,[L|R1],[L|R2]) :-
        電話番号を置換(_氏名,_電話番号,R1,R2).

住所録述語の保存 :-
        tell('住所録#4.pro'),
        listing(住所録),
        told.