gpt4 book ai didi

cobol - 使用数组按顺序打印记录

转载 作者:行者123 更新时间:2023-12-04 05:03:50 25 4
gpt4 key购买 nike

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

所以,

Hospital #
patient 018
patient 020

total for hospital #

Hospital #
patient 011
patient 009

total for hospital #

所有这些医院编号都在 1 到 30 之间,患者编号在 1 到 20 之间。我对要做什么以及如何总结患者余额有很好的想法,但是您认为这样处理如何:

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

编辑:
好的,所以我尝试创建一个二维类型数组,其中包含完成工作所需的字段(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

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

最佳答案

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

因此,将这些值用作表中的“下标”。第一级为医院编号(1 至 30),第二级为患者编号(1 至 20)。一切都预先设定好了,比如说,空间。

当你来list out的时候,列出不是空格的hopitals(当时下标的值可以告诉你是哪个,或者是存储医院)和他们所有的不是空格的病人。

但是,您的样本输出中的患者“有点超出”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.
.

关于cobol - 使用数组按顺序打印记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com