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