【问题标题】:How to sort a table in COBOL?如何在 COBOL 中对表进行排序?
【发布时间】:2015-12-02 17:08:48
【问题描述】:

我正在学习 COBOL,但我很难弄清楚如何对该表进行排序。我认为我什至没有正确实现这个表,所以任何关于如何改进这个代码的帮助都会很棒。我迷失和困惑。

IDENTIFICATION DIVISION.
PROGRAM-ID. STUDENT.

DATA DIVISION. 
WORKING-STORAGE SECTION.
01 CLASSROOM-TABLE.
    05 STUDENT OCCURS 5 TIMES. 
        10 STUDENT1.
            15 STUDENT1-N PIC A(25).
            15 STUDENT1-A PIC 99. 
        10 STUDENT2.
            15 STUDENT2-N PIC A(25).
            15 STUDENT2-A PIC 99. 
        10 STUDENT3.
            15 STUDENT3-N PIC A(25).
            15 STUDENT3-A PIC 99. 
        10 STUDENT4.
            15 STUDENT4-N PIC A(25).
            15 STUDENT4-A PIC 99. 
        10 TEMP-STUDENT.
            15 STUDENT-N PIC A(25).
FIND.

END-METHOD.
            15 STUDENT-A PIC 99. 
01 I PIC 9 VALUE 0. 
01 J PIC 9 VALUE 1.

PROCEDURE DIVISION. 
MAIN-PARA.
    MOVE "MICHAELA" TO STUDENT (1) (1:25).
    MOVE 21 TO STUDENT (1) (26:2).
    MOVE "KEVIN" TO STUDENT (2) (1:25).
    MOVE 25 TO STUDENT (2) (26:2).
    MOVE "KENNY" TO STUDENT (3) (1:25).
    MOVE 16 TO STUDENT (3) (26:2). 
    MOVE "ANDREA" TO STUDENT (4) (1:25).
    MOVE 18 TO STUDENT (4) (26:2). 

    PERFORM PUT-ORDER.
    PERFORM PRINT.
STOP RUN. 

PUT-ORDER.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
    ADD 1 TO J  
    IF STUDENT(I)(26:2) > STUDENT(J)(26:2)
        ADD 1 TO I
        DISPLAY "INSIDE SORT"
        MOVE STUDENT(I)(26:2) TO STUDENT(5)(26:2)
        MOVE STUDENT(J)(26:2) TO STUDENT(I)(26:2)
        MOVE STUDENT(5)(26:2) TO STUDENT(J)(26:2)
    END-IF
END-PERFORM.

DISPLAY "SORT IS DONE".

END-METHOD.

PRINT.
    DISPLAY STUDENT (1).
    DISPLAY STUDENT (2).
    DISPLAY STUDENT (3).
    DISPLAY STUDENT (4).
    END-METHOD.

我知道代码正在排序,因为它在排序内部打印并且排序完成。但是当它再次打印表格时,一切都是一样的。我认为我没有正确地遍历表格,但我尝试过的所有其他方式都会给我错误。

【问题讨论】:

  • 你为什么要做 STUDENT(I)(26:2) ????,你应该只做 Student-Name(I)

标签: loops sorting iteration cobol


【解决方案1】:

这既是编写 Cobol 的答案也是指南

01 CLASSROOM-TABLE.
   05 STUDENT OCCURS 5 TIMES. 
      10 STUDENT-Name         PIC A(25).
      10 STUDENT-Age          PIC 99. 

程序变成了

MOVE "MICHAELA" TO STUDENT-Name (1).
MOVE 21         TO STUDENT-Age  (1).
MOVE "KEVIN"    TO STUDENT-Name (2).
MOVE 25         TO STUDENT-Age  (2).
  ...

你也可以

01 CLASSROOM-TABLE.
   05 Student-Table.
      10 STUDENT OCCURS 5 TIMES. 
         15 STUDENT-Name      PIC A(25).
         15 STUDENT-Age       PIC 99. 

  05 redefines Student-Table.
     10 filler                Pic X(25)  value 'MICHAELA'
     10 filler                pic 99     value 21. 
     10 filler                Pic X(25)  value 'KEVIN'
     10 filler                pic 99     value 25. 
       ....

您还需要定义一个临时学生

  05 Temp-Student            Pic x(27).

Cobol 有一个Sort Verb

例如

 SORT WORK-FILE
  ON ASCENDING KEY SALEPERSON-SRT
  ON ASCENDING KEY INVOICE-SORT
  INPUT PROCEDURE IS 1000-PRE-SORT
  OUTPUT PROCEDURE IS 2000-POST-SORT

如果您要在代码中进行排序,最容易实现的排序过程是Bubble Sort。你可以google it

但基本上正如 rcgldr 所说,你需要 2 个循环

perform varying i from 1 by 1 until i > 4
   Add 1           to i giving j
   perform  until j > 5
       if Student-Age(i) > Student-Age(j)
          Move Student(i)     to Temp-Student
          Move Student(j)     to Student(i)
          Move Temp-Student   to Student(j)
       end-if
       add 1                  to j
   end-perform
end-perform 

【讨论】:

  • 我在第二次执行中遇到了 i+1 错误,有一个意外的文字。我试图通过创建另一个值为 1 的变量来解决此问题,但随后错误是意外的“+”,期待 BY。括号也不能解决。这有什么问题?另外,用重新定义的方式写表更好吗?
  • 你肯定需要 i + 1 在 + 周围有空格;但我怀疑您需要按照上面的更新进行操作;我还修复了第二次执行和移动中的一个索引
【解决方案2】:

J 需要一个内循环,而我只去 3。

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
    PERFORM VARYING J FROM I+1 BY 1 UNTIL J > 4
        IF ...
        END-IF
    END-PERFORM
END-PEFORM

去掉 ADD 1 TO I。

我不知道是否需要其他更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2015-07-20
    • 1970-01-01
    • 2022-01-05
    • 2010-10-05
    • 2017-12-31
    • 2019-03-04
    • 2019-11-29
    相关资源
    最近更新 更多