summaryrefslogtreecommitdiffhomepage
path: root/cobol.html.markdown
blob: 1c858396f99b2cdd9c8cf36e11d995c50d4daf77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
---
language: COBOL
contributors:
    - ["Hyphz", "http://github.com/hyphz/"]
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
      *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.
      *Modern COBOL doesn't require fixed columns and uses *> for
      *a comment, which can appear in the middle of a line.
      *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.
      *Although modern COBOL allows you to use mixed-case characters
      *it is still common to use all caps when writing COBOL code.
      *This is what most professional COBOL developers do.
      *COBOL statements end with a period.
      
      *COBOL code is broken up into 4 divisions.
      *Those divisions, in order, are:
      *IDENTIFICATION DIVISION.
      *ENVIRONMENT DIVISION.
      *DATA DIVISION.
      *PROCEDURE DIVISION.

      *First, we must give our program an ID.
      *Identification division can include other values too,
      *but they are comments only. Program-id is the only one that is mandatory.
       IDENTIFICATION DIVISION.
           PROGRAM-ID.    LEARN.
           AUTHOR.        JOHN DOE.
           DATE-WRITTEN.  05/02/2020.

      *Let's declare some variables.
      *We do this in the WORKING-STORAGE section within the DATA DIVISION.
      *Each data item (aka variable) starts with a level number, 
      *then the name of the item, followed by a picture clause 
      *describing the type of data that the variable will contain.
      *Almost every COBOL programmer will abbreviate PICTURE as PIC.
      *A is for alphabetic, X is for alphanumeric, and 9 is for numeric.
       
      *example:
      01  MYNAME PIC xxxxxxxxxx.    *> A 10 character string.
       
      *But counting all those x's can lead to errors, 
      *so the above code can, and should
      *be re-written as:
      01 MYNAME PIC X(10).
       
      *Here are some more examples:
      01  AGE             PIC      9(3).   *> A number up to 3 digits.
      01  LAST_NAME       PIC      X(10).  *> A string up to 10 characters.
       
      *In COBOL, multiple spaces are the same as a single space, so it is common
      *to use multiple spaces to line up your code so that it is easier for other
      *coders to read.
      01  inyear picture s9(7). *> S makes number signed.
                                 *> Brackets indicate 7 repeats of 9,
                                 *> ie a 6 digit number (not an array).

      *Now let's write some code. Here is a simple, Hello World program.
      IDENTIFICATION DIVISION.
      PROGRAM-ID. HELLO.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 THE-MESSAGE      PIC X(20).
      PROCEDURE DIVISION.
          DISPLAY "STARTING PROGRAM".
          MOVE "HELLO WORLD" TO THE-MESSAGE.
          DISPLAY THE-MESSAGE.
          STOP RUN.
      
      *The above code will output:
      *STARTING PROGRAM
      *HELLO WORLD
      

      
      ********COBOL can perform math***************
      ADD 1 TO AGE GIVING NEW-AGE.
      SUBTRACT 1 FROM COUNT.
      DIVIDE VAR-1 INTO VAR-2 GIVING VAR-3.
      COMPUTE TOTAL-COUNT = COUNT1 PLUS COUNT2.
      
      
      *********PERFORM********************
      *The PERFORM keyword allows you to jump to another specified section of the code,
      *and then to return to the next executable
      *statement once the specified section of code is completed. 
      *You must write the full word, PERFORM, you cannot abbreviate it.

      IDENTIFICATION DIVISION.
      PROGRAM-ID. HELLOCOBOL.

      PROCEDURE DIVISION.
         FIRST-PARA.
             DISPLAY 'THIS IS IN FIRST-PARA'.
         PERFORM THIRD-PARA THRU FOURTH-PARA. *>skip second-para and perform 3rd & 4th
         *> then after performing third and fourth,
         *> return here and continue the program until STOP RUN.
   
         SECOND-PARA.
             DISPLAY 'THIS IS IN SECOND-PARA'.
         STOP RUN.
   
         THIRD-PARA.
             DISPLAY 'THIS IS IN THIRD-PARA'.
   
         FOURTH-PARA.
             DISPLAY 'THIS IS IN FOURTH-PARA'.
   
   
      *When you compile and execute the above program, it produces the following result: 
          THIS IS IN FIRST-PARA
          THIS IS IN THIRD-PARA
          THIS IS IN FOURTH-PARA
          THIS IS IN SECOND-PARA
          
          
      **********Combining variables together using STRING ***********
      
      *Now it is time to learn about two related COBOL verbs: string and unstring.

      *The string verb is used to concatenate, or put together, two or more stings.
      *Unstring is used, not surprisingly, to separate a         
      *string into two or more smaller strings. 
      *It is important that you remember to use ‘delimited by’ when you
      *are using string or unstring in your program. 

      IDENTIFICATION DIVISION.
      PROGRAM-ID. LEARNING.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 FULL-NAME PIC X(20).
      01 FIRST-NAME PIC X(13) VALUE "BOB GIBBERISH".
      01 LAST-NAME PIC X(5) VALUE "COBB".
      PROCEDURE DIVISION.
          STRING FIRST-NAME DELIMITED BY SPACE
            " "
            LAST-NAME DELIMITED BY SIZE
            INTO FULL-NAME
          END-STRING.
          DISPLAY "THE FULL NAME IS: "FULL-NAME.
      STOP RUN.


      *The above code will output:
      THE FULL NAME IS: BOB COBB


      *Let’s examine it to see why.

      *First, we declared all of our variables, including the one that we are creating
      *by the string command, in the DATA DIVISION.

      *The action takes place down in the PROCEDURE DIVISION. 
      *We start with the STRING keyword and end with END-STRING. In between we         
      *list what we want to combine together into the larger, master variable. 
      *Here, we are combining FIRST-NAME, a space, and LAST-NAME. 

      *The DELIMITED BY phrase that follows FIRST-NAME and 
      *LAST-NAME tells the program how much of each variable we want to capture. 
      *DELIMITED BY SPACE tells the program to start at the beginning, 
      *and capture the variable until it runs into a space. 
      *DELIMITED BY SIZE tells the program to capture the full size of the variable. 
      *Since we have DELIMITED BY SPACE after FIRST-NAME, the GIBBERISH part is ignored. 

      *To make this clearer, change line 10 in the above code to:

      STRING FIRST-NAME DELIMITED BY SIZE

      *and then re-run the program. This time the output is:

      THE FULL NAME IS: BOB GIBBERISH COBB






```

##Ready For More?

* [GnuCOBOL](https://sourceforge.net/projects/open-cobol/)