Last active
September 1, 2021 08:29
-
-
Save Qqwy/937160d3cea88027431fb0019e69da47 to your computer and use it in GitHub Desktop.
Cobol implementation of https://www.youtube.com/watch?v=UVUjnzpQKUo&lc=Ugw5QFQbjIvZmQ89o6B4AaABAg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*> 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. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.