2

私がやりたいことがCOBOLで達成できるかどうか疑問に思っています。順番に並んでいないファイルから病院と患者のデータを読み込もうとしています。Sort を使用する代わりに (誰もが実際に行うように)、配列を使用して、受信したデータを何らかの方法で並べ替えます。最後に、病院番号でグループ化された別のファイルにレポートを出力することになっています。

そう、

Hospital #
patient 018
patient 020

total for hospital #

Hospital #
patient 011
patient 009

total for hospital #

これらの病院の数はすべて 1 から 30 の間で、患者の数は 1 から 20 の間です。私は何をすべきか、患者のバランスをどのように合計するかについてかなり良い考えを持っていますが、この方法でそれを行うことについてどう思いますか? :

データを配列に読み込みます (これは明らかに 1 次元以上になります)。この時点で、データは配列内でソートされていません。ソートされたレポートに出てくる限り、配列内でソートされていても問題ないと思います。これは正しいと思いますか?はい、これは課題用です。答えを出さずに提供できるヒントや推奨事項、フィードバックはありますか?

編集:さて、仕事を完了するために必要なフィールド(hos num、pat name、pat num、pat amnt)を持つ2dタイプの配列を作成しようとしました。そしてもちろん、病院の小計の現在の合計に各患者の金額を追加したいと思います。

これが私の配列です:

01  HospArray value spaces.
       05  hosnum   occurs 30 times indexed by subsa.
         07  patnum   occurs 20 times indexed by subsb.
           10  patname  PIC X(20).
           10  patamt   PIC 9(7)v99.
         07  hossubtotal  PIC 9(7)v99.

ファイルを読み込んで作業用ストレージ フィールドに移動している間に、次のような 2 つの異なるループを実行しようとしました。

 perform varying subsa from 1 by 1 until subsa > 30
             move hos-num-ws to hosnum (subsa)
          perform varying subsb from 1 by 1 until subsb > 20

               move pat-name-ws to patname(subsa, subsb)
               move pat-amnt-od-ws to patamt(subsa, subsb)
               add  patamt(subsa, subsb) to hossubtotal (suba)

          end-perform
       end-perform

何らかの理由でこれはコンパイルされず、次のエラーが表示されます: Unexpected ADD and I am not know why. openCobol を使用しています。私は多くの経験を持っていないので、なぜこれがコンパイルされないのかわかりません。正しい方向に進んでいるかどうかはまだわかりません。私が言いたいのは、なぜ特定の病院番号にカウントがあるのか​​ 、患者データを変数に移動してから、現在の病院番号がいつ終了するかを知る必要があるということです。病院の小計を出力し、プロセスをもう一度繰り返します。

4

2 に答える 2

2

「これらの病院の数はすべて 1 から 30 の間で、患者の数は 1 から 20 の間です」

したがって、これらの値をテーブルの「添え字」として使用します。第 1 レベルは病院番号 (1 ~ 30)、第 2 レベルは患者番号 (1 ~ 20)。たとえば、事前にすべてがスペースに設定されています。

リストアウトするときは、スペースではない病院 (その時点での添え字の値で、どれが病院であるかがわかります) と、スペースではないすべての患者をリストします。

ただし、サンプル出力には、「やや超えた」患者が1〜20人います:-)

編集:

コードにはいくつか問題があります。

テーブルをロードするときは、一度に 1 つの病院/患者の組み合わせを追加するだけです。

テーブルからデータを抽出するとき、それを「ループ」します。

病院番号をテーブルに移動しますが、グループ レベルに移動するため、そのエントリの下にあるものはすべて消去されます。

私はすでにコメントでタイプミスについて言及しました。このようなコンパイル メッセージが表示された場合は、「まあ、この行の上かそれより上に何か問題があります」と答える必要があります。

開始値をゼロに設定せずに現在の合計を実行しています。

進行中の合計を実行する必要はありません。データをリストするときに実行できます。

他にもいくつか。インデックスを「subsa」および「subsb」と呼びます。これは「意味のある」ものではなく、紛らわしいものでもあります (これらはインデックスであり、添字は少し異なるものです)。

略語に一貫性を持たせる必要があります。意味のあるデータ名を取得する作業を行う必要があります。

スニペットの例を次に示します。名前付けと書式設定に時間を費やしましたこれは大変な作業のように思えるかもしれませんが、それがエディターでできることです。長い名前は一度しか入力しませんでしたが、短い名前はそれぞれ入力したに違いありません。

   01  HospArray value spaces.
       05  FILLER occurs 30 times 
                      indexed by I-Hospital-Entry.
           10  HA-Hospital-Entry.
               15  HA-Hospital-Number      pic xx. 
                   88  HA-hospital-not-present
                                           VALUE SPACE.
               15  FILLER occurs 20 times
                          indexed by I-Patient-Entry.
                   20  HA-Patient-Entry.
                       25  HA-Patient-Number         pic xx.
                           88  HA-Patient-not-present
                                           VALUE SPACE.
                       25  HA-Patient-Name           PIC X(20).
                       25  HA-Patient-Payment-Amount PIC 9(7)v99.
   01  Hospital-Sub-Total                            PIC 9(7)v99.
   01  W-Patient-Name                                pic x(20).
   01  Patient-Payment-Amount                        pic 9(7)v99.
   01  Hospital-Number.
       05  Hospital-Number-N                         pic 99.
   01  Patient-Number.
       ...
       SET I-Hospital-Entry         TO Hospital-Number-N
       SET I-Patient-Entry          TO Patient-Number-N 
       MOVE Hospital-Number         TO HA-Hospital-Number 
                                        ( I-Hospital-Entry )
       MOVE Patient-Number          TO HA-Patient-Number 
                                        ( I-Hospital-Entry 
                                           I-Patient-Entry )
       MOVE W-Patient-Name          TO HA-Patient-Name
                                        ( I-Hospital-Entry 
                                           I-Patient-Entry )
       MOVE Patient-Payment-Amount  TO HA-Patient-Payment-Amount
                                        ( I-Hospital-Entry 
                                           I-Patient-Entry )
       ...
       to output the results
       PERFORM                      LIST-PATIENTS-BY-HOSPITAL

       GOBACK
       .
   LIST-PATIENTS-BY-HOSPITAL.

       perform 
         varying I-Hospital-Entry 
           from 1 by 1 
           until I-Hospital-Entry > 30
           IF HA-hospital-not-present ( I-Hospital-Entry ) 
               CONTINUE
           ELSE
               PERFORM              LIST-PATIENTS
               DISPLAY Hospital-Sub-Total
           END-IF
           move HA-Hospital-Number 
                 ( I-Hospital-Entry ) 
                                    TO Hospital-Number
       end-perform
       .
   LIST-PATIENTS.
       perform 
         varying I-Patient-Entry 
           from 1 by 1 
           until I-Patient-Entry > 20
           IF HA-hospital-not-present ( I-Hospital-Entry ) 
               CONTINUE
           ELSE
               PERFORM              PATIENT-DETAILS
           END-IF
           DISPLAY Hospital-Sub-Total
       end-perform
       .
   PATIENT-DETAILS.
       move HA-Patient-Name 
             ( I-Hospital-Entry 
                I-Patient-Entry )   TO W-Patient-Name 
       move HA-Patient-Payment-Amount
             ( I-Hospital-Entry 
                I-Patient-Entry )   TO Patient-Payment-Amount 
       add Patient-Payment-Amount   TO Hospital-Sub-Total
       the "target" fields here can be in a formatted line for printing/DISPLAYing.
       .
于 2013-04-02T16:01:17.347 に答える
1

あなたが示した例の患者数は、1 から 20 の範囲をはるかに超えています。病院ごとに 1 人から 20 人の患者がいるということを本当に言いたかったのだと思いますが、患者数が 1 人から 20 人の範囲に入るということではありません。

また、「入ってくるデータを何らかの方法でソートする」というあなたの発言が、ここでの本当の目的だとも考えています。

入力ファイルからのデータはソートされていませんが、ソートする必要があります。これを行うにはいくつかの方法があります。

  • すべてのデータをテーブルに読み込み、外部の SORT プログラムまたは自分で作成した内部ソート (バブル ソートなど) を使用してテーブルをソートします。この方法では、テーブルの各ディメンションに対して 1 つずつ、2 つの並べ替えを行う必要があります (たとえば、病院ごとに並べ替え、次に病院内の患者ごとに並べ替えます)。

  • テーブルが常にソートされるように、レコードを読み取り、それをテーブルに追加します。これは、テーブルの上部、テーブル内の 2 つの既存のアイテムの間、またはテーブルの最後に新しいアイテムを挿入できることを意味します。繰り返しますが、これは 2 次元のプロセスになります。病院を追加し、病院内に患者を追加します。

  • Bill Woodger によって提案されたアプローチは、病院と患者の数が非常に狭い範囲内にある場合にのみうまく機能します (あなたが示唆したように)。

いずれにせよ、フォローアップすべき 3 つの提案があります。これは宿題なので、この宿題に関連して教えられているコース教材に基づいて選択します。内外仕分けを重視するなら、仕分け路線へ。多次元テーブルの宣言と操作が最近のトピックである場合は、ビルドを使用して、テーブルを並べ替えたままにします。ハッシュが発生した場合は、Bill の提案を検討してください。

于 2013-04-02T18:38:18.257 に答える