Yeah I'm just gonna randomly update this with cobol programs I write. Pretty interesting stuff, im actually getting kinda good at it lately. here's a recent program i wrote.
This one is just a simple control-break procedure.
PROGRAM-ID. CH10PROG.
AUTHOR. BEN MAERE.
*Pass-Em State College has student records with the following
*format:
*
*SSNO - STUDENT NAME - CLASS - SCHOOL - GPA 9V99 - CREDITS EARNED
*1-9 10-30 31 32 33-35 36-38
* 1 - Freshman - 1 - Business
* 2 - Sophomore | 3 - Junior 2 - Liberal Arts
* 4 - Senior 3 - Engineering
*
*Assume records are in sequence by class within school.
*Print a summary report of the average GPA for each class within
*each school. Print each school's statistics on a seperate page.
ENVIRONMENT DIVISION.
FILE-CONTROL.
SELECT STUDENT-IN ASSIGN TO "CH10.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT GPA-OUT ASSIGN TO "CH10-OUTPUT.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FD STUDENT-IN.
01 STUDENT-RECORD.
88 ENDOFFILE VALUES HIGH-VALUES.
05 SSNO PIC X(9).
05 STUDENT-NAME PIC X(20).
05 SCHOOL-NO PIC X.
05 CLASS-NO PIC X.
05 GPA PIC 9V99.
05 CREDITS-EARNED PIC X(3).
FD GPA-OUT.
01 GPA-REPORT PIC X(40).
WORKING-STORAGE SECTION.
01 STORED-CLASS PIC X VALUE "0".
01 STORED-SCHOOL PIC X VALUE "0".
01 ADD-GPA-VALUES PIC 9999V99 VALUE 0.
01 AVERAGE-GPA PIC 9V99 VALUE 0.
01 RECORD-COUNT PIC 99 VALUE 0.
01 GPA-INTERNAL.
05 HEAD-VALUE PIC X(20).
05 TAIL-VALUE PIC 9.99.
PROCEDURE DIVISION.
001-MAIN.
* opens all files and starts program.
OPEN INPUT STUDENT-IN
OUTPUT GPA-OUT
* Perform start procedure to set initial variables.
PERFORM 002-STARTPROC
* start the read perform that calls 003-CONTROLBREAK
PERFORM UNTIL ENDOFFILE
READ STUDENT-IN
AT END SET ENDOFFILE TO TRUE
NOT AT END PERFORM 003-CONTROLBREAK
END-READ
END-PERFORM
* closes all open files and ends program.
CLOSE STUDENT-IN
GPA-OUT
STOP RUN.
002-STARTPROC.
READ STUDENT-IN
AT END SET ENDOFFILE TO TRUE
END-READ
MOVE SCHOOL-NO TO STORED-SCHOOL
MOVE CLASS-NO TO STORED-CLASS
MOVE "SCHOOL: BUSINESS" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 1 LINES
MOVE "CLASS AVERAGE GPA" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 2 LINES.
PERFORM 003-CONTROLBREAK.
003-CONTROLBREAK.
* next two lines check both school and class.
IF SCHOOL-NO EQUAL STORED-SCHOOL THEN
IF CLASS-NO EQUAL STORED-CLASS
COMPUTE RECORD-COUNT = RECORD-COUNT + 1
COMPUTE ADD-GPA-VALUES = ADD-GPA-VALUES + GPA
ELSE
COMPUTE RECORD-COUNT = RECORD-COUNT + 1
COMPUTE AVERAGE-GPA = ADD-GPA-VALUES / RECORD-COUNT
EVALUATE STORED-CLASS
WHEN "1"
MOVE "FRESHMAN " TO HEAD-VALUE
MOVE AVERAGE-GPA TO TAIL-VALUE
MOVE GPA-INTERNAL TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 1 LINES
WHEN "2"
MOVE "SOPHOMORE " TO HEAD-VALUE
MOVE AVERAGE-GPA TO TAIL-VALUE
MOVE GPA-INTERNAL TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 1 LINES
WHEN "3"
MOVE "JUNIOR " TO HEAD-VALUE
MOVE AVERAGE-GPA TO TAIL-VALUE
MOVE GPA-INTERNAL TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 1 LINES
END-EVALUATE
MOVE ZEROES TO ADD-GPA-VALUES
MOVE CLASS-NO TO STORED-CLASS
MOVE ZEROES TO RECORD-COUNT
COMPUTE ADD-GPA-VALUES = ADD-GPA-VALUES + GPA
* Not checking for class-no on school else
* if the file was sorted, there is no need to do so.
ELSE
COMPUTE RECORD-COUNT = RECORD-COUNT + 1
COMPUTE AVERAGE-GPA = ADD-GPA-VALUES / RECORD-COUNT
MOVE "SENIOR " TO HEAD-VALUE
MOVE AVERAGE-GPA TO TAIL-VALUE
MOVE GPA-INTERNAL TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 1 LINES
SET AVERAGE-GPA TO ZERO
MOVE SCHOOL-NO TO STORED-SCHOOL
MOVE CLASS-NO TO STORED-CLASS
IF STORED-SCHOOL EQUAL "2"
MOVE "SCHOOL: LIBERAL ARTS" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING PAGE
MOVE "CLASS AVERAGE GPA" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 2 LINES
ELSE IF STORED-SCHOOL EQUAL "3"
MOVE "SCHOOL: ENGINEERING" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING PAGE
MOVE "CLASS AVERAGE GPA" TO GPA-REPORT
WRITE GPA-REPORT AFTER ADVANCING 2 LINES
END-IF
END-IF.
This one is a simple sort on two fields.
Code: IDENTIFICATION DIVISION.
PROGRAM-ID. CH14-PROGRAM.
AUTHOR. BEN MAERE.
* WRITE A PROGRAM TO SORT A FILE INTO STUDENT-NAME SEQUENCE
* WITHIN CLASS-NO SEQUENCE, WHERE CLASS-NO IS NOT PART OF THE
* INPUT BUT IS CALCULATED USING THE NO-OF-CREDITS FIELD.
* DEFINED FILE ENVIRONMENTS HERE
* STUDENT-IN IS THE INITIAL DATA FILE
* SORT-FILE IS THE TEMP FILE (USED ACTUAL FILE FOR DEBUGGING)
* STUDENT-OUT IS THE OUTPUT (OF COURSE)
ENVIRONMENT DIVISION.
FILE-CONTROL.
SELECT STUDENT-IN ASSIGN TO "CH1407.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE ASSIGN TO "CH1407-SORT.TMP".
SELECT STUDENT-OUT ASSIGN TO "CH1407-OUTPUT.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
* DEFINE VARIABLES AND FILE STRUCTURES, ETC.
DATA DIVISION.
FILE SECTION.
* INPUT FILE LAYOUT DEFINED HERE, INCLUDING 88 LEVELS
FD STUDENT-IN.
01 STUDENT-RECORD.
88 ENDOFFILE VALUE HIGH-VALUES.
05 STUDENT-NO PIC X(5).
05 STUDENT-NAME PIC X(45).
05 STUDENT-CREDITS PIC 9(3).
88 FRESHMAN VALUE 000 THROUGH 029.
88 SOPHOMORE VALUE 030 THROUGH 059.
88 JUNIOR VALUE 060 THROUGH 089.
88 SENIOR VALUE 090 THROUGH 999.
* SORT FILE CONTAINS CLASS-NO AND NO-OF-CREDITS
SD SORT-FILE.
01 SORT-DATA.
05 SORT-NO PIC X(5).
05 SORT-NAME PIC X(45).
05 SORT-CREDITS PIC 9(3).
05 SORT-CLASS-NO PIC 9(1).
* OUTPUT FILE NEXT, FOR EASE OF LAYOUT
FD STUDENT-OUT.
01 STUDENT-OUTPUT.
05 OUT-NO PIC X(5).
05 OUT-NAME PIC X(45).
05 OUT-CLASS-NO PIC 9(4).
PROCEDURE DIVISION.
* INITIAL STARTUP PROCEDURE
001-MAIN.
SORT SORT-FILE
ON ASCENDING KEY SORT-CLASS-NO
ON ASCENDING KEY SORT-NAME
INPUT PROCEDURE 002-READ-FILE
GIVING STUDENT-OUT
STOP RUN.
* INPUT PROCEDURE STARTS HERE, USED TO CALC CLASS-NO
002-READ-FILE.
* OPEN FILE
OPEN INPUT STUDENT-IN
* START PERFORM UNTIL THAT READS DATA FOR SORT
PERFORM UNTIL ENDOFFILE
READ STUDENT-IN
AT END SET ENDOFFILE TO TRUE
* DID THIS LINE TO HELP IMPROVE CODE READABILITY
NOT AT END PERFORM 003-CLASS-NO
END-READ
END-PERFORM
* CLOSE FILE
CLOSE STUDENT-IN.
003-CLASS-NO.
MOVE STUDENT-RECORD TO SORT-DATA
EVALUATE TRUE
WHEN FRESHMAN MOVE 1 TO SORT-CLASS-NO
WHEN SOPHOMORE MOVE 2 TO SORT-CLASS-NO
WHEN JUNIOR MOVE 3 TO SORT-CLASS-NO
WHEN SENIOR MOVE 4 TO SORT-CLASS-NO
END-EVALUATE
RELEASE SORT-DATA.