Programmeren in COBOL/Printversie

Programmeren in COBOL

DISPLAY "Hallo Wereld!"




Deel I: Bewerkingen





In dit deel van het boek leer je vooral de basis van COBOL. De 4 eerste hoofdstukken zijn daarbij essentiëel als je deze taal onder de knie wilt krijgen. Het vijfde hoofdstuk kun je links laten liggen, zeker wanneer je nog maar net de taal leert. Later in dit boek wordt er echter wel zaken gebruikt die in het vijfde hoofdstuk worden besproken.

De inhoud van dit deel

bewerken
  1. Inleiding   (Oef   ): Hier leer je de basis om in COBOL programma's te maken. Er wordt geleerd hoe je gegevens invoert en uitvoert. En hoe je variabelen, in dit programmeertaal velden genoemd, aanmaakt.
  2. Berekeningen   (Oef   )
  3. IF en lussen   (Oef   )
  4. Deelprogramma's   (Oef   )
  5. Werken met tekst   (Oef   )


 


1. Inleiding



Dit is de inleiding van Programmeren in COBOL. COBOL is niet hoofdlettergevoelig dus een "a" betekent hetzelfde als een "A". Voor de overzichtelijkheid wordt aangeraden om bepaalde regels te volgen, sleutelwoorden(syntax) worden in hoofdletters geschreven en velden(variabelen) met kleine letters. Natuurlijk is de inhoud van een veld wel hoofdlettergevoelig.

Indeling van een programma

bewerken

Een programma in COBOL wordt ingedeeld in 4 delen of divisies.

COBOL-code: Indeling

       IDENTIFICATION DIVISION.

       ENVIRONMENT DIVISION.

       DATA DIVISION.

       PROCEDURE DIVISION.

Met de volgende betekenis:

IDENTIFICATION DIVISION geeft informatie over het programma. Bijvoorbeeld wat de naam is van het programma of wie het gemaakt heeft.

De ENVIRONMENT DIVISION is voornamelijk voor het gebruiken van bestanden door het programma.

In de DATA DIVISION komen al de verschillende soorten velden(variabelen) die het programma gebruikt.

In de PROCEDURE DIVISION staat de werkelijke programmacode.

Let op: de divisies moeten worden geschreven vanaf de 8ste positie. M.a.w. als je dit zou typen in een editor moet je voor je bijvoorbeeld IDENTIFICATION DIVISION typt, 7 spaties laten. Dit gebruik stamt nog uit de tijd toen COBOL op papier werd geschreven. Achter deze divisies moet een punt komen. Wat ook belangrijk is om te weten, is dat alleen IDENTIFICATION DIVISION en PROCEDURE DIVISION verplicht zijn in een programmacode. De andere twee moet je alleen schrijven als je het werkelijk gebruikt.

COBOL-code: Positie

         1         2         3         4         5         6         7
123456789012345678901234567890123456789012345678901234567890123456789012
       IDENTIFICATION DIVISION.

Hello World! (DISPLAY)

bewerken
   Zie ook DISPLAY voor meer informatie.

Laten we ons eerste programma schrijven en het traditionele "Hello World!" op het scherm tonen.

COBOL-code: Hello World

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HelloWorld.
       PROCEDURE DIVISION.
       hoofd.
            DISPLAY "Hello World!"
            STOP RUN
            .

Zoals eerder werd gezegd geeft IDENTIFICATION DIVISION informatie over het programma zelf. PROGRAM-ID. (let op de punt) is een onderdeel van deze divisie, die geeft aan hoe het programma heet. Na een naam te hebben gegeven, moet ook een punt komen.

Programma's kunnen worden ingedeeld in deelprogramma's (zie hoofdstuk deelprogramma's). "Hoofd." kun je in dit geval vergelijken met "main()" in bijvoorbeeld java. Dit geeft gewoon aan dat dit het belangrijkste stukje code is van het programma. Je kunt "hoofd." echter vervangen door een andere naam.

De werkelijke programmacode wordt pas geschreven vanaf de 12de positie.

DISPLAY laat iets zien op het scherm. Wil je zoals in dit programma gewoon tekst tonen, dan moet je de tekst tussen aanhalingstekens plaatsen ("").

STOP RUN. (let op de punt) geeft aan dat je aan het einde van het programma zit.

Commentaar

bewerken

Het zou natuurlijk handig zijn als je commentaar kon plaatsen in een programma. Daarmee kun je later zien wat bijvoorbeeld bepaalde delen van een programma doen.

COBOL-code: Commentaar

         1         2         3         4         5         6         7
123456789012345678901234567890123456789012345678901234567890123456789012
      *Dit is commentaar

Om commentaar te vermelden, moet je gebruik maken van een asterisk (*) op de 7de positie (dus voor de asterisk moet je 6 spaties laten). De hele regel wordt dan gezien als commentaar.

Velden(variabelen)

bewerken

Variabelen worden in COBOL velden genoemd en gedeclareerd in de DATA DIVISION. Meer bepaald bij WORKING-STORAGE SECTION.

Numerieke velden

bewerken

COBOL-code: Numerieke velden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  getal PIC 9 VALUE 1.

Dit is een voorbeeld van een numeriek veld. Een veld begint op de 8ste positie. Het begint met het getal 77. 77 is het zogenaamde niveaunummer. Nu uitleggen wat het is zou zinloos zijn, aangezien dit nog maar de basis is. Naast 77 zou je ook 01 kunnen gebruiken. Het niveaunummer wordt gevolgd door de naam die je wilt geven aan het veld. Vaak wordt de naam van het veld vanaf de 12de positie geschreven. Daarna wordt het gevolgd door PIC(of PICTURE) dat bepaalt welk soort veld het is. De "9" staat voor een numeriek veld. Het aantal negens bepaalt hoeveel cijfers het veld maximum mag bevatten, 10 keer een 9 schrijven betekent dus een numeriek veld van 10 tekens lang. Als je een waarde aan een veld wilt toevoegen, kun je VALUE gebruiken, maar dit is niet verplicht. Vergeet opnieuw de punt op het einde niet.

COBOL-code: Numerieke velden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  getal PIC 9(10).

In plaats van bijvoorbeeld "77 getal PIC 9999999999." om de lengte te bepalen, kan je evengoed gewoon "PIC 9(10)" schrijven om aan te geven dat het getal uit 10 cijfers zal bestaan. Beide hebben hetzelfde effect.

Als je bijvoorbeeld het getal 7 in een variabele zet met PIC 999 dan krijg je op het scherm "007" te zien. Dus waar geen getal komt wordt 0 geplaatst. Later zullen we zien hoe je dit kunt wegwerken(zie hoofdstuk editing).

Alfanumerieke velden

bewerken

Dit is natuurlijk te vergelijken met een String in de programmeertaal Java. Je kunt zo'n veld declareren met PIC X. De X geeft opnieuw het soort variabele en zijn maximale lengte aan.

COBOL-code: Alfanumeriek velden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  tekst PIC X(10).

Ook hier kan VALUE worden gebruikt, alleen moet de inhoud nu tussen aanhalingstekens komen ("string" of 'string').

COBOL-code: Alfanumeriek velden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  tekst PIC X(13) value "dit is tekst!".

Een simpel programma

bewerken

COBOL-code: Getal

       IDENTIFICATION DIVISION.
       PROGRAM-ID. getal.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  tekst PIC X(18) VALUE "Dit is een getal:".
       77  getal PIC 9(3) VALUE 7.

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY tekst " " getal
           STOP RUN.
          
Dit is een getal: 007

Je kunt dus makkelijk 2 velden in dezelfde DISPLAY tonen. Dit zorgt er wel voor dat de twee velden naast elkaar komen te staan. Om een spatie tussen de twee velden te hebben, kun je gewoon " " doen. Wil je dat ze onder elkaar komen dan zet je ze gewoon in 2 DISPLAY’s.

COBOL-code: DISPLAY

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY tekst
           DISPLAY getal
           STOP RUN.
Dit is een getal:
007
   Zie ook ACCEPT voor meer informatie.

Het zou natuurlijk leuk zijn moest de gebruiker input kunnen geven. Dit gebeurt via ACCEPT, na ACCEPT moet je het veld geven waarin de gebruiker iets voor moet ingeven.

COBOL-code: ACCEPT

       IDENTIFICATION DIVISION.
       PROGRAM-ID. getal.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  getal PIC 9(3).

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "Geef een getal:"
           ACCEPT getal
           DISPLAY "Dit is uw getal: " getal
           STOP RUN.
Geef een getal:
7
Dit is uw getal: 007

Het vreemde aan ACCEPT is dat wanneer de gebruiker iets ingegeven heeft, de computer een biep-geluid geeft. Om dit te vermijden kan je NO BEEP gebruiken.

COBOL-code: NO BEEP

           ACCEPT getal NO BEEP

Met behulp van MOVE kun je makkelijk data overbrengen van het ene veld naar een andere. Maar je kunt ook gewoon een getal of tekst via MOVE naar een veld overbrengen.

COBOL-code: MOVE

       PROCEDURE DIVISION.
       hoofd.
           ACCEPT input NO BEEP
           MOVE input TO output
           MOVE 6 TO getal
           MOVE "Dit is tekst" TO tekst
           STOP RUN
           .

Decimale getallen

bewerken

Het stukje over numerieke velden ging alleen over gehele getallen en dus geen decimale. In COBOL moet je als je een decimaal getal wilt gebruiken dat ook zo declaren.

COBOL-code: Decimale getallen

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  getal PIC 99V9.

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "Geef een getal:"
           ACCEPT getal NO BEEP
           DISPLAY "Hier is uw getal: " getal
           STOP RUN
           .

De V na PIC geeft aan waar je de decimale punt wilt hebben. Als je een decimaal getal wilt ingeven, moet je een punt(.) gebruiken en geen komma(,). Dit is omdat COBOL ontwikkeld is in Amerika, waar een decimaal getal wordt aangegeven met een punt. Als je het getal echter toont op het scherm, komt er geen punt te staan. De V is alleen voor het inlezen van een getal en om er mee te rekenen. Wil je toch een punt hebben, dan moet je een extra variabele declareren (zie hoofdstuk editing).

COBOL-code: Decimale getallen

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  invoer  PIC 99V9.
       77  uitvoer PIC 99.9.
       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "Geef een getal:"
           ACCEPT invoer NO BEEP
           MOVE invoer TO uitvoer
           DISPLAY "Hier is uw getal:"
           DISPLAY uitvoer
           STOP RUN.

Het veld "uitvoer" zal gebruikt worden om het op het scherm te laten zien. Het verschil is dat de V vervangen werd door een punt. Bij dit veld moet je de inhoud kopiëren vanuit het veld "getal" door middel van MOVE.

Negatieve getallen

bewerken

Er geldt ook iets gelijkaardigs voor negatieve getallen, alleen is het hier erger. Als je negatieve getallen wilt gebruiken, moet je die ook eerst declareren.

COBOL-code: Negatieve getallen

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  getal PIC S999.

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "geef een getal"
           ACCEPT getal NO BEEP
           DISPLAY " "
           DISPLAY getal
           STOP RUN.

Als je dus een negatief getal wilt, moet je na PIC S999 zetten. S betekent sign (teken) en geeft aan dat het een negatief getal mag zijn. Dit geeft echter een probleem, zoals hieronder te zien is in de schermtekst als je het programma uitvoert.


Geef een getal
-888

88Q

88Q is dus niet het getal dat we hebben ingegeven. Hier kun je echter perfect mee rekenen, maar zoals bij een decimaal getal moet je er iets speciaal mee doen. Je hebt weer een extra veld nodig.

COBOL-code: Negatieve getallen

       77 uitvoer PIC -999.

De "-" geeft aan waar je het teken wilt (zie hoofdstuk Editing). Opgelet, dit betekent niet dat er altijd een - zal staan; bij een positief getal zal er geen teken staan. Gebruik je daarentegen PIC +999 dan staat er altijd een teken, hetzij +, hetzij -, afhankelijk van de inhoud. Gebruik opnieuw MOVE om de inhoud van getal naar uitvoer te kopiëren.


2. Berekeningen



Dit is een hoofdstuk waar je kunt leren hoe je iets moet berekenen in COBOL.

COMPUTE

bewerken
   Zie ook COMPUTE voor meer informatie.

COMPUTE is de makkelijkste manier waarmee je iets kunt berekenen in COBOL. De volgende delen van deze pagina zijn hierdoor eigenlijk onnodig, maar het kan best leuk zijn om te weten dat je het ook anders kunt doen. Rekenen wordt gedaan met +, -, *, /, **(machten). Om die tekens te gebruiken, moet je ze tussen 2 spaties zetten. Nooit bijvoorbeeld "1+1" maar altijd 1 + 1.

COBOL-code: COMPUTE

           COMPUTE uitkomst = getal + 2

De variabelen waar de uitkomst moet komen te staan aan de linkerkant van de "=" de berekening staat altijd aan de rechterkant. "=" lees je dus best als "wordt" (en niet "is"). Het is mogelijk om af te ronden in COBOL dankzij ROUNDED: Een 1, 2, 3 en 4 worden naar beneden afgerond; 5, 6, 7, 8 en 9 worden naar boven afgerond: Stel dat de uitkomst 4.5 is, maar het komt terecht in een variabele met PIC 9 die alleen 4 opslaat. Een wetenschappelijke/wiskundige afronding naar boven kan je uitvoeren met ROUNDED.

COBOL-code: COMPUTE

           COMPUTE uitkomst ROUNDED = getal / 2

Ook kun je de uitkomst in meerdere variabelen zetten en kun je de ene niet laten afronden en de andere dan weer wel.

COBOL-code: COMPUTE

           COMPUTE uitkomst uitkomst2 ROUNDED = 5 / (getal + 2 - getal2) * .5 ** 25

Wanneer er een complexe berekening wordt gedaan, hebben bepaalde tekens voorrang op andere, net zoals in de wiskunde. Haakjes hebben altijd voorrang. Daarna komt **, gevolgd door * en / (evenwaardig) en tenslotte + en -. Gelijk(waardig)e tekens worden van links naar rechts uitgevoerd.

Hoewel er geen teken bestaat om een wortel te doen met COMPUTE, is er toch een simpele manier om het te doen. Er bestaat namelijk een alternatieve notatie voor een wortel.

 

Links staat een gewone vierkantswortel en rechts staat 2 tot de 1/2 macht. Die zijn namelijk gelijk. De algemene notatie is:

 

Dit maakt dat je een wortel kan berekenen door het volgende te doen.

COBOL-code: COMPUTE

           COMPUTE uitkomst = a ** (1 / n)
   Zie ook ADD voor meer informatie.

Naast COMPUTE zijn er nog ander manieren om te rekenen. Het enige voordeel dat deze manier heeft is dat het zeer logisch kan overkomen.

COBOL-code: ADD

           ADD verkoop TO omzet

Hier wordt dan de inhoud van verkoop toegevoegd aan de inhoud van omzet. Het is mogelijk om met meerdere variabelen bij ADD te gebruiken.

COBOL-code: ADD

           ADD getal1 getal2 TO getal3 getal4 ROUNDED

Getal1 en getal2 worden zowel bij getal3 als bij getal4 opgeteld. Net zoals COMPUTE kun je gebruik maken van ROUNDED. Het woord GIVING zorgt dat het resultaat in een andere variabele gezet wordt.

COBOL-code: ADD

           ADD prijs TO btw GIVING totaleprijs afgerondeprijs ROUNDED

SUBTRACT

bewerken
   Zie ook SUBTRACT voor meer informatie.

COBOL-code: SUBTRACT

           SUBTRACT 1 FROM getal

SUBTRACT verschilt niet erg van ADD: alleen wordt hier FROM gebruikt in de plaats van TO. Ook hier kan je GIVING en ROUNDED gebruiken.

COBOL-code: SUBTRACT

           SUBTRACT 1 getal1 FROM getal2 GIVING getal3 getal4 ROUNDED

Waar je wel voor moet opletten is de declaratie van de variabelen. Als je SUBTRACT doet, kun je een negatief getal krijgen. Daarom is het best dat je S gebruikt bij de variabelen, bijvoorbeeld PIC S999. (data editing).

MULTIPLY

bewerken
   Zie ook MULTIPLY voor meer informatie.

COBOL-code: MULTIPLY

           MULTIPLY getal1 BY getal2 getal3 ROUNDED

Hier worden getal2 en getal3 vermenigvuldigd met getal1. Ook hier kun je ROUNDED en GIVING gebruiken.

COBOL-code: MULTIPLY

           MULTIPLY getal1 BY getal2 GIVING getal3 getal4 ROUNDED
   Zie ook DIVIDE voor meer informatie.

COBOL-code: DIVIDE

           DIVIDE getal1 INTO getal2 getal3 ROUNDED

Opgelet, hier worden getal2 en getal3 gedeeld door getal1 (niet omgekeerd). Hier kun je ook ROUNDED en GIVING gebruiken.

COBOL-code: DIVIDE

           DIVIDE getal1 INTO getal2 GIVING getal3 getal4 ROUNDED

Naast DIVIDE ... INTO kun je ook DIVIDE ... BY gebruiken.

COBOL-code: DIVIDE

           DIVIDE getal1 BY getal2 GIVING getal3 getal4 ROUNDED

Dit zorgt ervoor dat de berekening wordt omgedraaid. getal 1 zal worden gedeeld door getal2 in de plaats van getal2 door getal1. Je kunt bij DIVIDE ook de rest opslaan via REMAINDER.

COBOL-code: DIVIDE

           DIVIDE getal1 BY getal2 GIVING getal3 REMAINDER getal4

Hier zal de rest worden opgeslagen in getal4.

Speciale gevallen

bewerken

Hoewel de notatie ingewikkeld is, kan met bovenstaande operaties bondiger programmacode geschreven worden. Onderstaande codelijnen zijn equivalent aan elkaar:

COBOL-code: Speciale gevallen

           ADD k l m TO a b
           COMPUTE a = a + k + l + m
           COMPUTE b = b + k + l + m

           SUBTRACT k l m FROM a b
           COMPUTE a = a - ( k + l + m )
           COMPUTE b = b - ( k + l + m )

           MULTIPLY p BY q GIVING r s
           COMPUTE r s = p * q

           DIVIDE 15 BY k GIVING l REMAINDER m
           COMPUTE l = 15 / k
           COMPUTE m = 15 - k * l

Foutmeldingen kunnen opgevangen worden met ON SIZE ERROR. Als er de uitkomst niet in de PIC (PICTURE) past, kan een subroutine opgeroepen worden.

COBOL-code: Speciale gevallen

           COMPUTE a = b * c
             ON SIZE ERROR PERFORM subroutine
           END-COMPUTE

           MULTIPLY b BY c GIVING a
             ON SIZE ERROR PERFORM subroutine
           END-COMPUTE

Conclusie

bewerken

COMPUTE is de eenvoudigste manier om berekeningen uit te voeren. Het gaat veel sneller en je kunt snel complexe berekeningen uitvoeren zonder al teveel programmeerwerk. Wil je toch ADD, SUBTRACT, MULTIPLY en DIVIDE gebruiken dan is het aangeraden om goed te oefenen.


3. IF en lussen



In dit hoofdstuk leer je over conditionele expressies (IF) en herhalingen (PERFORM n TIMES, PERFORM UNTIL ...).

Condities

bewerken

Relatiecondities

bewerken

Via een relatieconditie vergelijk je een veld, constante of een rekenkundige uitdrukking met een andere: Groter, kleiner of gelijk. Dit kan met de operatoren >, <, =, >= en <=.

Tekencondities

bewerken

Dit zijn POSITIVE, NEGATIVE en ZERO. Hiermee vergelijk je een veld, constante of een rekenkundige uitdrukking om respectievelijk te zien of ze positief, negatief of nul zijn.

OR en AND

bewerken

Hiermee kun je meerdere condities gebruiken. Bij OR moet één van de relatie condities waar zijn bij AND moeten beide waar zijn.

IF-statement

bewerken
   Zie ook IF voor meer informatie.

In programmeren kun je 2 of meer dingen met elkaar vergelijken en op basis daarvan iets al of niet uitvoeren. Dit kan met IF ... END-IF. In onderstaand programma kan de gebruiker een getal raden. Als het getal juist is, dan krijgt hij "goed gegokt" op het scherm.

COBOL-code: IF-statement

           DISPLAY "geef een getal van 0 tot 9"
           ACCEPT getal

           IF getal = 5
             DISPLAY "goed gegokt"
           END-IF

IF zal de inhoud van de variabele vergelijken met 5. Als het overeenkomt, zal wat er tussen IF en END-IF staat, uitgevoerd worden. Met ELSE kan je ook iets doen in het andere geval. (THEN hoeft niet geschreven te worden, maar komt de leesbaarheid wel ten goede.)

COBOL-code: IF-statement

           IF getal = gezochtgetal
             THEN DISPLAY "goed gegokt"
             ELSE DISPLAY "slecht gegokt"
           END-IF

THEN geeft aan wat er gebeurt als het goed is en ELSE als het fout is. Natuurlijk kun je ook 2 variabelen met elkaar vergelijken zoals hier de IF getal vergelijkt met gezochtgetal.

Een IF moet altijd worden afgesloten met END-IF, anders leest de compiler tot bij het volgende punt. Moderne COBOL-conventies raden het gebruik van END-IF aan.

EVALUATE

bewerken
   Zie ook EVALUATE voor meer informatie.
 
TE DOEN

TE DOEN
EVALUATE bespreken

   Zie ook PERFORM voor meer informatie.

Er zijn twee manieren om lussen te gebruiken: door middel van TIMES of UNTIL. TIMES laat een lus een aantal keren uitvoeren. Bij UNTIL moet er aan een bepaalde voorwaarde voldaan worden voordat de lus stopt. In beide gevallen moet er wel eerst PERFORM worden gebruikt.

COBOL-code: Lus met times

           PERFORM 60 TIMES
             DISPLAY "times"
           END-PERFORM

Met dit programma wordt "times" 60 keer getoond op het scherm. Er kan natuurlijk ook gebruik gemaakt worden van een variabele die bepaalt hoe vaak de lus moet worden uitgevoerd.

COBOL-code: Lus met UNTIL

           DISPLAY "Hoe vaak moet de lus worden uitgevoerd"
           ACCEPT getal NO BEEP

           PERFORM UNTIL getal = 0
             COMPUTE getal = getal – 1
             DISPLAY getal
           END-PERFORM

Hoewel dit voorbeeld sterk overeenkomt met het vorige, is het toch fundamenteel verschillend: als je de - vervangt door een +, dan zal de lus nooit eindigen!(Mainframes stoppen gelukkig vanzelf na een seconde (dure) rekentijd.) Om aan deze lus een einde te brengen moet er voldaan worden aan een bepaalde voorwaarde hier is dat wanneer het getal 0 bevat. Er kunnen ook meerdere condities bij UNTIL worden gebruikt.

COBOL-code: Meerdere condities.

           PERFORM UNTIL (getal1 = 0 OR getal2 > 0) AND getal 3 < 0

VARYING

bewerken

Deze lus kan vergeleken worden met de for-lus in andere talen. Maar moet echter gecombineerd worden met UNTIL.

COBOL-code: Lus met VARYING

       IDENTIFICATION DIVISION.
       PROGRAM-ID. performvarying.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  i pic 99.

       PROCEDURE DIVISION.
       hoofd.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 20
             DISPLAY "I is: " i
           END-PERFORM
           STOP RUN.

Deze lus begint ook met PERFORM gevolgd door VARYING. i is de teller in deze lus en wordt gevolgd door FROM. FROM bepaalt de start positie van de teller i in de plaats van een cijfer kan er ook een veld staan. Dan komt BY en betekent hoeveel er wordt opgeteld of afgetrokken(je kan dus ook een negatief getal gebruiken) van de teller per keer dat de lus wordt uitgevoerd. Dan komt UNTIL die werkt net zoals bij de gewone UNTIL als er aan een bepaalde voorwaarde wordt voldaan eindigt de lus.


4. Deelprogramma's



Dit is een hoofdstuk waar je kunt leren hoe je deelprogramma's kunt maken in COBOL.

Gebruik van deelprogramma's

bewerken

Deelprogramma’s zijn deeltjes code die apart worden gezet en gebruikt worden door het hoofdprogramma. Dit wordt gedaan zodat de programmacode overzichtelijker wordt en stukjes code opnieuw kan worden gebruikt. Een deelprogramma voert slechts één taak uit. Daardoor is het belangrijk om een goede naam te geven aan het deelprogramma dat zegt, liefst in één woord, wat het doet.

De simpele manier

bewerken

COBOL-code: Deelprogramma

       IDENTIFICATION DIVISION.
       PROGRAM-ID. naam.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 naam PIC X(20).

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "wat is uw naam?"
           ACCEPT naam
           PERFORM toon
           STOP RUN
           .

       toon.
           DISPLAY naam
           .

Dit is een simpel voorbeeld van een deelprogramma. Een deelprogramma wordt opgeroepen door middel van PERFORM, dus hetzelfde als bij een lus. Na PERFORM komt de naam van het deelprogramma in dit geval toon. Een deelprogramma wordt na de STOP RUN. van het hoofdprogramma geschreven. De naam van het deelprogramma wordt geschreven vanaf de 8ste positie, gevolgd door een punt. De code van het deelprogramma wordt, net zoals bij het hoofdprogramma, geschreven vanaf de 12de positie. Het is belangrijk om te onthouden dat na de code van het deelprogramma een punt komt dat aangeeft dat er een einde is gekomen aan het deelprogramma. Na een deelprogramma kunnen eventueel nog andere worden geschreven. Ook kan er van één deelprogramma worden verwezen naar een ander.

Deelprogramma met times

bewerken

COBOL-code: Deelprogramma met TIMES

       IDENTIFICATION DIVISION.
       PROGRAM-ID. dlprogmettimes.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 getal pic 9(3).

       PROCEDURE DIVISION.
       hoofd.
           PERFORM tel 80 TIMES
           STOP RUN.

       tel.
           COMPUTE getal = getal + 1
           PERFORM toon
           .

       toon.
           DISPLAY getal
           .

Zoals bij lussen, kan er ook gebruik gemaakt worden van TIMES. PERFORM wordt gevolgd door de naam van het deelprogramma (tel) en ... TIMES, het aantal keer dat het uitgevoerd moet worden. Dit is ook een voorbeeld van een verwijzing vanuit een deelprogramma naar een ander.

Deelprogramma met UNTIL

bewerken

COBOL-code: Deelprogramma met UNTIL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. dlprog.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 getal PIC 9(3).

       PROCEDURE DIVISION.
       hoofd.
           PERFORM tel UNTIL getal = 80
           STOP RUN.

       tel.
           COMPUTE getal = getal + 1
           PERFORM toon
           .

       toon.
           DISPLAY getal
           .

Dit programma doet eigenlijk hetzelfde als het vorige maar hier wordt gebruik gemaakt van UNTIL. Dit is grotendeels hetzelfde. PERFORM wordt gevolgd door de naam van het deelprogramma en vervolgens UNTIL met de voorwaarde waaraan moet voldaan worden om te stoppen.


5. Werken met tekst



In dit hoofdstuk worden de verschillende manieren uitgelegd om te werken met tekst.

ALPHABETIC

bewerken

Via ALPHABETIC kun je controleren of de inhoud van een veld alleen maar hoofdletters, kleine letters en spaties bevat. Je kunt dit in een programma als beveiliging inbouwen, zodat de gebruiker geen verkeerde informatie geeft. Als je bijvoorbeeld een naam vraagt, kun je controleren dat het geen getal is of rare tekens bevat.

COBOL-code: ALPHABETIC

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Tekst.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 naam PIC X(10).

       PROCEDURE DIVISION.
       HOOFD.
           ACCEPT naam NO BEEP
           IF naam ALPHABETIC
             THEN DISPLAY "Naam is toegestaan"
             ELSE DISPLAY "Naam is niet toegestaan"
           END-IF
           STOP RUN.

Naast ALPHABETIC bestaat er ook nog ALPHABETIC-LOWER en ALPHABETIC-UPPER. ALPHABETIC-LOWER controleert of alles in kleine letters staat en UPPER controleert of alles in hoofdletters staat.

Tekens vervangen

bewerken

Tekens vervangen gaat via het INSPECT-statement maar er zijn twee manieren om dat statement te gebruiken. Via REPLACING en CONVERTING, zowel bij numerieke als bij alfanumerieke velden.

REPLACING

bewerken

REPLACING maakt het mogelijk om in een veld een teken te veranderen door een ander teken of een stukje tekst door een ander stukje tekst.

COBOL-code: Tekst vervangen

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Tekst vervangen.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 tekst PIC xxxx VALUE "papa".

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY tekst
           INSPECT tekst REPLACING ALL "p" BY "m".
           DISPLAY tekst
           INSPECT tekst REPLACING ALL "ma" BY "do".
           DISPLAY tekst
           STOP RUN.
papa
mama
dodo

ALL betekent in dit geval dat alle p’s worden vervangen door m’s. Naast ALL, kan je ook FIRST en LEADING gebruiken. FIRST betekent dat alleen de eerste vervangen wordt, en LEADING vervangt alleen als het helemaal vooraan staat. Je kunt slechts één veld tegelijkertijd gebruiken. Wat je vervangt en waarmee je het vervangt, moeten een gelijke tekenlengte hebben. 2 tekens moeten altijd vervangen worden door 2 tekens. Ook is het mogelijk om andere velden en constanten te gebruiken, zoals REPLACING ALL tekst BY andertekst of REPLACING ALL ZERO BY quote.

CONVERTING

bewerken

Een stuk tekst omzetten naar allemaal hoofdletters, kan met op verschillende manieren. Het kan omslachtig met REPLACING: REPLACING ALL "a" by "A", REPLACING ALL "b" by "B" enzovoort. Efficiënter gaat het met het INSPECT-statement in combinatie met CONVERTING.

COBOL-code: Tekst vervangen

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Tekst vervangen.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 tekst PIC xxxx VALUE "test".
       77 kleineletters PIC X(27) VALUE "abcdefghijklmnopqrstuvwxyz".
       77 hoofdletters  PIC X(27) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ".

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY tekst
           INSPECT tekst CONVERTING kleineletters TO hoofdletters
           DISPLAY tekst
           STOP RUN.
test
TEST

Wanneer je CONVERTING gebruikt, kijkt COBOL eerst naar het veld dat je wilt omzetten. Hij kijkt naar het eerst teken, in dit geval de letter t, en zoekt die vervolgens in het veld kleineletters. Als COBOL de letter heeft gevonden, onthoudt die de positie van die letter, in dit geval positie 20. Dan kijkt het naar hoofdletters en zoekt wat er op positie 20 staat, dus hoofdletter T. Dit proces wordt herhaald tot alle letters vervangen werden. Voor de rest gelden dezelfde regels als bij REPLACING.

Dit algoritme kan gebruikt worden om een tekst op eenvoudige manier te versleutelen met een geheime code.

COBOL-code: Caesarcijfer-rotatie3

 
ontcijfersleutel voor Caesar-rotatie3
       IDENTIFICATION DIVISION.
       PROGRAM-ID. Tekst vervangen.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 tekst PIC X(29)  VALUE "D I T I S Z E E R G E H E I M".
       77 gewone-tekst     PIC X(27) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
       77 caesar-rotatie3  PIC X(27) VALUE "XYZABCDEFGHIJKLMNOPQRSTUVW".

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY tekst
           INSPECT tekst CONVERTING gewone-tekst TO caesar-rotatie3
           DISPLAY tekst
           STOP RUN.
D I T I S Z E E R G E H E I M
A F Q F P W B B O D B E B F J

Tekst opslitsen met UNSTRING

bewerken
   Zie ook UNSTRING voor meer informatie.

Via UNSTRING kun je een alfanumeriek veld met tekst opsplitsen in kleinere velden.

COBOL-code: UNSTRING

       IDENTIFICATION DIVISION.
       PROGRAM-ID. tekstopslitsen.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  datum PIC x(8).

       77  dag   PIC XX.
       77  maand PIC XX.
       77  jaar  PIC XXXX.

       PROCEDURE DIVISION.
       hoofd.
           DISPLAY "Geef een datum(ddmmjjjj)."
           ACCEPT datum NO BEEP
           UNSTRING datum
           INTO dag, maand, jaar 
           DISPLAY "Dag: " dag " Maand: " maand " Jaar: " jaar
           STOP RUN.

Dit programma leest een datum in volgens ddmmjjjj, wat betekent dat een datum als 21 april 2007 moet worden geschreven als 21042007. Uiteindelijk wordt de datum verdeeld over de velden dag, maand en jaar. Na UNSTRING moet het veld komen dat je wilt opsplitsen. Na INTO moeten dan de velden komen waar de opgesplitste tekst moet komen. Het aantal velden mag minder of meer zijn dan het aantal stukjes tekst dat ontstaat door de UNSTRING.

Geef een datum(ddmmjjjj).
21042007
Dag: 21 Maand: 04 Jaar: 2007

Mensen schrijven hun datums niet zoals 21042007 maar eerder als 21-04-2007. UNSTRING maakt het mogelijk om een tekst op te splitsen op basis van een bepaald teken in dit geval moet dat "-" zijn. Dit gebeurd als volgt.

COBOL-code: UNSTRING

           UNSTRING datum
           DELIMITED BY "-"
           INTO dag, maand, jaar 

DELIMITED geeft dus aan op basis van welk teken de tekst moet worden opgesplitst.


Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.