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
你可以也抱怨并要求用户输入有效数量,但最简单的解决方案可能只是限制它。
我正在制作“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
你可以也抱怨并要求用户输入有效数量,但最简单的解决方案可能只是限制它。