You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:49