9.8 Voorbeeld: mijlpalen

Elke keer als iemand duizend dagen heeft geleefd, bereikt hij of zij een mijlpaal. Het programma mijlpalen bepaalt voor een persoon de dag waarop de eerstvolgende mijlpaal wordt bereikt.

Er zijn drie programma's bij de berekening betrokken. Een hoofdprogramma en twee subprogramma's. Elk van de drie programma's wordt apart gecompileerd.

illustratie: Geert Nijmolen

mijlpaal mijlpaal mijlpaal kruis

 identification division.
 program-id. mijlpalen.
*dit programma vraagt om een naam en geboortedatum;
*laat de datum van de eerstvolgende mijlpaal uitrekenen
*door subprogramma's en drukt de berekende datum af.
*Andree Hollander; 1988/08/29

 data division.
 working-storage section.
 01 geboortedatum      pic x(06).
 01 mijlpaaldatum      pic x(06).
 01 huidige-datum      pic x(06).
 01 dagen-nu           pic 9(05).
 01 dagen-mijlpaal     pic 9(05).
 01 dagen-geboren      pic 9(05).
 01 dagen-oud          pic 9(05).
 01 duizendtal redefines dagen-oud pic 9(02).
*   duizendtal zijn de eerste twee posities van dagen-oud
 01 volgende-mijlpaal  pic 9(05).

 procedure division.
 structuur.
     perform gegevens-invoer
     perform berekeningen
     perform uitvoer
     stop run.

 gegevens-invoer.
     display "Eerstvolgende mijlpaal van een persoon."
     display "Geef geboortedatum in de vorm JJMMDD"
     accept geboortedatum
     accept huidige-datum from date.

 berekeningen.
     call "aantal-dagen" using
         by content huidige-datum 
         by reference dagen-nu
     call "aantal-dagen" using
         by content geboortedatum 
         by reference dagen-geboren
     compute dagen-oud = dagen-nu - dagen-geboren
     compute volgende-mijlpaal = (duizendtal + 1) * 1000
     compute dagen-mijlpaal = dagen-geboren + volgende-mijlpaal
     call "bereken-datum" using
         by reference mijlpaaldatum
         by content dagen-mijlpaal.

 uitvoer.
     display "Eerstvolgende mijlpaal is " 
         dagen-mijlpaal " dagen en wordt bereikt op "
         mijlpaaldatum.


 identification division.
 program-id. aantal-dagen.
*dit subprogramma ontvangt een datum en berekent het aantal 
*dagen dat op die datum verstreken is sinds 1 jan 1901.

 data division.
 working-storage section.
 01 maanddagen-tabel.
    03 maanddagen  pic 999, occurs 12 times.
 01 rest           pic 9.
 01 dummy          pic 99.
 linkage section.
 01 datum.
    03 jaar        pic 99.
    03 maand       pic 99.
    03 dag         pic 99.
 01 dagen          pic 99999.

 procedure division using datum, dagen.
 berekening.
     divide jaar by 4 giving dummy remainder rest
     if rest = 0 
     then   move "000031060091121152182213244274305335"
            to maanddagen-tabel
     else   move "000031059090120151181212243273304334"
            to maanddagen-tabel
     end-if
     compute dagen = (jaar - 01) * 365.25 
         + maanddagen(maand) + dag
     exit program.


 identification division.
 program-id. bereken-datum is initial program.
*dit subprogramma ontvangt een aantal dagen dat verstreken
*is sinds 1 jan 1901 en berekent de bijbehorende datum.

 data division.
 working-storage section.
 01 maanddagen-tabel value "312831303130313130313031"
    03 maanddagen  pic 99, occurs 12 times.
 01 rest           pic 9.
 01 tijdelijk      pic 99999.
 linkage section.
 01 datum.
    03 jaar        pic 99.
    03 maand       pic 99.
    03 dag         pic 99.
 01 dagen          pic 99999.

 procedure division using datum, dagen.
 berekening.
     compute jaar = dagen / 365.25 
     compute tijdelijk = jaar * 365.25
     compute dag = dagen - tijdelijk
     add 1 to jaar
     divide jaar by 4 giving tijdelijk remainder rest
     if rest = 0 then move 29 to maanddagen(2) end-if
     move 1 to maand
     perform with test before until dag < maanddagen(maand)
         subtract maanddagen(maand) from dag
         add 1 to maand
     end-perform
     exit program.
  
omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo