【问题标题】:I'm having trouble with tables using Cobol [closed]我在使用 Cobol 时遇到问题 [关闭]
【发布时间】:2013-12-10 14:00:46
【问题描述】:
 IDENTIFICATION DIVISION.
 PROGRAM-ID. MP4-5.
 ENVIRONMENT DIVISION.
 DATA DIVISION.
 WORKING-STORAGE SECTION.

 01 SEAT-DESCRIPTION.
    03 FILLER PIC X(50) VALUE "01   DRIVER".
    03 FILLER PIC X(50) VALUE "02   DRIVER'S ASST".
    03 FILLER PIC X(50) VALUE "03".
    03 FILLER PIC X(50) VALUE "04".
    03 FILLER PIC X(50) VALUE "05".
    03 FILLER PIC X(50) VALUE "06".
    03 FILLER PIC X(50) VALUE "07".
    03 FILLER PIC X(50) VALUE "08".
    03 FILLER PIC X(50) VALUE "09".
    03 FILLER PIC X(50) VALUE "10".
    03 FILLER PIC X(50) VALUE "11".
    03 FILLER PIC X(50) VALUE "12".
    03 FILLER PIC X(50) VALUE "13".
    03 FILLER PIC X(50) VALUE "14".
    03 FILLER PIC X(50) VALUE "15".

 01 MAIN-MENU   PIC X.
   88 RESERVATION VALUE "R".
   88 VIEW-RESERVATION VALUE "V".
   88 CANCEL-RESERVATION VALUE "D".
   88 EXIT-PROC VALUE "E".

 01 DECISION PIC X.
   88 YES VALUE "Y".
   88 NAY VALUE "N".   

 01 SEAT-NUM PIC 9(2).

 01 CUST-NAME PIC X(18).

 01 CUST-CNTCT PIC 9(11).

 01 CHOICE PIC X.

PROCEDURE DIVISION.
MAIN-ROUTINE.

 DISPLAY "        ABC TRANSPORT COMPANY".
 DISPLAY "__________________________________________".
 DISPLAY "     [R] ADD RESERVATION/S ".
 DISPLAY "     [V] VIEW RESERVATION/S ".
 DISPLAY "     [D] CANCEL RESERVATION/S ".
 DISPLAY "     [E] EXIT".
 DISPLAY "         ENTER CHOICE: " WITH NO ADVANCING.

 ACCEPT MAIN-MENU.

 PERFORM I-CHAIN.

I-CHAIN.
 IF RESERVATION
    GO TO RESERVE-PROC
 ELSE IF VIEW-RESERVATION
    GO TO VRESERVE-PROC
 ELSE IF CANCEL-RESERVATION
    GO TO CRESERVE-PROC
 ELSE IF EXIT-PROC
    GO TO END-PGM
 ELSE
    DISPLAY "INVALID OPTION"

 GO TO MAIN-ROUTINE.


RESERVE-PROC.
 DISPLAY "RESERVE SEAT #:   "WITH NO ADVANCING.
 ACCEPT SEAT-NUM.

 IF SEAT-NUM IS NUMERIC
      IF SEAT-NUM >2 AND SEAT-NUM <16
      GO TO CONT-RES
      ELSE
             DISPLAY "INVALID OPTION"
             PERFORM RESERVE-PROC
 ELSE 
    DISPLAY "ENTER A NUMERIC VALUE"
    GO TO RESERVE-PROC.

CONT-RES.
 DISPLAY "CUSTOMER NAME :     "WITH NO ADVANCING.
 ACCEPT CUST-NAME.

 MOVE CUST-NAME TO SEAT-NUM.
 DISPLAY "CUSTOMER CONTACT #: "WITH NO ADVANCING.
 ACCEPT CUST-CNTCT.

 MOVE CUST-CNTCT TO SEAT-NUM.
 GO TO RESER-CONT.

RESER-CONT.
 DISPLAY "RESERVE MORE? [Y/N]? "WITH NO ADVANCING.
 ACCEPT DECISION.
 IF YES
     PERFORM RESERVE-PROC
 ELSE IF NAY
     PERFORM MAIN-ROUTINE
 ELSE
     DISPLAY "INVALID OPTION"
     PERFORM RESER-CONT.

VRESERVE-PROC.
 DISPLAY "        ABC TRANSPORT COMPANY".
 DISPLAY "           RESERVATION LIST".
 DISPLAY "__________________________________________".
 DISPLAY " "SEAT-DESCRIPTION.

CRESERVE-PROC.
 DISPLAY "        ABC TRANSPORT COMPANY".
 DISPLAY "         CANCEL RESERVATION".
 DISPLAY "__________________________________________".

END-PGM.
 STOP RUN.

我知道代码还不完整,但我可以在如何使用表格方面提供一些帮助,因为 我很难显示要添加到变量 SEAT-NUM 中的内容,任何删除字符串 1 乘 1 的提示都会有所帮助

【问题讨论】:

    标签: cobol cobol85 cobol.net


    【解决方案1】:

    开始你需要类似的东西

    01 SEAT-DESCRIPTION-REDEF REDEFINES SEAT-DESCRIPTION.
       03 SEAT-NUMBER-DATA OCCURS 15.
          05 SEAT-NUMBER-TEXT   PIC X(02).
          05 FILLER             PIC X(04).
          05 SEAT-FILLED-BY     PIC X(44).
    

    您现在可以为SEAT-FILLED-BY(SEAT-NUM) 分配一个值来为座位分配一个名称。

    不清楚你在用CUST-CNTCT做什么,但做了一个小调整:

    01 SEAT-DESCRIPTION-REDEF REDEFINES SEAT-DESCRIPTION.
       03 SEAT-NUMBER-DATA OCCURS 15.
          05 SEAT-NUMBER-TEXT   PIC X(02).
          05 FILLER             PIC X(04).
          05 SEAT-FILLED-BY     PIC X(32).
          05 FILLER             PIC X(01).
          05 SEAT-CONTACT       PIC X(11).
    

    现在您可以MOVE CUST-CNTCT TO SEAT-CONTACT(SEAT-NUM).,这可能与您想要做的很接近。

    现在是一个关于结构的小广告。

    避免转至。

    从来没有必要使用 GO TO。总是

    PERFORM paragraphname [UNTIL condition].
    

    在你习惯它之前,这不是一门简单的学科——当你做意大利面条代码的噩梦时,你就会习惯它; GO TO 无处不在,PERFORM me 调用递归代码。

    如果有人提到PERFORM THROUGH,只需微笑和点头,然后忽略他们要说的一切。他们是邪恶的缩影,因为他们提倡依赖布局的代码。

    【讨论】:

    • @nano.galvao 非常感谢我急需的人,现在这一切都是有意义的,这就是我现在所拥有的输出,我不断收到不必要的行再次感谢
    • 我会 +1 支持 Magoo 关于 GO TO 的危害,但也略有不同。 +0.999。此处列出的示例值得加粗 ESCHEW,因为它不是跳跃的实际用途。但是,在用 COBOL 编写状态机或单字符协议解释器时,GO TO DEPENDING ON 可能非常实用。当范围有限且干净时,甚至可以防御。 包括进一步的子段落负担 GO TO next-step-label 每个工作段都需要。所以,是的,在 Never 上,可能一年中的一个星期二除外,并准备好保护大门免受棍棒、石头和文字的伤害。
    • @KarllaurenzBagasan,Magoo 完成了这项工作,nano.galvao 仅对其进行了格式化。
    【解决方案2】:

    我们在我们的商店中使用THROUGH,但有一个目的。我们用一个名字来标记每个段落,并在最后用“-”退出这个名字结束那个段落。

    然后当我们调用该段落时,我们使用语法调用它

    "PERFORM L2-SUB-PARAGRAPH THROUGH L2-SUB-PARAPGRAPH-EXIT.

    这使代码更具面向对象的外观,并使段落更加模块化。

    或者如果想循环一个段落,你可以这样编码:

    `PERFORM -L2-LOOPING-PARA' 
         'THROUGH L2-LOOPING-PARA-EXIT'
             'VARYING INDEX1 FROM 1 BY 1.... `
    

    【讨论】:

    • 想想PERFORM L2-SUB-PARAGRAPHPERFORM -L2-LOOPING-PARAVARYING INDEX1 FROM 1 BY 1.... 会变得多么容易和更加面向对象。不需要所有那些单行的段落来诱使博士生只输入一点定稿代码。干净多了。这是PERFORM SECTION 时代的结构兼容性遗留问题。保留冗长并为根植于过去的经理提供安全毯。这种结构的唯一可能借口是IF condition GO TO PARA-EXIT,但如果您遵循杰克逊式结构,那么IF noitidnoc PERFORM PARA-SUB 规则!
    • 这是一个问答网站。 Answers 用于回答已提出的问题。我建议您在有人反对或标记它以引起版主注意之前删除您的Answer。和你的另一个一样。如果您对某个问题或答案有任何意见,请以Comment 的形式进行。至于你上面的建议,我不会鼓励它,这对于 COBOL 来说是一个非常过时的东西。但是,是的,总是有网站标准。不代表普遍推荐是好事。
    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多