- ベストアンサー
検索がうまくいきません(pascal)
名前と電話番号を外部環境'teldata'に出力し、検索したい人の名前を入力し対応する電話番号を答えるプログラムを作りました(登録されてなければ「該当者なし」と出力、'end'が入力されるまで続く)。 コンパイルは通ったのですが検索結果はおかしなものになってしまいました。 どこが間違っているのか、ご教授ください。 ソース) program kadai(input,output,meibo); type KojinData = record name : packed array[1..20] of char; tel : packed array[1..15] of char end; var meibo : file of KojinData; x : KojinData; begin rewrite( meibo,'teldata' ); write('名前:'); readln(x.name); repeat write('電話番号:'); readln( x.tel ); write( meibo,x); write('名前:'); readln( x.name ) until (x.name='end'); reset( meibo,'teldata' ); write('名前:'); readln(x.name); repeat while not eof( meibo ) do begin read( meibo,x ) end; if x.name = x.name then begin writeln('電話番号:',x.tel) end else begin writeln('該当者なし') end until (x.name='end') end. 結果) 名前:a 電話番号:1 名前:b 電話番号:2 名前:c 電話番号:3 名前:end 名前:a 電話番号:3 電話番号:3 電話番号:3 電話番号:3 {強制終了するまで続く}
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
後ろの repeat の中が変です. まず, せっかく入力してもらった「名前」を, そのあとの read で潰してます. さらに, teldata に書き出したデータも最後の 1個を除いて無視しちゃっています. とどめに if の条件をよく見てください.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと考えてほしいのですが, 「全てのデータを読み出してから比較する」必要はありますか?
お礼
「1つ読み出してそのつど確認する」のを終りまで繰り返す、ようにプログラムして大体はできました。 まだ少し改良したい点はありますがそこは自分でなんとかしようと思います。 アドバイス、ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
ここで探す名前を入力 > write('名前:'); > readln(x.name); ... (1) ファイルからデータを取り出している > while not eof( meibo ) do begin > read( meibo,x ) ... (2) > end; (1)と(2)が同じ変数へ代入している ・・・ これで判定出来ますか =の両辺にある『x.name 』は違う物が存在するのか ・・・ > if x.name = x.name then begin > writeln('電話番号:',x.tel) end > else begin > writeln('該当者なし') end > until (x.name='end')
お礼
ご指摘を受けて直し、かなり完成に近いところまでこぎつけました。 まだ残ってるところは自分でなんとか改良したいと思います、アドバイスありがとうございました。
補足
readでデータを全て読み出して記憶し、入力した名前が含まれてるか判定する、と考えたのですがそうはできないのですね・・・。