【问题标题】:How to convert c++ code to cobol correctly如何正确将c++代码转换为cobol
【发布时间】:2021-11-12 15:34:22
【问题描述】:

我编写了代码来获取数组中出现次数最多的数字。主函数将调用 readData,它将数据读入我传递给 readData 子例程的数组中。在 readData 子例程执行后,我使用 mode 函数查找数组中出现最多的数字。

示例数组:|1|2|2|1|1|

生成的输出:1

我的c++代码如下:

#include <iostream>

using namespace std;

void mode(int array[]){
    int max = 0, num;
     int count;
    
    for(int i=0; i<5; ++i){
        count = 0;
        for(int j=0; j<5; ++j){
            if(array[i] == array[j]){
                ++count;
            }
             if(max < count){
                max = count;
                num = array[i];
            }
        }
    }
    
    cout << num << endl;
}

void arrayData(int array[]){
    for(int i=0; i<5; i++){
        cin >> array[i];
    }
    
    mode(array);
}

int main()
{
    int array[5];
    arrayData(array);

    return 0;
}

我想将上面的 c++ 代码转换为 cobol,我正在使用 gnuCobol。到目前为止我生成的代码如下。

IDENTIFICATION DIVISION.
PROGRAM-ID. Main.

DATA DIVISION.
    
WORKING-STORAGE SECTION.
    01 array.
        05 val PIC X(1) OCCURS 5 TIMES.

PROCEDURE DIVISION.
    CALL 'READDATA' USING array.
STOP RUN.

*> readData: fills the array with user diffined digits
IDENTIFICATION DIVISION.
PROGRAM-ID. READDATA.

WORKING-STORAGE SECTION. ***> error appears here**
    01 array.
        05 val PIC X(1) OCCURS 5 TIMES.

PROCEDURE DIVISION.
    PERFORM VARYING I FROM 1 BY 1
        UNTIL I > 5
        SET I TO 1
        ACCEPT array(I) FROM SYSIN.
        SET I UP BY 1
    END-PERFORM.
    
    CALL 'MODE' USING array.
    
EXIT PROGRAM.

*> mode: gets the number that appears most in the array
IDENTIFICATION DIVISION.
PROGRAM-ID. MODE.

WORKING-STORAGE SECTION.
    01 array.
        05 val PIC X(1) OCCURS 5 TIMES.
    01 maxv PIC(1) VALUE 0.
    01 counter PIC(1).
    01 num PIC(1).

PROCEDURE DIVISION.
    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 array(I) = array(I) THEN
                SET counter UP BY 1
            END-IF
            
            IF maxv < counter THEN
                MOVE counter TO maxv
                MOVE array(I) TO num
            END-IF
            
            SET J UP BY 1
            END-PERFORM.
            
        SET I UP BY 1
    END-PERFORM.
    
    DISPLAY "Mode: "num.
EXIT PROGRAM.
 

我收到以下错误:

错误:语法错误,意外的“WORKING-STORAGE”,需要“END PROGRAM”或“PROGRAM-ID”

【问题讨论】:

    标签: cobol gnucobol


    【解决方案1】:

    代码存在几个问题。报告的错误似乎是缺少 END PROGRAM 语句来分隔第一个程序和第二个程序。

    其他错误包括:

    • 不必要地使用SET 语句

    • 在没有LINKAGE SECTIONUSING 短语的情况下传递array

    • 缺少DATA DIVISION 语句

    • 缺少数据项

    • 下标不正确

    • 在作用域终止符之前包含一个“分隔符句点”

    • PICTURE 子句无效

    这些问题在以下代码中的 cmets 中显示。将原始代码与修改后的代码进行比较。


    修改代码:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Main.
    
       DATA DIVISION.
            
       WORKING-STORAGE SECTION.
       01 array.
           05 val PIC X(1) OCCURS 5 TIMES.
    
       PROCEDURE DIVISION.
           CALL 'READDATA' USING array.
       STOP RUN.
       END PROGRAM MAIN. *> ADDED
    
       *> readData: fills the array with user diffined digits
       IDENTIFICATION DIVISION.
       PROGRAM-ID. READDATA.
       DATA DIVISION. *> ADDED
       WORKING-STORAGE SECTION. *> error appears here**
       01 I PIC 9.
       LINKAGE SECTION. *> ADDED
           01 array.
               05 val PIC X(1) OCCURS 5 TIMES.
    
       PROCEDURE DIVISION USING ARRAY. *> MODIFIED
           PERFORM VARYING I FROM 1 BY 1
               UNTIL I > 5
       *>      SET I TO 1 *> REMOVED
               ACCEPT VAL   (I) FROM SYSIN  *> MODIFIED
       *>      SET I UP BY 1 *> REMOVED
           END-PERFORM.
            
           CALL 'MO-DE' USING array.
            
           EXIT PROGRAM.
       END PROGRAM READDATA. *> ADDED
    
       *> mode: gets the number that appears most in the array
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MO-DE. *> 'MODE' IS A RESERVED WORD
       DATA DIVISION. *> ADDED
       WORKING-STORAGE SECTION.
       01 maxv PIC 9 VALUE 0. *> MODIFIED
       01 counter PIC 9. *> MODIFIED
       01 num PIC 9. *> MODIFIED
       01 I PIC 9. *> ADDED
       01 J PIC 9. *> ADDED
       LINKAGE SECTION. *> ADDED
       01 array.
           05 val PIC X(1) OCCURS 5 TIMES.
    
       PROCEDURE DIVISION USING ARRAY. *> MODIFIED
           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 *> MODIFIED
                       ADD 1 TO COUNTER *> MODIFIED
                   END-IF
                    
                   IF maxv < counter THEN
                       MOVE counter TO maxv
                       MOVE VAL  (I) TO num
                   END-IF
                    
       *>          SET J UP BY 1 *> REMOVED
                   END-PERFORM *> MODIFIED
                    
       *>      SET I UP BY 1 *> REMOVED
           END-PERFORM.
            
           DISPLAY "Mode: "num.
           EXIT PROGRAM.
       END PROGRAM MO-DE. *> ADDED
    

    输入:

    1
    5
    5
    2
    3
    

    输出:

    Mode: 5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2019-05-26
      • 1970-01-01
      • 2011-03-27
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多