Informaticasite van het Sondervick College te Veldhoven                 © L.J.M van Haperen (bron : R.J. van der Beek)
 

Hoofdstuk 6 Programmeren in Pascal

6.3. Procedures, soorten variabelen

  6.3.1 Procedures

Een procedure is eigenlijk een programmaatje in een programma.
Een procedure tik je in voor het eigenlijke hoofdprogramma, en na de declaraties.
Of eigenlijk hoort het bij de declaraties: je moet de procedure declareren. Dat betekent: je moet uitleggen wat er moet gebeuren, als die procedure uitgevoerd moet worden.

Tik het volgende programma over, laat het lopen en lees de uitleg eronder door.

PROGRAM  proc;
VAR p , q : INTEGER;
        naam : STRING;

{ Nu komen eerst de procedures , dat zijn ook declaraties ;
 let op de verschillende soorten variabelen }

PROCEDURE tienxnaam;                                      
VAR i:integer;                                           
BEGIN                                                    
   FOR I:=1 TO 10 DO WRITELN('Piet de Boer'); 
END; 

PROCEDURE sommetje(g1, g2 : integer);
VAR a : integer;
BEGIN
    WRITE (g1 , ' + ' , g2 , ' = ' );
    READLN(a);
    IF (a = g1+g2) THEN 
           WRITELN( ' Goedzo !! ') 
           ELSE  
           WRITELN( ' Nee stomkop ! ');
END;

PROCEDURE geefnaam(VAR n : string);
BEGIN
   WRITE(' Geef je naam : ');
   READLN(n);
END;

{ Hoofdprogramma }                                                                    
BEGIN
    clrscr;
    tienxnaam;
    writeln;
    sommetje(17,28); 
    tienxnaam;
    geefnaam(naam);
    writeln('Hallo ',naam,' je krijgt nog een sommetje: ');
    p:=5 ; q:=7;
    sommetje(p,q);
END.

Uitleg:

Je ziet een aantal dingen tussen accolades staan. Die staan er alleen ter verduidelijking tussen. Het wordt commentaar genoemd.
De computer slaat bij het compileren alles wat tussen accolades staat over.

Na de declaraties van de variabelen, die in het hoofdprogramma worden gebruikt, worden er drie procedures gedeclareerd.
De tweede procedure-declaratie ziet er zó uit:

PROCEDURE sommetje(g1, g2 : integer);
VAR a : INTEGER;
BEGIN
            ------------------------------------- (hier staan de
            ------------------------------------- opdrachten)
END;

Je ziet dat een procedure er net zo uit ziet als een programma.
Er zijn twee verschillen.
  • Als je de opdracht SOMMETJE (17 , 28) wilt kunnen gebruiken, dus met twee getallen tussen haakjes achter het woord SOMMETJE, dan moeten in de procedure de variabelen g1 en g2 (die horen bij de getallen 17 en 28) ook gedeclareerd worden tussen haakjes achter het woord SOMMETJE, en zonder het woord VAR er voor.
    Die g1 en g2 worden parameters genoemd.
    De getallen 17 en 28 worden dan "meegegeven"aan de procedure.
    Dit wordt call by value genoemd, en de parameters worden value-parameters genoemd.
    Als er nog meer variabelen in de procedure gebruikt worden, dan moeten die zoals normaal in een programma gedeclareerd worden.
  • Na het laatste END van de procedure geen punt, maar een puntkomma.

Waarom procedures gebruiken?

  • Procedures maken een programma overzichtelijker.
  • Als je het hoofdprogramma doorleest heb je vaak al redelijk goed in de gaten wat er gebeurt, omdat er voor de procedures meestal namen gekozen worden, die goed aangeven wat ze doen.
  • Verder kun je in verschillende programma's vaak procedures gebruiken, die je al eerder hebt gebruikt.

  6.3.2 Een menu

Vaak krijg je, als je een programma opstart, een menu waarbij je uit een aantal dingen kunt kiezen.
Die verschillende dingen zijn dan vaak uitgewerkt in procedures.

Zo'n menu zit in het volgende programma. Tik het over, laat het lopen en lees de uitleg eronder door.

PROGRAM  menu;
VAR k : INTEGER;

PROCEDURE som;
VAR g1, g2, a : integer;
BEGIN
    CLRSCR;
    RANDOMIZE;
    g1:=RANDOM(10)+10;
    g2:=RANDOM(10)+10;
    WRITE (g1 , ' + ' , g2 , ' = ' );
    READLN(a);
    IF (a = g1+g2) THEN 
           WRITELN( ' Goedzo !! ') 
           ELSE  
           WRITELN( ' Fout, het is ',g1+g2);
    repeat until keypressed;
END;

PROCEDURE dobbelen;
VAR i,d,aantal:integer;
BEGIN
   CLRSCR;
   WRITELN('Ik gooi 100 keer met een dobbelsteen, en tel de zessen');
   RANDOMIZE;
   FOR i:=1 to 100 DO
   BEGIN
       d:=RANDOM(6)+1;
       WRITE(d);
       IF (d=6) then aantal:=aantal+1;
   END;
   WRITELN; WRITELN('Het aantal zessen is ',aantal);
   repeat until keypressed;
END;
                                                          
BEGIN
    REPEAT
	clrscr;
	WRITELN('1 = Een sommetje');
	WRITELN('2 = Dobbelen');
	WRITELN('3 = Stoppen');
	Repeat
	    WRITE('Maak je keuze: 1, 2 of 3: ');
	    READLN(k)
	until ((k=1) or (k=2) or (k=3));
	IF (k=1) THEN som;
	IF (k=2) THEN dobbelen;
    UNTIL (k=3);
END.

Uitleg:

Als je het programma start krijg je een menu te zien: je kunt kiezen uit:
1=Een sommetje, 2=Dobbelen en 3=Stoppen.
Als je 1 uitkiest dan wordt de procedure SOM uitgevoerd.
Als je 2 kiest dan wordt de procedure DOBBELEN uitgevoerd.
Als je 3 kiest dan wordt er gestopt. Dat zie je nergens staan, maar toch gebeurt het.
Dat komt doordat er in de eerste regel (na BEGIN) REPEAT staat, en in de laatste regel (voor END.) UNTIL (k=3)
Alles daartussen wordt steeds herhaald, tot k gelijk aan 3 is. Dus als er voor 3 wordt gekozen (dan krijgt k de waarde 3) dan wordt er niet meer herhaald, dus dan wordt er gestopt.

Als je iets anders dan 1, 2 of 3 kiest dan moet je opnieuw kiezen, net zolang tot je wel 1, 2 of 3 kiest.
Dat komt door de opdrachten:
Repeat
      WRITELN('Maak je keuze: 1, 2 of 3: ');
      READLN(k)
until ((k=1) or (k=2) or (k=3));
Die opdrachten worden net zolang herhaald tot er geldt: (k=1) or (k=2) or (k=3), dus tot k=1, 2 of 3!

De laatste regel van de twee procedures is steeds:
repeat until keypressed;
Dat heeft tot gevolg dat er gewacht wordt met het vervolg van het programma, tot er een toets wordt ingedrukt.
Als die opdracht er niet bij zou staan, dan zou het programma direkt verdergaan. En dan zou de tekst, die op het scherm stond, direkt weer worden weggeveegd omdat de eerstvolgende opdracht dan clrscr; is. Dat is namelijk de eerste opdracht na REPEAT in het hoofdprogramma, en als een procedure is uitgevoerd wordt er weer naar die regel gesprongen.

Opgaven.
Maak nu opgave 15 van hoofdstuk 6 (Pascal)

  6.3.3 Verschillende soorten variabelen

De namen van de variabelen in procedures mogen hele andere zijn, dan die in het hoofdprogramma worden gebruikt. Maar het mogen ook wel dezelfde zijn. Als ze in de procedure gedeclareerd worden, dan worden er toch aparte geheugenplaatsen voor gereserveerd.
Dus als je een variabele i in het hoofdprogramma gebruikt, en ook een i in een procedure, dan hebben die niet automatisch dezelfde waarde. Ze worden eigenlijk als twee verschillende variabelen opgevat.
  1. De variabelen die in een procedure gebruikt worden, en daarin ook gedeclareerd worden, zijn zogenaamde "lokale" variabelen.
    Zo'n variabele kan alleen binnen die procedure worden gebruikt.

  2. De variabelen die in het hoofdprogramma worden gedeclareerd zijn zogenaamde "globale" variabelen.
    Zo'n variabele kan overal worden gebruikt, dus ook binnen procedures.
    Maar het is verstandig zo weinig mogelijke globale variabelen te gebruiken.

  3. De vijfde procedure begint met : PROCEDURE geefnaam(VAR n:STRING);
    Tussen haakjes achter de procedure-naam staat de variabele n van het type string, met het woordje VAR er voor. Dat heeft tot gevolg dat die string na afloop van de procedure aan het hoofdprogramma wordt doorgegeven. In alle andere gevallen is de waarde van de variabele (nadat de procedure is uitgevoerd) weg !

    Dit gebruik van een variabele (zoals in geefnaam(n) ) wordt call by reference genoemd.
    En de parameter n wordt een variable-parameter genoemd.
    Als de waarde van x in de procedure is veranderd dan is die veranderde waarde ook nog bekend in het programma als de procedure is afgelopen.

  4. Het gebruik van een variabele zoals in sommetje(a, b) wordt call by value genoemd.
    Als de waarde van a of b in de procedure wordt veranderd dan is die veranderde waarde niet bekend in het programma als de procedure is afgelopen.

  6.3.4 Programma's compileren

Als je een programma laat lopen, dus voor RUN kiest, dan wordt het programma eerst "vertaald in machinetaal".
Als je een heel groot programma hebt, dan merk je dat duidelijk. Dan moet je eerst een poosje wachten.
En als er een fout in het programma zit, dan begint het programma niet te lopen, maar dan wordt die fout gemeld. En dan moet je die eerst verbeteren.
Dat "vertalen in machinetaal" wordt "compileren" genoemd.
En een programma dat dat doet wordt een compiler genoemd.
Pas nadat het helemaal vertaald is begint het programma echt te lopen.

Je kunt zo'n programma ook draaien zonder dat je IriePascal inlaadt.
Als je een programma gesaved hebt (klik op File, en dan op Save) , dan wordt het programma dat je zelf geschreven hebt (en de extensie daarvan is PAS) bewaard, en niet het machinetaal-programma.
Als je het programma gecompileerd hebt (klik op Project, en dan op Compile) , dan wordt het machinetaal-programma op schijf gezet.
Dat krijgt de zelfde naam als het ingetypte Pascal-programma, maar met de extensie EXE.
Tenminste, als je dat vantevoren hebt aangegeven. Je moet dan eerst, in de menubalk, klikken op Edit, en dan op Preferences.
in het venster, dat dan verschijnt, moet je klikken op het tabblad Executable.
Dan moet je een vinkje zetten voor File mode.
En in het invulvenster achter Extension moet je exe uitkiezen, en dan op OK klikken.



Als je dat gedaan hebt, en je compileert het programma, dan wordt het machinetaal-programma op schijf gezet onder dezelfde naam maar met de extensie exe.
Als je dat bestand opzoekt m.b.v. de Verkenner, en er op dubbelklikt, dan start het programma.