Programmeren in COBOL/Relatieve bestanden met hash: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Sephiroth (overleg | bijdragen)
Sephiroth (overleg | bijdragen)
kGeen bewerkingssamenvatting
Regel 21:
</pre>
}}
Dit bestand gaan we omzetten in een relatief bestand. Het bevat de namen van wiki's met hun omschrijvingen. De namen van de wiki's zullen we gebruiken als sleutel. In het relatief bestand zal zowel de naam als de omschrijving van de wiki staan. Hieronder is een voorbeeld van een programma die dit voor ons zal doen.
{{code
|Taal= COBOL
Regel 177:
</pre>
}}
De hash functie is juist gebeurt. We hebben dus een sleutel en we lezen vervolgens het relatief bestand. Dit is meteen de reden waarom we het geopend hebben als I-O we moeten het bestand ook lezen omdat we moeten zien of er al geen record op die plaats is. Als er geen record is op die plaats dan krijgen we een INVALID KEY hier ''slechtesleutel'' genaamd. INVALID KEY betekent hier ironisch genoeg dat het goed is want op de plaats van onze sleutel is er geen record dus kunnen we daar een record wegschrijven. Maar wat als er wel een record is? Hiervoor kunnen er 3 oorzaken zijn ofwel heeft toevallig een ander record dezelfde sleutel gekregen van de hashfunctie of hebben we het record al een keer weggeschreven of we hebben al 9 records weggeschreven. Aan de twee laatste kunnen we niet veel doen als het record al weggeschreven is maakt het niet veel uit en als we al 9 records hebben weggeschreven moeten we het programma aanpassen zodat we toch meer dan 9 records kunnen gebruiken. Als er toevallig een andere record hetzelfde sleutel heeft gekregen noemen we dat een botsing of collision. Dit is niet erg en het gebeurd vrijwel altijd. Het simpelste wat we kunnen doen om het op te lossen is gewoon één bij tellen bij de sleutel en het opnieuw te proberen, dit gebeurt in het deelprogramma botsing. Het is bijna gedaan want nu gaan we al terug naar het deelprogramma ''omzetten''.
{{beg}}code
|Taal= COBOL
|Titel=Omzetten.
|Code=
<pre>
OMZETTEN.
PERFORM zoeken
IF slechtesleutel
THEN
MOVE seqnaam TO relnaam
MOVE seqomschr TO relomschr
WRITE relwiki
END-IF
READ wikiseq NEXT AT END CONTINUE END-READ.
</pre>
}}
Onthoud INVALID KEY betekende in dit geval goed en daardoor is het veld ''slechtesleutel'' geactiveerd. Vervolgens gebeurd net hetzelfde als bij een gewoon relatief bestand. Schrijf alles weg en lees het volgende record van het sequentiële bestand. Als alle records zijn gelezen sluit de twee bestand en het programma heeft zijn werk gedaan.
 
==Relatief bestand met hash lezen==
Als je een relatief bestand met hash aanmaken onder de knie hebt moet dit niet zo moeilijk meer zijn. Jammer genoeg als je zeker wilt weten of je zo'n bestand perfect hebt kunnen maken moet je eerst ze ook kunnen lezen. Dit volgend programma leest dat bestand van het vorige stukje in. De gebruiker geeft de naam van de wiki en het programma geeft zijn omschrijving.
{{code
|Taal= COBOL
|Titel=Een relatief bestand met hash lezen.
|Code=
<pre>
IDENTIFICATION DIVISION.
PROGRAM-ID. Wiki.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
 
SELECT wikirel ASSIGN TO "wiki.uit"
ORGANIZATION RELATIVE
ACCESS DYNAMIC
RELATIVE KEY nummer.
 
DATA DIVISION.
FILE SECTION.
FD wikirel.
01 relwiki.
02 relnaam PIC X(11).
02 relomschr PIC X(50).
 
WORKING-STORAGE SECTION.
01 relstatus PIC XX.
88 eofrel VALUE '10'.
 
01 nummer pic 99.
01 wikinaam PIC X(11).
01 hulp PIC x(11).
01 wikinummer PIC 9(11).
01 kleineletters PIC X(27) VALUE 'abcdefghijklmnopqrstuvwxyz '.
01 hoofdletters PIC X(27) VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ '.
01 cijfers PIC X(27) VALUE '012345678901234567890123456'.
01 teller PIC 99.
 
PROCEDURE DIVISION.
HOOFD.
OPEN INPUT wikirel
ACCEPT wikinaam NO BEEP
PERFORM zoeken
CLOSE wikirel
STOP RUN.
 
ZOEKEN.
PERFORM hash
PERFORM varying teller FROM 1 BY 1 UNTIL teller > 9
READ wikirel END-READ
IF relnaam = wikinaam
THEN
DisplAY relomschr
MOVE 10 TO teller
ELSE
PERFORM botsing
END-IF
END-PERFORM.
 
HASH.
MOVE wikinaam to hulp
INSPECT hulp CONVERTING kleineletters to hoofdletters
INSPECT hulp CONVERTING hoofdletters TO cijfers
MOVE hulp TO wikinummer
DIVIDE wikinummer BY 9 GIVING wikinummer REMAINDER nummer
ADD 1 TO nummer.
 
botsing.
ADD 1 TO nummer.
IF nummer = 10
MOVE 1 TO nummer
END-IF.
</pre>
}}
 
[[Categorie:Programmeren in COBOL|Relatieve bestanden met hash]]
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.