Programmeren in COBOL/Velden/Tabellen

Uit Wikibooks

Programmeren in COBOL

Inhoudsopgave

  1. Groepsvelden en conditie met voorwaardenaam Zeer goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  2. Tabellen Goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  3. Editing Zeer goed ontwikkeld. Revisiedatum: 16 november 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  4. Embedded SQL Redelijk ontwikkeld. Revisiedatum: 21 oktober 2007



1-dimensionale tabel[bewerken]

Simpel voorbeeld[bewerken]

Tabellen, ook wel arrays genoemd, worden gebruikt om gelijkaardige gegevens bij elkaar te houden: In een tabel staan bijvoorbeeld een aantal temperatuurmetingen of namen van personen. Met een tabel kun je bovendien vermijden dat je veel verschillende variabelen moet maken: Naam1, naam2, naam3, ...

Een tabel kan ook gebruikt worden om maar eenmaal een bestand te hoeven lezen, want dat is trager dan het raadplegen van werkgeheugen.

In onderstaand stukje programmacode zullen we 10 verschillende getallen lezen, om ze vervolgens allemaal terug op het scherm te tonen.

COBOL-code: Tabel

       IDENTIFICATION DIVISION.
       PROGRAM-ID. tabel.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES.

       77 i PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           STOP RUN.

       LEES.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY "Geef " i "de getal:"
             ACCEPT getal(i) NO BEEP
           END-PERFORM
           .
      
       TOON.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY i "de getal is " getal(i)
           END-PERFORM
           .

Nu zullen we de belangrijke delen van het programma uitleggen.

COBOL-code: Tabel

       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES.

       77 i PIC 99.

Een tabel lijkt ongeveer op een groepsveld. Het grote verschil is OCCURS: Dat geeft aan hoeveel getallen er moeten worden opgeslagen; in dit geval 10 keer. i zal worden gebruikt als teller:

COBOL-code: Tabel

           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY "Geef " i "de getal:"
             ACCEPT getal(i) NO BEEP
           END-PERFORM

De verschillende getallen die in de tabel worden opgeslagen, worden niet aangeduid door een unieke naam, maar wel door een nummer. Dit nummer wordt index (of subscript) genoemd. Om de 10 verschillende getallen te lezen, wordt er best gebruik gemaakt van een lus. De variabele i wordt gebruikt als teller, die teller kun je gebruiken als index. In de lus wordt eerst 1 in i gezet en wordt met 1 verhoogd, telkens de lus opnieuw wordt uitgevoerd. Om een getal op te slaan, typ je "ACCEPT getal(i)"; dan wordt het getal op de ide plaats opgeslagen. Om dat getal te kunnen tonen, moet je gewoon "DISPLAY getal(i)" gebruiken. Een teller is natuurlijk niet verplicht om de getallen te kunnen lezen en uitschrijven. Je kan gewoon een nummer vragen van de gebruiker zelf. Het is ook mogelijk om in een subscript een kleine berekening te doen. Hier zijn een aantal andere mogelijkheden.

COBOL-code: Tabel

           COMPUTE fibonacci(3) = fibonacci(2) + fibonacci(1)
          * Je kunt een vast getal in de code opgeven
           COMPUTE fibonacci(nummer) = fibonacci(nummer - 1) + fibonacci(nummer - 2) 
          * Je kunt een variabele gebruiken, of een berekening maken

VALUE bij tabellen[bewerken]

Je kunt op voorhand al een waarde geven aan de verschillende elementen van een tabel. Hiervoor zijn meerdere mogelijkheden beschikbaar.

COBOL-code: VALUE bij tabellen

       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES VALUE 9.

Door dit te doen, geef je aan ieder element in de tabel de waarde 9. Er is ook een andere manier d.m.v. de naam van de tabel.

COBOL-code: VALUE bij tabellen

       01 tabel VALUE "abcdefghijklmnopqrstuvwxyz".
        02 letter PIC X OCCURS 26 TIMES.

Hier wordt via de naam van de tabel de gegevens in de verschillende elementen gezet. "a" komt in het eerste element, "b" in het tweede en zoverder. Dit kan handig zijn als je kleine gegevens in een tabel wilt zetten. Maar als je 10 namen in een tabel wilt zetten, kan je ook per element een waarde geven op een andere manier:

COBOL-code: VALUE bij tabellen

       01 tabel.
        02 PIC X(10) VALUE "Dimitri".
        02 PIC X(10) VALUE "Kenny".
        02 PIC X(10) VALUE "Kristof".
        02 PIC X(10) VALUE "Jeroen".
        02 PIC X(10) VALUE "Steven".
        02 PIC X(10) VALUE "Jan".
        02 PIC X(10) VALUE "Nathalie".
        02 PIC X(10) VALUE "Liesbeth".
        02 PIC X(10) VALUE "Katrien".
        02 PIC X(10) VALUE "Joke".

       01 REDEFINES tabel.
        02 naam PIC X(10) OCCURS 10 TIMES.

Je maakt een groepsveld, en aan iedere veld geef je een waarde. Let wel op dat je dezelfde PIC geeft aan alle velden, anders krijg je heel vreemde resultaten. Dan gebruik je "REDEFINES", deze zal van het groepsveld een tabel maken.

Complexer voorbeeld[bewerken]

COBOL-code: Complexer voorbeeld

       IDENTIFICATION DIVISION.
       PROGRAM-ID. tabel.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT invoer ASSIGN TO "invoer.dat"
           LINE SEQUENTIAL.

           SELECT uitvoer ASSIGN to "uitvoert.dat"
           LINE SEQUENTIAL.


       DATA DIVISION.
       FILE SECTION.
       FD invoer.
       01 persoon.
        02 achternaam PIC X(20).
        02 voornaam PIC X(15).
        02 PIC X(39).
        02 geslacht PIC X.

       FD uitvoer.
       01 regel.
        02 uitvn PIC X(15).
        02 PIC X.
        02 uitan PIC X(20).
        02 PIC X.
        02 uitge PIC X.

       WORKING-STORAGE SECTION.
       01 tabel.
        02 tpersoon OCCURS 2 TIMES.
         03 tvn PIC X(15).
         03 tan PIC X(20).
         03 tge PIC X.

       77 i PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           PERFORM schrijf
           STOP RUN.

       LEES.
           OPEN INPUT invoer
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 2
             READ invoer END-READ
             MOVE achternaam TO tan(i)
             MOVE voornaam TO tvn(i)
             MOVE geslacht TO tge(i)
           END-PERFORM
           CLOSE invoer
           .
      
       TOON.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 2
             DISPLAY tvn(i) " " tan(i) " " tge(i)
           END-PERFORM
           .

       SCHRIJF.
           OPEN OUTPUT uitvoer
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             MOVE tan(i) TO uitan
             MOVE tvn(i) TO uitvn
             MOVE tge(i) TO uitge
             WRITE regel END-WRITE
           END-PERFORM
           CLOSE uitvoer
           .

Als je het hoofdstuk over Sequentiële bestanden hebt gelezen, zul je wel al door hebben dat dit programma een bestand leest en schrijft. Hier wordt een tabel gebruikt om de informatie van het gelezen bestand in op te slaan. Hierdoor gaat de informatie niet verloren telkens je een nieuwe regel leest.

COBOL-code: Complexer voorbeeld

       01 tabel.
        02 tpersoon OCCURS 2 TIMES.
         03 tvn PIC X(15).
         03 tan PIC X(20).
         03 tge PIC X.

Je kunt dus ook een tabel onderverdelen in groepsvelden. Dit zorgt ervoor dat je een tabel onderverdelen in verschillende variabelen, wat het duidelijk en makkelijker maakt om er mee te werken.

COBOL-code: Complexer voorbeeld

             MOVE achternaam TO tan(i)
             MOVE voornaam TO tvn(i)
             MOVE geslacht TO tge(i)

2-dimensionale tabel(matrix)[bewerken]

Een 2-dimensionale tabel laat natuurlijk toe om meer informatie op te slaan. Stel dat je bijvoorbeeld de dagtemperatuur van 7 dagen wilt opslaan. Dan kun je een gewoon 1-dimensionaal tabel gebruiken. Maar wat als je dat van 5 verschillende straten wilt opslaan. Dan kun je ofwel 5 verschillende 1-dimensionale tabelen maken. Of je kunt het volgende doen:

COBOL-code: 2-dimensionale tabel

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 2demtabel.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 temperatuur.
        02 straat OCCURS 5 TIMES.
         03 dag PIC 99 OCCURS 7 TIMES.

       77 i PIC 9.
       77 j PIC 9.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           STOP RUN.

       LEES.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             PERFORM VARYING j FROM 1 BY 1 UNTIL j > 7
               DISPLAY "Geef de " j "de dagtemperatuur van de " i "de straat:"
               ACCEPT dag(i, j) NO BEEP
             END-PERFORM
           END-PERFORM
           .
      
       TOON.
           DISPLAY "gebied\dag 1  2  3  4  5  6  7"
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             DISPLAY i "          " dag(i, 1) " " dag(i, 2) " "
             dag(i, 3) " " dag(i, 4) " " dag(i, 5) " " dag(i, 6) " "
             dag(i, 7)
           END-PERFORM
           .

Hier wordt dus voor iedere straat 7 dagtemperaturen in gelezen.

COBOL-code: 2-dimensionale tabel

       01 temperatuur.
        02 straat OCCURS 5 TIMES.
         03 dag PIC 99 OCCURS 7 TIMES.

Het zal u dus niet verbazen dat je 2 keer OCCURS moet gebruiken. Eén keer om de 5 straten te declareren en één keer om voor elk gebied 7 dagen te declaren.

COBOL-code: 2-dimensionale tabel

           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             PERFORM VARYING j FROM 1 BY 1 UNTIL j > 7
               DISPLAY "Geef de " j "de dagtemperatuur van de " i "de straat:"
               ACCEPT dag(i, j) NO BEEP
             END-PERFORM
           END-PERFORM

Om via een lus de gegevens in te voeren, heb je bij een 2-dimensionale tabel 2 lussen nodig. De eerste lus gaat de gebieden één voor één af en de tweede lus zal de dagen afgaan. De subscript ziet er natuurlijk ook anders uit.

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