如何在 COBOL 中对 table 进行排序?
How to sort a table in COBOL?
我正在学习 COBOL,但我很难弄清楚如何对此进行排序 table。我认为我什至没有正确实现此 table,因此任何有关如何改进此代码的帮助都会很棒。我迷路了,很困惑。
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.
我知道代码正在排序,因为它会打印内部排序和排序已完成。但是当它再次打印 table 时,一切都是一样的。我认为我没有正确地遍历 table,但是我尝试过的所有其他方法都会给我错误。
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。
我不知道是否需要其他更改。
这既是答案也是编写 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. You can 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
我正在学习 COBOL,但我很难弄清楚如何对此进行排序 table。我认为我什至没有正确实现此 table,因此任何有关如何改进此代码的帮助都会很棒。我迷路了,很困惑。
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.
我知道代码正在排序,因为它会打印内部排序和排序已完成。但是当它再次打印 table 时,一切都是一样的。我认为我没有正确地遍历 table,但是我尝试过的所有其他方法都会给我错误。
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。
我不知道是否需要其他更改。
这既是答案也是编写 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. You can 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