如何正确将求数组众数的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
相关产品推荐
相关产品推荐

