【问题标题】:COBOL Beer on the Wall ProgramCOBOL 啤酒上墙计划
【发布时间】:2018-03-26 01:20:48
【问题描述】:

我正在制作“99 瓶”计划,但需要用户输入要删除的数量。我对 COBOL 很陌生,我肯定忽略了一些简单的事情,或者只是完全以错误的方式思考这个问题。

以下是我目前拥有的:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. HW.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 COUNTER                      PIC S99.
   01 BOTTLES                      PIC Z9.
   01 BOTTLES-REMAINING            PIC Z9.
   01 NUM                          PIC s9(02) VALUE 0.

   PROCEDURE DIVISION.
       PERFORM VARYING COUNTER FROM 99 BY NUM UNTIL COUNTER = 0
         DISPLAY "How many bottles would you like to take down?"
         ACCEPT NUM
         MOVE COUNTER to Bottles
         subtract NUM FROM COUNTER GIVING BOTTLES-REMAINING
         DISPLAY SPACES
         EVALUATE COUNTER
           WHEN 1
             DISPLAY " 1 bottle of beer on the wall, "
                     "  1 bottle of beer."
             DISPLAY "Take one down and pass it around, "
                     "no more bottles of beer on the wall."
           WHEN 2 Thru 99
             DISPLAY BOTTLES " bottles of beer on the wall, "
                     BOTTLES " bottles of beer."
             DISPLAY "Take one down and pass it around, "
                     BOTTLES-REMAINING
                     " bottles of beer on the wall."
         END-EVALUATE
       END-PERFORM
     GOBACK.

我需要在以下语句(或数据除法)中将 NUM 子句设为负数,以便从计数器中减去:

       PERFORM VARYING COUNTER FROM 99 BY NUM UNTIL COUNTER = 0

【问题讨论】:

  • 如果你想让NUM否定:MULTIPLY NUM BY -1 ?!?但由于该领域预计会发生变化,我建议不要使用VARYING,而是直接检查BOTTLES-REMAINING。注意:ACCEPTing 数值(尤其是可能的符号)可能无法按预期工作 - 我建议使用两个字段,一个用于 ACCEPT,一个用于减去计数器(并在它们之间使用 FUNCTION NUMVALMOVE , 可能只有在 TEST-NUMVAL 显示有效输入时)。

标签: cobol


【解决方案1】:

我在这里看到了一些问题。

首先,这是来自公认的褪色记忆,但我似乎记得VARYING 子句需要一个恒定的增量值。我认为您不能使用实际更改的NUM 来执行此操作。

所以你的循环会更好 not 使用VARYING 子句,而是类似于(这里的代码在语法上可能不是正确的COBOL,它更多地意味着显示意图和/或方法) :

set counter to 99
perform until counter = 0
    blah blah blah then change counter
end perform

其次,如果您一次只能取出一瓶以上的酒,您的小曲就没有意义了。押韵第三节的语句应与左瓶节类似地修改:

evaluate num
    when 1
        display "Take one down and pass it around, "
    when 2 thru 99
        display "Take ", num, " down and pass them around, "
end evaluate

最后,您可能希望避免取出的瓶子多于可用的瓶子(或少于一个,就此而言)的情况。这可以通过在获得用户输入后立即执行这些限制(钳制)来完成:

accept num
if num is less than one
    set num to one
end if
if num is greater than counter
    set num to counter
end if

也可以投诉并要求用户输入有效数量,但最简单的解决方案可能只是限制它。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2020-04-03
    • 2021-04-27
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多