11.12 Voorbeeld: bankbiljetten

Bij een filiaal van een grote bankinstelling controleert men alle binnenkomende bankbiljetten. Het nummer van elk bankbiljet toetst men in. Er vinden twee controles plaats: voldoet het nummer aan de negenproef en komt het nummer voor in het signaleringsbestand.

Negenproef
Het nummer van een bankbiljet moet geheel uit cijfers bestaan en de som van de afzonderlijke cijfers moet een veelvoud zijn van 9.

illustratie: Geert Nijmolen

cartoon

Signaleringsbestand
Het signaleringsbestand bevat nummers van bankbiljetten waarmee iets bijzonders aan de hand is. Denk aan biljetten met een drukfout of biljetten die als losgeld zijn gebruikt. Elk record van het sequentiële bestand bevat een nummer van elf cijfers. Eventueel is een nul vooraf toegevoegd om aan elf cijfers te komen. De nummers liggen in dalende volgorde in het bestand (van hoog naar laag). Het aantal nummers is niet bekend, maar nooit groter dan 1000.

In- en uitvoer
Alle invoer en uitvoer vindt plaats via de standaardmedia. Het nummer van een bankbiljet vormt de invoer. Het bestaat uit tien of elf cijfers. Als het nummer uit tien cijfers bestaat, dan tikt men er een spatie achter. De invoer bestaat dus altijd uit elf tekens. Het programma sluit af bij een invoer van elf spaties. De uitvoer is 

Hierna volgt een COBOL-programma voor het geschetste probleem.


 IDENTIFICATION DIVISION.
 program-id. bankbiljetten.
**************************************************************
* dit programma controleert de nummers van bankbiljetten     *
* op negenproef en voorkomen in signaleringsbestand.         *
*                                                            *
* Gemaakt door Andree Hollander op 11 oktober 1988           *
**************************************************************
 ENVIRONMENT DIVISION.
 INPUT-OUTPUT SECTION.
 file-control.
     select signaleringsbestand assign to disk.
*
 DATA DIVISION.
 FILE SECTION.
 fd signaleringsbestand.
 01 sig-record       pic 9(11).
*
 WORKING-STORAGE SECTION.
 01 invoer.
    03 tien-cijfers  pic 9(10).
    03 laatste-teken pic X(01).
 01 elf-cijfers redefines invoer, pic 9(11).
*
 01 werkgetal        pic 9(11).
 01 werktabel redefines werkgetal.
    03 cijfer        pic 9, 
                     occurs 11 times, indexed by cijf-index.
*
 01 signaalaantal    pic 9999, value zero.
 01 signaleringstabel.
    03 signaalnummer occurs 0 to 1000 times,
                     depending on signaalaantal,
                     descending key is signaalnummer, 
                     indexed by sig-index,
                     pic 9(11).
*
 01 wissels.
    03 einde-bestand pic X value "N".
       88 end-of-file      value "J".
    03 fout-soort    pic X.
       88 geen-fout        value "G".
       88 niet-numeriek    value "N".
       88 negenproef-fout  value "9".
       88 gesignaleerd     value "S".
*
 01 rekenvelden.
    03 som           pic 99.
    03 uitkomst      pic 9.
    03 rest          pic 9.
*
 PROCEDURE DIVISION.
 basislus.
     perform vul-tabel;
     perform vraag-invoer;
     perform with test before until invoer = spaces
         set geen-fout to true;
         perform controle-numeriek;
         if niet-numeriek then
             display "NIET UITSLUITEND CIJFERS"
         else
             perform negenproef;
             if negenproef-fout then
                 display "NEGENPROEF FAALT"
             else
                 perform signalering;
                 if gesignaleerd then
                     display "GESIGNALEERD"
                 else
                     display "OK"
                 end-if;
             end-if;
         end-if;
         perform vraag-invoer;
     end perform;
     stop run.
*
 vraag-invoer.
     display space;
     display "Welk nummer? " with no advancing;
     accept invoer.
*
 controle-numeriek.
     if laatste-teken = space then
         if tien-cijfers is numeric then
             move tien-cijfers to werkgetal
         else
             set niet-numeric to true
         end-if;
     else
         if elf-cijfers is numeric then
             move elf-cijfers to werkgetal
         else
             set niet-numeric to true
         end-if;
     end-if.
*
 negenproef.
     move zero to som;
     perform with test after varying cijf-index
     from 1 by 1 until cijf-index = 11
         add cijfer(cijf-index) to som;
     end-perform;
     divide som by 9 giving uitkomst remainder rest;
     if rest not = zero then 
         set negenproef-fout to true
     end-if.
*
 signalering.
     search all signaalnummer
     when signaalnummer(sig-index) = werkgetal
         set gesignaleerd to true
     end-search.
*
 vul-tabel.
    open input signaleringsbestand;
    perform with test after until end-of-file
        read signaleringsbestand
        at end set end-of-file to true
        not at end
            add 1 to signaalaantal;
            move sig-record to signaalnummer(signaalaantal)
        end-read;
     end-perform;
     close signaleringsbestand.

  
omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 2

Auteur: Andree Hollander

naamlogo