使用数组按顺序打印记录

时间:2013-04-02 15:34:26

标签: cobol

我想知道我想做什么可以在COBOL中完成。我正在尝试从不合规的文件中读取医院和患者数据。而不是使用Sort(就像现实生活中的每个人一样),我将使用数组以某种方式对输入的数据进行排序。最后,我应该将报告打印到按医院编号分组的另一个文件。

所以,

Hospital #
patient 018
patient 020

total for hospital #

Hospital #
patient 011
patient 009

total for hospital #

所有这些医院的数字都在1到30之间,患者数量在1到20之间。我对于做什么以及如何总结患者平衡非常了解,但您如何看待就这样:

将数据读入数组(这显然超过1维)。此时数据在数组中未排序。如果它在数组中排序,我认为它不重要,只要它在报告排序中出现。这听起来不错吗?是的,这是一个任务。任何提示或建议,可以在不给出答案的情况下提供反馈?

编辑: 好的,所以我尝试创建一个2d类型的数组,它将拥有完成工作所需的字段(hos num,pat name,pat num,pat amnt)。当然,我想将每个患者的数量加到医院小计的运行总数中。

这是我的阵列:

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.

在读取文件并将其移动到我的工作存储字段时,我尝试执行两个不同的循环,如下所示:

 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

由于某种原因,这将无法编译,它给出错误:意外的ADD,我不知道为什么。我正在使用openCobol。我没有丰富的经验,所以我不确定为什么这不是编译。我仍然不确定我是否朝着正确的方向前进。我知道我想说,为什么计数在给定的医院号码上将患者数据移动到变量,然后以某种方式我应该知道当前医院号码何时完成。输出医院小计,然后重复该过程。

2 个答案:

答案 0 :(得分:2)

“所有这些医院号码都在1到30之间,患者数量在1到20之间”

因此,将这些值用作表中的“下标”。第一级的数字(1到30),第二级的患者数(1到20)。事先将所有东西都设置为空间。

当您列出时,列出不是空格的跳数(当时下标的值可以告诉您哪个,或者代替存储医院)以及所有不是空间的患者。

但是,您的样本输出患者“有点超出”1-20 :-)

编辑:

您的代码存在一些问题。

加载表格时,您只需一次添加一个医院/患者组合。

从表中提取数据时,您将“循环”通过它。

您将医院号码移至表格,但您将其移至组级别,因此将删除该条目下的任何内容。

我已经在评论中提到过拼写错误。当你收到类似的编译消息时,你必须“好吧,这行上面或上面有错误。”

您正在执行运行总计而未将起始值设置为零。

您不需要像往常一样执行运行总计,您可以在列出数据时执行此操作。

其他一些事情。您将索引称为“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.
       .

答案 1 :(得分:1)

您给出的示例患者编号超出1到20范围。我猜是的 你真的想说每个医院有1到20名病人,而不是病人的数字 落在1到20的范围内。

我也在想你的陈述:“以某种方式对进入的数据进行排序”是真正的目标。

输入文件中的数据未排序,但您需要对它们进行排序。有几种方法 这样做:

  • 将所有数据读入表中,然后使用外部SORT程序或内部对表进行排序   排序你自己写的(例如冒泡排序或类似的东西)。走这条路将涉及到   做两种,一种用于餐桌的每个维度(例如,按医院排序,然后由医院内的患者排序)

  • 读取记录并将其添加到表中,以便始终对表进行排序。这意味着能够插入   表格顶部的新项目,表格中两个现有项目之间或表格末尾的新项目。   同样,这将是一个二维过程:添加医院,在医院内添加患者

  • Bill Woodger提出的方法只有在医院和患者数量不足时才会有效 非常小的范围(如你所建议的那样)。

无论如何,您现在有三条建议要跟进。由于这是一项家庭作业,我会以此为基础 我选择了围绕这项任务教授的课程材料。如果是内部/外部排序 强调,然后去分拣路线。如果是多维表声明和操作 最近的主题随后得到了构建并保持表格排序。如果哈希出现了,请考虑比尔的 建议。

相关问题