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
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.