3.16 Voorbeeld: volgende dag

In dit derde hoofdstuk is er heel wat nieuwe stof behandeld. Wie tot zover alles heeft begrepen, is geen absolute beginner meer op COBOL-gebied. We durven het daarom aan om aan het eind van dit hoofdstuk een pittig programma te presenteren.

Het programma vraagt als invoer om een datum in de periode 1950 tot en met vorig jaar. Onder vorig jaar verstaan we het jaar dat voorafgaat aan het huidige jaar uit de computerdatum. Het programma moet om invoer blijven vragen tot een correcte datum is ingetoetst. Op de printer moet de ingevoerde datum en die van de volgende dag komen. Bij de dag en maand mogen geen voorloopnullen staan. Bij de invoer 29021980 moet de uitvoer zijn:

na 29  2 1980 kwam  1  3 1980
  

De oplossing voor dit probleem is gegeven in het volgende programma. Het is een lang en ingewikkeld programma dat het bestuderen meer dan waard is.

De volgende onderwerpen uit dit derde hoofdstuk kun je in het programma terugvinden:
- gebroken waarden;
- de move-opdracht;
- onderdrukken van voorloopnullen;
- indeling van velden;
- uitvoer op beeldscherm èn printer;
- opvragen van de computerdatum;
- subroutines;
- het koppelen van voorwaarden;
- test op numeriek.

illustratie: Geert Nijmolen

cartoon

 IDENTIFICATION DIVISION
 PROGRAM-ID. Volgende-dag.
*Auteur: Andree Hollander
*Datum:  1988/04/29

 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 SPECIAL-NAMES.
     Printer is papier.

 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01 invoer-datum.
    02 in-dag           picture 99.
    02 in-maand         picture 99.
    02 in-jaar          picture 99.
 01 systeemdatum.
    02 dit-jaar         picture 99.
 01 uit-dag             picture Z9.
 01 uit-maand           picture Z9.
 01 datum-ok-wissel     picture X.
 01 dagen-in-maand      picture 99.

* om te kijken of een jaar deelbaar is door 4 vergelijken we 
* de uitkomsten van de deling door 4 in de volgende twee velden:
 01 gebroken            picture 99V9.
 01 geheel              picture 99.

/
 PROCEDURE DIVISION.
 HOOFD-GEDEELTE.
     Perform with test after until datum-ok-wissel = "J"
        perform vraag-een-datum
        move "J" to datum-ok-wissel
        if invoer-datum not numeric then
           display "Datum is niet numeriek"
           move "N" to datum-ok-wissel
        else
           perform controleer-datum
*          bij een geconstateerde fout komt er een foutboodschap
*          op het scherm en wordt datum-ok-wissel gelijk aan "N"
        end-if
     end-perform
     move in-dag to uit-dag
     move in-maand to uit-maand
     display "Na " uit-dag " " uit-maand " " in-jaar 
         upon papier with no advancing
     perform bereken-volgende-dag
     move in-dag to uit-dag
     move in-maand to uit-maand
     display "kwam " uit-dag " " uit-maand " " in-jaar
         upon papier
     stop run.

 VRAAG-EEN-DATUM.
     Display " "
     display "Geef een datum in de periode 1950 t/m vorig jaar."
     display "Gebruik de vorm DDMMJJ (6 cijfers achter elkaar,"
     display "DD betekent dag, MM maand en JJ jaar)."
     display " "
     display "Welke datum?" with no advancing
     accept invoer-datum.

 CONTROLEER-DATUM.
     Accept systeemdatum from date
     if in-jaar < 50 or in-jaar >= dit-jaar then
        display "Jaar is onjuist"
        move "N" to datum-ok-wissel
     end-if
     if in-maand < 1 or in-maand > 12 then
        display "Maand is onjuist"
        move "N" to datum-ok-wissel
     end-if
     perform hoeveel-dagen-in-de-maand
     if in-dag < 1 or in-dag > dagen-in-maand then
        display "Dag is onjuist"
        move "N" to datum-ok-wissel
     end-if.

 HOEVEEL-DAGEN-IN-DE-MAAND.
     If in-maand = 4 or in-maand = 6 or 
        in-maand = 9 or in-maand = 11 then
        move 30 to dagen-in-maand
     else
        move 31 to dagen-in-maand
     end-if
     if in-maand = 2 then
        compute gebroken = in-jaar / 4
        compute geheel   = in-jaar / 4
        if gebroken = geheel then
*          als een jaartal deelbaar is door 4 
*          dan is het een schrikkeljaar
           move 29 to dagen-in-maand
        else
           move 28 to dagen-in-maand
        end-if
     end-if.

 BEREKEN-VOLGENDE-DAG.
     compute in-dag = in-dag + 1
     if in-dag > dagen-in-maand then
        move 1 to in-dag
        compute in-maand = in-maand + 1
        if in-maand > 12 then
           move 1 to in-maand
           compute in-jaar = in-jaar + 1
        end-if
     end-if.
  
omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo