• ベストアンサー

フローチャート (ファイル併合処理)について

今、フローチャートについて勉強していますが、 ファイルの併合処理について、分からないところがあります。 ~問~ ファイルAとファイルBは昇順に並んでいます。この2つのファイルを併合して出力ファイルCを作成するフローチャートを作成。(キーは00~10) もしファイルAとファイルBに重複したキーのレコードがある場合は ファイルAのレコードのみをファイルCに出力し、エラー表示を行う。 大まかな流れは 開始→ファイルAオープン→ファイルBオープン→出力ファイルCオープン→併合処理の本処理→ファイルAクローズ→ファイルBクローズ→出力ファイルCクローズ→終了 だと思うのです。 問題は、併合処理はどういって組むか分からない部分と 出力ファイルCにどうやってA,Bのファイルのキーの数字を入れればよいか(書けばいいか)分かりません。 フローチャートの記号は一折把握していますが、ファイル関連はネットでも手元の書物でもあまり書いていませんでした。 どうかよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>問題は、併合処理はどういって組むか分からない部分と 質問者さんは、以下のように指示された時、どうしますか? --------------------- 1組のトランプからスペードのK(キング)、A(エース)、2~10、ハートのK、A、2~10を取り出し、スペードの山、ハートの山を作りました。 それぞれの山からランダムに4枚づつを抜き出して破棄し、7枚づつ、14枚のカードを残しました。 それぞれの山を、山ごとに、数字の小さい順に並べました。上から順にカードをめくれば、小さい数字⇒大きい数字、になっています。 数字の大小は、Kが一番小さく、次がA、次が2で、10が一番大きい事にします。 この2つの山を、数字が小さい順に並んだ1つの山にまとめなさい。 なお、スペードとハートで同じ数字があったら、ハートのカードは捨てて、スペードのカードだけ残しなさい。 また、カードは上から順番に1枚しかめくれません。 更に、めくったカードは、元に戻してはいけません。 --------------------- 実際にトランプ(トランプでなく、メモ用紙に2種類の数字を書いただけでも良いけど)を用意し「自分の手で、1山にまとめてみる」と良いでしょう。 そして、その時に「何をどう判断して、どういう行動をしたか?」を、文章で書き出してみましょう。 そして「判断した内容」「やった事」を、元の問題文に置き換えてみましょう。 例えば「スペードの山とハートの山の1番上のカードの数字を見比べ、スペードとハートの数字が等しいかどうか⇒ファイルAから読み込んだレコードのキーと、ファイルBから読み込んだレコードのキーを比較し、キーが等しいかどうか」のように。 あとは、書き出した文章に「フロー図記号」を付けて、行動した順番に線で結ぶだけです。 実は、上記の「トランプ遊び」は、実質的に「ファイルAとファイルBは昇順に並んでいます。この2つのファイルを併合して出力ファイルCを作成する」のと、まったく同じなのです。 フローチャートにしてみると「まったく同じ構造のフローチャート」になります。 >出力ファイルCにどうやってA,Bのファイルのキーの数字を入れればよいか(書けばいいか)分かりません。 「フローチャートを書けばよい」のであって「実際のプログラムで、ファイルCにキー付きで書き込む方法をどうすれば良いか」までは要求されていません。 そんな事は「実際にプログラムをコーディングするプログラマに任せれば良い」のであって、フローチャートを書く設計者が考える事ではありません。 フローチャートには 「ファイルAから読み込んだレコードのキーと、ファイルBから読み込んだレコードのキーを比較し、キーが等しいかどうか」 とか 「ファイルAから読んだレコードをファイルCに書き込む」 とか 「ファイルBから読んだレコードをファイルCに書き込む」 とかって書くだけです。 >フローチャートの記号は一折把握していますが、ファイル関連はネットでも手元の書物でもあまり書いていませんでした。 「実際にファイルを操作するプログラミング法」は「フローチャートには完全に無関係」ですよ。無関係なんだから書いてある訳ありません。 こういう「関係ない事で悩む」のは、たとえて言えば「どうすれば数字が順に並んだトランプの山を作れるだろう?」と考え「トランプを指で掴むには、指の筋肉を動かさないとならない。俺、指の筋肉の構造がどうなっているのか判らない。さあ困った」って悩んでいるのと同じです。 指の筋肉の構造を知らなくたって、赤ん坊でも老人でも、指を動かす事は出来ます。 前述のトランプ遊びも、数字が比較出来て、最終目的さえしっかり理解できれば、マージソートもフローチャートも何も知らない、コンピュータなんか触った事も無いような人でも目的を達成出来ると思います。出来ないのは「数字が読めない人」と「数字の大小が判らない人」だけです。 まさか、質問者さんは「さっきのトランプ遊び、目的達成できない」とか言いませんよね?

その他の回答 (4)

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.5

>大まかな流れは >開始→ファイルAオープン→ファイルBオープン→出力ファイルCオープン→併合処理の本処理→ファイルAクローズ→ファイルBクローズ→出力ファイルCクローズ→終了 >だと思うのです。 この問の肝は併合部分だと思いますので瑣末な問題ですが、この流れは余り良くないと思います。 ファイルA、Bの読込み、ファイルCへの出力が、併合処理と直結してループしています。ファイルアクセスは併合処理とは別に行い、入出力情報はバッファへ保持しておく方が良いでしょう。 開始→ファイルAオープン→ファイルA読込み→ファイルAクローズ→ファイルBオープン→ファイルB読込み→ファイルBクローズ→併合処理の本処理→出力ファイルCオープン→併合結果出力→出力ファイルCクローズ→終了 ファイルxxオープン→ファイルxx読込み→ファイルxxクローズ の部分は、モジュール化でしょうか。 何にせよ、不必要なファイルアクセス状態の継続は良いことではありません。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

外部ソート(マージソート)で調べてみてください。 基本的には、 1. 最初に、A、B、それぞれから1行ずつ読んでおく 2. A、B、どちらかのデータが無くなるまで、以下の繰り返し   ・Aのキーの方が小さい →Aのデータを出力し、Aを1行読み込む   ・Bのキーの方が小さい →Bのデータを出力し、Bを1行読み込む   ・AとBのキーは等しい →Aのデータを出力し、A、B両方を1行読み込む。エラーを表示。 3. A、B、どちらか残ってる方のデータを全部出力 という流れになります。 あと、ファイル入出力のフローチャート記号は平行四辺形です。 http://masudahp.web.fc2.com/flowchart/flow01.html

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.2

こんにちは ANo.1です。 細かいところは判らないけれど、ファイルCにエラー情報を出力しているように併合するファイルを(例えばファイルD)アペンドモードでオープンしてエラー以外の時に書き出せばよいのでは?

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.1

こんにちは システムによって図が小さく縮小されたため、読みとれないと思います。質問したい部分だけ再度アップされた方がよいと思います。

関連するQ&A