3

好的,所以我正在做作业,但后来我发现我被要求为每 4 条记录添加页码和更改页面。因为它是一门在线课程,我认为讲座视频中没有任何关于页码的内容。所以主要问题是

  1. 要添加包含日期和页码的标题,
  2. 每页打印 4 条记录,即打印 4 条记录后需要换页。

我真的不知道该怎么做。

这是我完成的代码:

   ENVIRONMENT DIVISION.
   FILE-CONTROL.   SELECT STOCK-IN ASSIGN TO 'F:/CS201S13/PROJECT2.TXT'
                   ORGANIZATION IS LINE SEQUENTIAL.
                   SELECT STOCK-OUT ASSIGN TO 'F:/CS201S13/PROJECT2OUTPUT.TXT'
                   ORGANIZATION IS LINE SEQUENTIAL.
   DATA DIVISION.
   FILE SECTION.
   FD STOCK-IN.
   01 STOCK-RECORD.
       05 ST-TRANSACTION-INFORMATION.
           10 ST-TRANSACTION-SHARES    PIC 9(3).
           10 ST-TRANSACTION-STOCK     PIC X(14).
       05 ST-PURCHASE-INFORMATION.
           10 ST-PURCHASE-PRICE        PIC 9(5)V99.
           10 ST-PURCHASE-DATE.
               15 ST-PURCHASE-YEAR     PIC 99.
               15 ST-PURCHASE-MONTH    PIC 99.
               15 ST-PURCHASE-DAY      PIC 99.
       05 ST-SALE-INFORMATION.
           10 ST-SALE-PRICE            PIC 9(5)V99.
           10 ST-SALE-DATE.
               15 ST-SALE-YEAR         PIC 99.
               15 ST-SALE-MONTH        PIC 99.
               15 ST-SALE-DAY          PIC 99.
   FD STOCK-OUT. 
   01 STOCK-RECORD-OUT.
       05 ST-TRANSACTION-INFORMATION-OUT.
           10 ST-TRANSACTION-SHARES-OUT PIC 9(3).
           10 ST-TRANSACTION-STOCK-OUT  PIC X(14).
       05 TOTAL-PURCHASE               PIC 9(8)V99.
       05                              PIC X(4).
       05 TOTAL-SALE                   PIC 9(8)V99.
       05                              PIC X(4).
       05 TOTAL-PROFIT                 PIC 9(8)V99.
       05                              PIC X(4).
       05 ST-PURCHASE-DATE-OUT.
           10 ST-PURCHASE-YEAR-OUT     PIC 99.
           10                          PIC X VALUE '/'.
           10 ST-PURCHASE-MONTH-OUT    PIC 99.
           10                          PIC X VALUE '/'.
           10 ST-PURCHASE-DAY-OUT      PIC 99.
       05                              PIC X(4).
       05 ST-SALE-DATE-OUT.
           10 ST-SALE-YEAR-OUT         PIC 99.
           10                          PIC X VALUE '/'.
           10 ST-SALE-MONTH-OUT        PIC 99.
           10                          PIC X VALUE '/'.
           10 ST-SALE-DAY-OUT          PIC 99.
       05                              PIC X(4).
       05 RECORD-OUT                   PIC 9 VALUE 0.
       05 PAGE-OUT                     PIC 9.
   WORKING-STORAGE SECTION.
   01 ARE-THERE-MORE-RECORDS PIC XXX VALUE 'YES'.
   01 IS-THIS-PAGE-FULL      PIC XXX VALUE 'NO '.
   PROCEDURE DIVISION.
   100-MAIN-PROCESS.
   OPEN INPUT STOCK-IN
        OUTPUT STOCK-OUT
   MOVE ST-TRANSACTION-INFORMATION TO ST-TRANSACTION-INFORMATION-OUT
   PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
       READ STOCK-IN
           AT END
               MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
           NOT AT END
               PERFORM 200-PROCEDURE-RTN
               ADD 1 TO RECORD-OUT
       END-READ
   END-PERFORM
   CLOSE STOCK-IN
         STOCK-OUT
   STOP RUN.
   200-PROCEDURE-RTN.
   IF RECORD-OUT = 4
       MOVE 'YES' TO IS-THIS-PAGE-FULL
       MOVE 0 TO RECORD-OUT
       MOVE 'NO ' TO IS-THIS-PAGE-FULL
       ADD 1 TO PAGE-OUT
   END-IF
   MULTIPLY ST-PURCHASE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-PURCHASE
   MULTIPLY ST-SALE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-SALE
   SUBTRACT TOTAL-PURCHASE FROM TOTAL-SALE GIVING TOTAL-PROFIT
   WRITE STOCK-RECORD-OUT.
4

2 回答 2

5

你们既近又远。

“关闭”是因为在将 IS-THIS-PAGE-FULL 设置为 YES 和 NO 之间需要一些代码。

“远离”,因为您有很多事情要做,而不仅仅是“修补”您拥有的东西。

程序是在编写输出文件 (STOCK-OUT)报告,还是 STOCK-OUT 是报告?如果是报告,请更改名称,以便清楚地表明它是报告,而不是输出文件。

如果这看起来很多,请不要担心。您应该学习如何在 Cobol 中编程,以及学习 Cobol。不会在一夜之间发生。

没有特别的顺序:

  • 始终包括 FILE-STATUS 检查所有文件上的所有 IO 操作。目前,如果您的输入无法打开并且系统没有使程序失败(即使您的程序失败,您可能正在学习 Cobol 以便能够使用任何系统,而不仅仅是您拥有的系统),那么将不会有任何记录读,你的“文件结束测试”永远不会是,你会有一个 BFL(大胖循环)。通过 FILE-STATUS 检查,生成有用的消息,包括适用于失败 READ 或 WRITE 的键/参考/记录号。

你可能会觉得这是很多工作。但是,将一些包含所有内容的“模板”文件放在一起,然后每次将它们粘贴(甚至复制)到您的程序中。

  • 您在 FD 中有 VALUE 子句。这些不会像你想的那样。

  • 您的页数只有一位数,这不太可能有一般应用。

  • 为什么使用 YES 和 NO 作为文字?查看与“条件名称”相关的 SET 动词,使用 88 进行测试和“标志/开关”。

  • 在打开输入之后但在读取记录之前,您有“MOVE ST-TRANSACTION-INFORMATION”,并且在程序中只有一个对它的引用。这是行不通的。

  • 对于读取文件,请查看“启动读取”方法。

    读取输入循环直到文件结束(文件状态为 88)处理数据读取输入结束循环

这避免了 AT END/NOT AT END,允许处理标题(如果存在)和“空文件”而不会阻塞主逻辑。代码“扩展”了标题/拖尾(包括正确的数量)、键的序列检查等,但您只需要编码一次然后“模板化”它。

  • 根据 FD 中的 VALUE 子句,您希望 RECORD-OUT 为零,因此对 4 的测试实际上会在第一页得到 5 个,然后是 4 个。

  • 你总是假设会有一个“利润”(一个正数),这是不现实的,但你不允许“利润”有一个有符号的值。

现在,为了报告。

对于您的报告 FD,只需将其简单化,即打印行的长度。

在 WORKING-STORAGE 中,为您需要的标题和标题定义数据。定义打印行的数据。由于您在 WORKING-STORAGE 中,请将不会将数据移至 PROCEDURE DIVISION 的所有内容的值。

当你写了四个项目(或者当你的程序告诉你这个)并且你有第五个时,写下标题和标题,记住更新页码。

我说“或者当你的程序告诉你这个”是因为你可以将“写入的记录”的原始值设置为 4。评论它,以便清楚它是你想要的,以及你想要它的原因。原因是,您不必再处理“第一次”标题和其他事情。第一次,或者在“控制中断”时(我想你很快就会得到那些)将“已经在页面上完成”设置为页面的最大值,并且标题会在你想要的时候弹出。

格式化打印行。执行一个 para 来打印它(这是“页面已满”测试的地方)。

注意:您可以在日期中为您的“/”使用 VALUE,也可以在图片中使用“/”编辑字符,如下所示:

05  an-input-date PIC X(8) (can be other definitions).
...
05  date-to-print PIC X(4)/XX/XX.
...
MOVE an-input-date TO date-to-print

我希望看到您使用的是“最少的句号/句号”。你可以走得更远一点。

MOVE an-input-date TO date-to-print
.

然后你在一个段落中得到你的最后一个句号/句号,而不会将它“附加”到任何特定的代码行,这使得“折腾代码”更容易,因为你不必考虑“我需要/不需要需要那个句号/句号”。

您还可以在此处查看一些 Cobol 问题,并掌握一些一般提示和建议。

于 2013-04-04T10:17:27.343 回答
2

这可能有帮助,也可能没有帮助,如果不支持 LINAGE,您将不得不进行一些明确的计数。

  *****************************************************************
  * Example of LINAGE File Descriptor
  * Author: Brian Tiffin
  * Date:   10-July-2008
  * Tectonics: $ cobc -x linage.cob
  *            $ ./linage <filename ["linage.cob"]>
  *            $ cat -n mini-report
  *****************************************************************
   IDENTIFICATION DIVISION.
   PROGRAM-ID. linage-demo.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      select optional data-file assign to file-name
          organization is line sequential
          file status is data-file-status.
      select mini-report assign to "mini-report".

   DATA DIVISION.
   FILE SECTION.
   FD  data-file.
   01  data-record.
      88 endofdata        value high-values.
      02 data-line        pic x(80).
   FD  mini-report
      linage is 16 lines
          with footing at 15
          lines at top 2
          lines at bottom 2.
   01  report-line         pic x(80).

   WORKING-STORAGE SECTION.
   01  command-arguments   pic x(1024).
   01  file-name           pic x(160).
   01  data-file-status    pic 99.
   01  lc                  pic 99.
   01  report-line-blank.
      02 filler           pic x(18) value all "*".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(34)
          VALUE "THIS PAGE INTENTIONALLY LEFT BLANK".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(18) value all "*".
   01  report-line-data.
      02 body-tag         pic 9(6).
      02 line-3           pic x(74).
   01  report-line-header.
      02 filler           pic x(6) VALUE "PAGE: ".
      02 page-no          pic 9999.
      02 filler           pic x(24).
      02 filler           pic x(5) VALUE " LC: ".
      02 header-tag       pic 9(6).
      02 filler           pic x(23).
      02 filler           pic x(6) VALUE "DATE: ".
      02 page-date        pic x(6).

   01  page-count          pic 9999.

   PROCEDURE DIVISION.

   accept command-arguments from command-line end-accept.
   string
      command-arguments delimited by space
      into file-name
   end-string.
   if file-name equal spaces
      move "linage.cob" to file-name
   end-if.

   open input data-file.
   read data-file
      at end
          display
               "File: " function trim(file-name)
               " open error or empty"
          end-display
          go to early-exit
   end-read.

   open output mini-report.

   write report-line
      from report-line-blank
   end-write.

   move 1 to page-count.
   accept page-date from date end-accept.
   move page-count to page-no.
   write report-line
      from report-line-header
      after advancing page
   end-write.

   perform readwrite-loop until endofdata.

   display
      "Normal termination, file name: "
      function trim(file-name)
      " ending status: "
      data-file-status
   end-display.
   close mini-report.

  * Goto considered harmful?  Bah!  :)
   early-exit.
   close data-file.
   exit program.
   stop run.

  ****************************************************************
   readwrite-loop.
   move data-record to report-line-data
   move linage-counter to body-tag
   write report-line from report-line-data
      end-of-page
          add 1 to page-count end-add
          move page-count to page-no
          move linage-counter to header-tag
          write report-line from report-line-header
              after advancing page
          end-write
   end-write
   read data-file
      at end set endofdata to true
   end-read
   .

  *****************************************************************
  * Commentary
  * LINAGE is set at a 20 line logical page
  *  16 body lines
  *   2 top lines
  *   A footer line at 15 (inside the body count)
  *   2 bottom lines
  * Build with:
  * $ cobc -x -Wall -Wtruncate linage.cob
  * Evaluate with:
  * $ ./linage
  * This will read in linage.cob and produce a useless mini-report
  * $ cat -n mini-report
  *****************************************************************
   END PROGRAM linage-demo.
于 2013-04-06T05:37:57.750 回答