From 912eca480e74a31d88d1c84ba5ab935b57541e46 Mon Sep 17 00:00:00 2001 From: Mark Green Date: Thu, 9 Apr 2020 15:20:49 +0100 Subject: Corrections and some added explanation. --- cobol.html.markdown | 119 +++++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 56 deletions(-) (limited to 'cobol.html.markdown') diff --git a/cobol.html.markdown b/cobol.html.markdown index b0ab5b6d..4452bd95 100644 --- a/cobol.html.markdown +++ b/cobol.html.markdown @@ -7,12 +7,13 @@ filename: learn.COB COBOL is a business-oriented language revised multiple times since its original design in 1960. It is claimed to still be used in over 80% of organizations. -``` +```cobol *COBOL. Coding like it's 1985. + *Compiles with GnuCOBOL in OpenCobolIDE 4.7.6. *COBOL has significant differences between legacy (COBOL-85) *and modern (COBOL-2002 and COBOL-2014) versions. - *Legacy versions require columns 1-6 to be blank (they are used + *Legacy versions require columns 1-6 to be blank (they are used *to store the index number of the punched card..) *A * in column 7 means a comment. *In legacy COBOL, a comment can only be a full line. @@ -21,9 +22,9 @@ organizations. *Legacy COBOL also imposes a limit on maximum line length. *Keywords have to be in capitals in legacy COBOL, *but are case insensitive in modern. - + *First, we must give our program ID. - *Identification division can include other values too, + *Identification division can include other values too, *but they are comments only. Program-id is mandatory. identification division. program-id. learn. @@ -32,7 +33,7 @@ organizations. data division. working-storage section. - *Variables are specified by a "picture" - how they should be + *Variables are specified by a "picture" - how they should be *displayed, and variable type is inferred from this. *The "01" value is the level number which is used for building *data structures. @@ -40,9 +41,9 @@ organizations. 01 age picture 999. *> A number up to 3 digits. 01 valx picture 999. *> Another number up to 3 digits. 01 inyear picture s9(7). *> S makes number signed. - *> Brackets indicate 6 repeats of 9, + *> Brackets indicate 7 repeats of 9, *> ie a 6 digit number (not an array). - + *Now let's write some code. procedure division. @@ -64,98 +65,104 @@ organizations. display age *> Left-padded to three chracaters with zeroes, *> because of the defined PICTURE for age. - + *> We have two ways of doing a FOR loop. *> Old style way: doesn't give an index. perform age times display "*" with no advancing *> Ie, no newline at end - end-perform. + end-perform display "." *> Output buffer isn't flushed until newline. - + *> New style way: with an index. - perform varying valx from 1 by 1 until valx > age - display valx "-" with no advancing - end-perform. + perform varying valx from 1 by 1 until valx > age + display valx "-" with no advancing + end-perform display "." - + *> If tests are still good old if tests. - if myname = "Bob" then + if myname = "Bob" then display "I don't like Bob." - else - display "I don't know you." - end-if - - *> There are two ways of doing subprograms and calling + else + display "I don't know you." + end-if + + *> There are two ways of doing subprograms and calling *> them. *> The simplest way: a paragraph. perform subparagraph - + *> The complex way, with parameters and stuff. - call "eratosthenes" using age returning valx - + call "eratosthenes" using age returning valx + display "There were " valx " primes." - + stop run. subparagraph. *> Marks the top of an internal subprogram. *> Shares variable score with its caller. - accept inyear from day yyyyddd. + *> Read year from system timer. + *> Remember the whole "year 2000 crisis"? The yyyyddd + *> option was added in response to that. + accept inyear from day yyyyddd. + *> We can do math step-by-step like this... - divide 1000 into inyear. + divide 1000 into inyear. subtract age from inyear. - + display "You were born in " inyear "." - + *> Or we can just use expressions. compute inyear = 1970 - inyear. - - *> Note: if inyear has gone negative, its negativity will - *> not appear when printed, because we didn't include an - *> S (sign character) in the PICTURE. - if inyear >= 0 then + + if inyear >= 0 then display "When you were " inyear ", " with no advancing else display inyear " years before you were born, " with no advancing end-if - - display "COBOL was the most popular language in the world." - . - - + + display "COBOL was the most popular language in the world." + . *> You can put the final . on a new line if it's clearer. + + + *If we want to use a subprogram, we use literally a subprogram. + *This is the entire program layout, repeated for the + *eratosthenes subroutine. identification division. program-id. eratosthenes. data division. working-storage section. - *Declare an array. - *We can declare a variable to use as an index for it at the + *Declare an array. + *We can declare a variable to use as an index for it at the *same time. 01 sieve pic 9 occurs 999 times indexed by sa, sb. + *> Standard cobol doesn't have a boolean type. 01 pstart pic 999. 01 counter pic 999. - + *Our parameters have to be declared in the linkage section. + *Their pictures must match the values they're called with. linkage section. 01 maxvalue picture 999. - - *"using" declares our actual parameter variables. + + *"using" declares our actual parameter variables. *"returning" declares the variable value returned at end. procedure division using maxvalue returning counter. main-procedure. - + display "Here are all the primes up to " maxvalue "." - + perform varying sa from 1 by 1 until sa > maxvalue move 1 to sieve (sa) - end-perform - + end-perform + perform varying sa from 2 by 1 until sa > maxvalue - if sieve(sa) = 1 then + if sieve(sa) = 1 then compute pstart = sa + sa - perform varying sb from pstart by sa until sb > - maxvalue + perform varying sb from pstart by sa until sb > + maxvalue move 0 to sieve(sb) end-perform end-if @@ -163,17 +170,17 @@ organizations. initialise counter *> To zero by default for a number. - perform varying sa from 2 by 1 until sa > maxvalue + perform varying sa from 2 by 1 until sa > maxvalue if sieve(sa) = 1 THEN display sa add 1 to counter - end-if + end-if end-perform. - - end program eratosthenes. - + + end program eratosthenes. + end program learn. - + ``` ##Ready For More? -- cgit v1.2.3