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

如何正确将求数组众数的C++代码转为GnuCOBOL并修复语法错误

报错原因排查

核心语法错误就是每个COBOL程序结束后必须显式声明END PROGRAM 对应程序ID,你编写的三个程序(Main、READDATA、MODE)都没有加结束声明,编译器会认为所有代码都属于第一个Main程序,读到READDATA的WORKING-STORAGE段时自然不符合Main程序的语法结构,就抛出了你看到的报错。

其他逻辑&语法错误汇总
  • 子程序接收的传入参数不能定义在WORKING-STORAGE段,需要定义在LINKAGE SECTION段,且PROCEDURE DIVISION需要声明接收的参数
  • READDATA子程序的循环逻辑错误:PERFORM VARYING已经会自动迭代I变量,循环内执行SET I TO 1会导致死循环
  • MODE子程序的比较逻辑错误:判断元素相等的条件写成了array(I) = array(I),永远返回真,和C++逻辑不符,应该改为val(I) = val(J)
  • 变量定义不规范:数值类型变量应该用PIC 9(1)定义,原代码混用了X(1)、错误的PIC(1)写法,且循环变量I、J没有提前定义
  • 众数统计逻辑位置错误:max值更新应该放在内层J循环内,和C++逻辑对齐
修正后的完整GnuCOBOL代码
IDENTIFICATION DIVISION.
PROGRAM-ID. Main.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 array.
        05 val PIC 9(1) OCCURS 5 TIMES.
PROCEDURE DIVISION.
    CALL 'READDATA' USING array.
    STOP RUN.
END PROGRAM Main.

*> readData: 从用户输入填充数组
IDENTIFICATION DIVISION.
PROGRAM-ID. READDATA.
DATA DIVISION.
LINKAGE SECTION.
    01 array.
        05 val PIC 9(1) OCCURS 5 TIMES.
WORKING-STORAGE SECTION.
    01 I PIC 9(1) VALUE 1.
PROCEDURE DIVISION USING array.
    PERFORM VARYING I FROM 1 BY 1
        UNTIL I > 5
        ACCEPT val(I) FROM SYSIN
    END-PERFORM.
    CALL 'MODE' USING array.
    EXIT PROGRAM.
END PROGRAM READDATA.

*> mode: 计算数组众数并输出
IDENTIFICATION DIVISION.
PROGRAM-ID. MODE.
DATA DIVISION.
LINKAGE SECTION.
    01 array.
        05 val PIC 9(1) OCCURS 5 TIMES.
WORKING-STORAGE SECTION.
    01 I PIC 9(1) VALUE 1.
    01 J PIC 9(1) VALUE 1.
    01 maxv PIC 9(1) VALUE 0.
    01 counter PIC 9(1) VALUE 0.
    01 num PIC 9(1) VALUE 0.
PROCEDURE DIVISION USING array.
    PERFORM VARYING I FROM 1 BY 1
        UNTIL I > 5
            MOVE 0 TO counter
            PERFORM VARYING J FROM 1 BY 1
                UNTIL J > 5
                IF val(I) = val(J) THEN
                    ADD 1 TO counter
                END-IF
                IF maxv < counter THEN
                    MOVE counter TO maxv
                    MOVE val(I) TO num
                END-IF
            END-PERFORM
    END-PERFORM.
    DISPLAY "Mode: " num.
    EXIT PROGRAM.
END PROGRAM MODE.
运行验证

输入示例数组的5个元素:1、2、2、1、1,程序会输出Mode: 1,和C++代码运行结果一致。

内容的提问来源于stack exchange,提问作者Darthvader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:02