DavidatK
Active Member
Joined: 22 Nov 2005 Posts: 700 Location: Troy, Michigan USA
|
|
|
|
Pavan,
Here?s some code that will do what your requirements are. This code works, its been tested.
This code is not optimum, does not use the COBOL SORT statement, and is not up to good coding standards, and is written for your very specific requirements, but I hope it will give you some ideas about how to construct you program.
Note about my personal feelings on the COBOL internal SORT. Don?t us it unless you absolutely have to; it?s very inefficient. When ever I have to do internal sorts, and it shouldn?t be very often, if the all the sort records can be held in a COBOL table, I use a bubble sort to sort the records. If there is a situation where I have to do one massive sort, I break the process into two programs and use an external sort.
But, that?s off the subject. In the program below, there are examples of two versions of a bubble sort, one for asc, and one for desc.
Have fun,
Code: |
FILE-CONTROL.
SELECT FILE-IN
ASSIGN TO FILEIN.
SELECT FILE-OUT
ASSIGN TO FILEOUT.
DATA DIVISION.
FILE SECTION.
FD FILE-IN
RECORDING MODE IS F
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS.
01 FILE-REC-IN PIC X(80).
FD FILE-OUT
RECORDING MODE IS F
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS.
01 FILE-REC-OUT PIC X(80).
WORKING-STORAGE SECTION.
01 FILE-RECORD PIC X(80).
01 FILE-RECORD-ARRAY.
05 RECORD-HOLD PIC X(80) OCCURS 20 TIMES.
01 SUB1 PIC S9(3) COMP-3.
01 SUB2 PIC S9(3) COMP-3.
01 SORT-SUB1 PIC S9(3) COMP-3.
01 SORT-SUB2 PIC S9(3) COMP-3.
01 SWAP-COUNT PIC S9(3) COMP-3
VALUE 0.
PROCEDURE DIVISION.
OPEN INPUT FILE-IN
OUTPUT FILE-OUT.
PERFORM
VARYING SUB1 FROM 1 BY 1
UNTIL SUB1 > 5
PERFORM
VARYING SUB2 FROM 1 BY 1
UNTIL SUB2 > 20
PERFORM READ-INPUT
MOVE FILE-RECORD TO RECORD-HOLD(SUB2)
END-PERFORM
EVALUATE SUB1
WHEN 2
PERFORM SORT-ASC
WHEN 4
PERFORM SORT-DESC
END-EVALUATE
PERFORM
VARYING SUB2 FROM 1 BY 1
UNTIL SUB2 > 20
MOVE RECORD-HOLD(SUB2) TO FILE-RECORD
PERFORM WRITE-OUTPUT
END-PERFORM
END-PERFORM.
CLOSE FILE-IN
FILE-OUT.
GOBACK.
SORT-ASC.
PERFORM
VARYING SORT-SUB1 FROM 1 BY 1
UNTIL SORT-SUB1 > 19
COMPUTE SORT-SUB2 = SORT-SUB1 + 1
PERFORM
VARYING SORT-SUB2 FROM SORT-SUB2 BY 1
UNTIL SORT-SUB2 > 20
IF RECORD-HOLD(SORT-SUB1) > RECORD-HOLD(SORT-SUB2)
THEN
MOVE RECORD-HOLD(SORT-SUB1)
TO FILE-RECORD
MOVE RECORD-HOLD(SORT-SUB2)
TO RECORD-HOLD(SORT-SUB1)
MOVE FILE-RECORD TO RECORD-HOLD(SORT-SUB2)
END-IF
END-PERFORM
END-PERFORM.
SORT-DESC.
PERFORM WITH TEST AFTER
UNTIL SWAP-COUNT = 0
MOVE 0 TO SWAP-COUNT
PERFORM
VARYING SORT-SUB1 FROM 1 BY 1
UNTIL SORT-SUB1 > 19
IF RECORD-HOLD(SORT-SUB1 + 1) > RECORD-HOLD(SORT-SUB1)
THEN
MOVE RECORD-HOLD(SORT-SUB1 + 1)
TO FILE-RECORD
MOVE RECORD-HOLD(SORT-SUB1)
TO RECORD-HOLD(SORT-SUB1 + 1)
MOVE FILE-RECORD TO RECORD-HOLD(SORT-SUB1)
ADD +1 TO SWAP-COUNT
END-IF
END-PERFORM
END-PERFORM.
READ-INPUT.
READ FILE-IN INTO FILE-RECORD.
WRITE-OUTPUT.
WRITE FILE-REC-OUT FROM FILE-RECORD.
|
Dave |
|