COBOL 墙上啤酒计划

COBOL Beer on the Wall Program

我正在制作“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

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

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

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

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

其次,如果允许您一次取出多个瓶子,那么您的小调就不再有意义了。押韵第三节的陈述应与 bottles-left 节类似地修改:

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

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