COBOL版99瓶啤酒程序开发求助:支持用户输入取下数量
帮你修复自定义取量的99瓶啤酒COBOL程序
嘿,作为COBOL新手能尝试写这个程序真的很赞!我看了你的代码,发现几个关键的小问题,咱们一个个解决:
核心问题分析
- NUM初始值为0且未接收用户输入:你定义了
NUM PIC s9(02) VALUE 0,但没让用户输入自定义的取瓶数量,而且PERFORM VARYING里用BY NUM的话,0作为增量会让循环完全不动;更关键的是,要减少啤酒数量的话,增量应该是负数(或者在循环内手动减NUM)。 - 变量格式不匹配:
BOTTLES PIC Z9只能显示1位数字(前导零会被抑制),99的话会显示成9,应该用ZZ9来支持两位数显示。 - 循环终止条件不合理:如果取瓶数量不能整除99(比如每次取5),
COUNTER会变成负数永远到不了0,应该改成UNTIL COUNTER < 1来终止循环。
修正后的完整代码
IDENTIFICATION DIVISION. PROGRAM-ID. BEER-SONG. DATA DIVISION. WORKING-STORAGE SECTION. 01 COUNTER PIC 99 VALUE 99. *> 用99足够存0-99的数量,不需要符号位 01 NUM PIC 99 VALUE 0. *> 存储用户输入的每次取瓶数 01 BOTTLES-WORD PIC X(8) VALUE "bottles". 01 REMAINING-WORD PIC X(8) VALUE "bottles". PROCEDURE DIVISION. *> 第一步:获取用户输入的每次取瓶数量 DISPLAY "Enter number of bottles to take down each time (1-99): " ACCEPT NUM *> 校验输入有效性:不能为0或大于当前啤酒数 IF NUM = 0 OR NUM > COUNTER DISPLAY "Invalid number! Please enter a value between 1 and " COUNTER STOP RUN END-IF *> 主循环:唱啤酒歌 PERFORM UNTIL COUNTER < 1 *> 处理单复数:当数量为1时替换为"bottle" IF COUNTER = 1 MOVE "bottle" TO BOTTLES-WORD ELSE MOVE "bottles" TO BOTTLES-WORD END-IF *> 打印当前歌词行 DISPLAY COUNTER " " BOTTLES-WORD " of beer on the wall," DISPLAY COUNTER " " BOTTLES-WORD " of beer." DISPLAY "Take " NUM " down, pass them around," *> 计算剩余数量,处理剩余为0的情况 IF COUNTER > NUM COMPUTE COUNTER = COUNTER - NUM IF COUNTER = 1 MOVE "bottle" TO REMAINING-WORD ELSE MOVE "bottles" TO REMAINING-WORD END-IF DISPLAY COUNTER " " REMAINING-WORD " of beer on the wall!" ELSE DISPLAY "No more bottles of beer on the wall!" MOVE 0 TO COUNTER END-IF DISPLAY " " *> 空行分隔每段 END-PERFORM STOP RUN.
关键改进点说明
- 用户输入与校验:先让用户输入取瓶数量,并且检查输入是否合法(不能为0、不能超过当前剩余啤酒数),避免无效循环。
- 单复数处理:添加了
BOTTLES-WORD和REMAINING-WORD变量,自动根据数量切换"bottle"和"bottles",符合歌词的习惯。 - 循环逻辑优化:用
PERFORM UNTIL COUNTER < 1替代原来的UNTIL COUNTER = 0,避免因为取量不能整除导致的死循环;同时在循环内手动计算剩余数量,比PERFORM VARYING更直观,也更容易处理边界情况(比如最后一次取完所有啤酒)。 - 变量格式调整:把计数器改成
PIC 99,足够存储0-99的数值,不需要符号位,避免不必要的负数处理。
如果还有其他疑问,比如想扩展更多功能(比如允许输入超过当前数量的取量、重复输入取量等),随时再调整!
内容的提问来源于stack exchange,提问作者Blake Perrotte
相关产品推荐
相关产品推荐

