Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Qqwy
Last active September 1, 2021 08:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Qqwy/937160d3cea88027431fb0019e69da47 to your computer and use it in GitHub Desktop.
Save Qqwy/937160d3cea88027431fb0019e69da47 to your computer and use it in GitHub Desktop.
*> Compile using GNU Cobol, e.g.: `cobc -x gcd_maxmin.cob`
IDENTIFICATION DIVISION.
PROGRAM-ID. gcd-maxmin.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUMS.
05 NUMS-ELEMS PIC 9(9)
OCCURS 0 TO 9999 TIMES DEPENDING ON NUMS-LEN.
77 NUMS-IDX PIC 9(9) COMP.
77 NUMS-LEN PIC 9(9).
01 MAX-NUM PIC 9(9).
01 MIN-NUM PIC 9(9).
01 RESULT PIC 9(9).
PROCEDURE DIVISION.
MAIN-LINE.
DISPLAY "Enter size of `nums`:".
ACCEPT NUMS-LEN.
DISPLAY "Enter elements of `nums`:".
PERFORM
VARYING NUMS-IDX FROM 1 BY 1
UNTIL NUMS-IDX = NUMS-LEN + 1
ACCEPT NUMS-ELEMS(NUMS-IDX) END-PERFORM.
CALL "ARRAY-MINMAX" USING
BY REFERENCE NUMS,
NUMS-LEN,
MAX-NUM,
MIN-NUM.
CALL "GCD" USING
BY CONTENT MIN-NUM,
BY CONTENT MAX-NUM,
BY REFERENCE RESULT.
DISPLAY RESULT.
GOBACK.
*> Given an `ARRAY` of `ARRAY-LEN` elements,
*> will return the maximum and minimum value in the array.
*> In some COBOLs there is a shorthand to run an intrinsic function directly on a whole array
*> (e.g.: `COMPUTE MAX-RES = FUNCTION MAX(ARRAY-ELEMS(ALL))` ) but this is not supported in GNU Cobol.
IDENTIFICATION DIVISION.
PROGRAM-ID. ARRAY-MINMAX.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IDX PIC 9(9) COMP.
LINKAGE SECTION.
01 ARRAY.
05 ARRAY-ELEMS PIC 9(9)
OCCURS 0 TO 9999 TIMES DEPENDING ON ARRAY-LEN.
77 ARRAY-LEN PIC 9(9).
01 MAX-RES PIC 9(9).
01 MIN-RES PIC 9(9).
PROCEDURE DIVISION USING ARRAY ARRAY-LEN MAX-RES MIN-RES.
MOVE ARRAY-ELEMS(1) TO MAX-RES.
MOVE ARRAY-ELEMS(1) TO MIN-RES.
DISPLAY MIN-RES.
DISPLAY MAX-RES.
PERFORM VARYING IDX FROM 2 BY 1
UNTIL IDX >= ARRAY-LEN + 1
COMPUTE MAX-RES =
FUNCTION MAX(MAX-RES, ARRAY-ELEMS(IDX))
COMPUTE MIN-RES =
FUNCTION MIN(MIN-RES, ARRAY-ELEMS(IDX))
END-PERFORM.
GOBACK.
END PROGRAM ARRAY-MINMAX.
*> Implementation of the Euclidean Algorithm.
IDENTIFICATION DIVISION.
PROGRAM-ID. GCD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TEMP PIC 9(9).
LINKAGE SECTION.
01 A PIC 9(9).
01 B PIC 9(9).
01 RESULT PIC 9(9).
PROCEDURE DIVISION USING A, B, RESULT.
PERFORM UNTIL B = 0
MOVE A TO TEMP
MOVE B TO A
DIVIDE TEMP BY B GIVING TEMP REMAINDER B
END-PERFORM.
MOVE A TO RESULT.
GOBACK.
END PROGRAM GCD.
@Qqwy
Copy link
Author

Qqwy commented Aug 30, 2021

This code was written by me. After a Hello World I wrote a couple of months back, this is my second program written in Cobol.
While I am fairly certain the code is somewhat idiomatic (if one can say such things about code written in Cobol at all), I am by no means a Cobol expert so it might be possible to improve this code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment