Documentatie
Programmeerstructuren
Overzicht
Basisinstructies
Programmeerstructuren
- commentaar
- herhalingen
- als-structuren
- logische expressies
- procedures
- rekenen
- variabelen
- einde
Voorbeeld programma's
Lego NXT support
Lego EV3 support
Sparki support
FAQs
Meer

Programmeerstructuren

Hieronder volgen de verschillende structuren die toegestaan zijn om het gedrag van de robot te programmeren.

Commentaar

# tekst die niet door de robot gelezen wordt
alle tekst in een programma dat na het hekje, '#', staat wordt niet geinterpreteerd als instructies. Pas op de volgende regel worden de instructies weer gelezen door de robot. Gebruik deze mogelijkheid om een programma desgewenst te voorzien van extra informatie.

Herhalingen

herhaal(n){...instructies...}
herhaalt de instructies tussen accolades precies n keer.

Voorbeeld:

# een 2x2 vierkantje
herhaal(4)
{
    vooruit(2)
    rechts
}
                  

herhaal{...instructies...}
blijft de instructies tussen accolades telkens herhalen.

Voorbeeld:

# blijf alsmaar rechtdoor gaan
# (zal uiteindelijk blijven botsen)
herhaal
{
    vooruit
}

herhaalZolang(conditie){...instructies...}
herhaalt de instructies tussen accolades net zo lang totdat de conditie niet meer opgaat. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv. voorIsVrij)

Voorbeeld:

# blijf rechtdoor gaan, totdat je niet verder kunt
herhaalZolang(voorIsObstakel)
{
    vooruit(1)
}

doorbreekLus
zorgt ervoor dat de lus waar deze instructie in staat wordt beëindigd, en er wordt verder gegaan met de eerste instructie na deze lus.

Voorbeeld:

# blijf rechtdoor gaan, totdat je niet verder kunt
herhaal
{
    als(voorIsObstakel)
    {
        doorbreekLus
    }
    anders
    {
        vooruit(1)
    }
}

 

Als-structuren

als(conditie){...instructies...}
voert de instructies tussen accolades alleen uit als de conditie opgaat. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv. voorIsVrij)

Voorbeeld:

# als je links een witte stip ziet, maak hem zwart
als(linksIsWit)
{
    links
    vooruit(1)
    verfWit
    stopVerven
    achteruit(1)
    rechts
}
                  

als(conditie){...instructies...}anders{...instructies...}
voert de instructies tussen het eerste paar accolades alleen uit als de conditie opgaat, anders voert het alleen de instructies uit tussen het tweede paar accolades. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv. voorIsVrij)

Voorbeeld:

# als je links een witte stip ziet, maak hem zwart,
# rij anders een stukje door;
als(linksIsWit)
{
    links
    vooruit(1)
    verfZwart
    stopVerven
    achteruit(1)
    rechts
}
anders
{
    vooruit(1)
}
als(conditie){...instructies...} anders als {...instructies...}
is de makkelijkere notatie zonder extra accolades voor: als(conditie){...instructies...} anders { als {...instructies...}}. Het codeblok van anders wordt alleen uitgevoerd als zijn overeenkomende conditie het geval is. Deze constructie is met name nuttig wanneer er meerdere verschillende gevallen moeten worden gecontroleerd en uitgevoerd. In het voorbeeld volgt de robot een stapje een witte lijn op de grond.
als(voorIsWit)
{
    # alleen als voor is wit
    vooruit(1)
}
anders als(rechtsIsWit)
{
    # alleen als rechts is wit
    rechts
    vooruit(1)
}
anders als(linksIsWit)
{
    # alleen als links is wit
    links
    vooruit(1)
}
anders
{
    # alleen als ALLE voorgaande condities niet het geval waren
    rechts
    rechts
    vooruit
} 

 

Logische expressies

De conditie van als- en herhaalZolang-structuren zijn zogenaamde logische expressies. Deze expressies zijn een voorwaarde die de waarden waar of onwaar aannemen, waarna naar het overeenkomende deel van de code kan worden gesprongen alvorens de uitvoering te hervatten .

Een logische expressie kan een van de waarnemingsintructies zijn, zoals bijvoorbeeld linksIsWit. Basis instructies kunnen ook worden samengevoegd met de booleaanse operatoren niet, en, of.

Voorbeeld:

# als je links een witte stip ziet, maak hem zwart
als(linksIsWit)
{
    links
    vooruit(1)
    verfWit
    stopVerven
    achteruit(1)
    rechts
}
                  

De conditie kan echter ook verfijnt worden om precieser aan te geven wanneer de bijbehoren instructies moeten worden uitgevoerd met een van de volgende operatoren.

Operatie
Alternatieve
notatie
Aantal
argumenten
Uitleg
niet ~ 1

Keert de waarde van het argument om:

Waarheidstabel:
niet waar = onwaar
niet onwaar = waar

Voorbeeld:
niet voorIsVrij

en & 2

Alleen waar als beide argumenten waar zijn.

Waarheidstabel:
waar en waar = waar
waar en onwaar = onwaar
onwaar en waar = onwaar
onwaar en onwaar = onwaar

Voorbeeld:
voorIsVrij en rechtsIsWit

of | 2

Waar als minstens één van beide argumenten waar is.

Waarheidstabel:
waar of waar = waar
waar of onwaar = waar
onwaar en waar = waar
onwaar en onwaar = onwaar

Voorbeeld:
voorIsVrij of rechtsIsWit

De waarden waar en onwaar kunnen ook direct worden gebruikt net als een waarnemingsinstructie.

De volgorde van deze operatoren is van belang (net zoals bij vermenigvuldigen en optellen). De operatie niet bindt het sterkst, gevolgd door en, gevolgd door of. Er kunnen haakjes worden gebruikt om de volgorde naar wens aan te passen.

Voorbeelden:

herhaalZolang(niet voorIsVrij en (linksIsWit of rechtsIsWit)){
	vooruit(1)
}

als(kopOfMunt en niet rechtsIsWit)
{
    rechts
    achteruit(1)
}

als(waar en onwaar){
	#deze instructie wordt nooit uitgevoerd
	vooruit(1)
}
 

Getallen vergelijken
Een andere vorm van logische expressies is het vergelijken van getallen. Je kan hiermee een beslissing maken op basis van een bepaalde waarde. Bijvoorbeeld: ga alleen naar rechts als een variabele minder is dan 5.

Voorbeeld:

vooruit
misschienRechts(8)
vooruit

procedure misschienRechts(n){
    als(n < 5){
        rechts
    }
}
            
Dit is de volledige lijst van vergelijkingsoperaties.
Operatie Voorbeeld: waar Voorbeeld: onwaar Uitleg
== 3 == 3 1 == 2 Controleer gelijkheid
~= 1 ~= 2 3 == 3 Controleer ongelijkheid
< 1 < 2 3 < 3 Vergelijk getallen met "kleiner dan"
<= 3 <= 3 2 <= 1 Vergelijk getallen met "kleiner dan of gelijk aan"
> 2 > 1 3 > 3 Vergelijk getallen met "groter dan"
>= 3 >= 3 1 >= 2 Vergelijk getallen met "groter dan of gelijk aan"

Procedures

procedure naam(par1, par2, ..., parN){...instructies...}
definieert een nieuwe procedure met een zelf gekozen naam. De procedure kan beschikken over een aantal parameters die hier par1, par2, . . . , parN worden genoemd. Dit zijn de namen van de variabelen die je wilt gebruiken in de instructies die tussen accolades staan.

Voorbeeld:

# definieer het tekenen van een rechthoek
procedure rechthoek(breedte, hoogte)
{
    verfWit
    herhaal(2)
    {
        vooruit(hoogte)
        rechts
        vooruit(breedte)
        rechts
    }
    stopVerven
}

naam(arg1, arg2, . . . , argN)
is de aanroep van de procedure met dezelfde naam en hetzelfde aantal parameters. De argumenten arg1, arg2, . . . , argN zijn de concrete waarden voor de parameters in de proceduredefinitie.

Voorbeeld:

vooruit(1)
rechthoek(3,2) # de aanroep gebruikt de bovenstaande definitie
vooruit(3)
rechthoek(1,4) # nog een aanroep, nu met andere argumenten

retourneer
zorgt ervoor dat de uitvoer van de huidige procedure wordt afgebroken. De uitvoer zal worden hervat bij de eerste insructie na de procedure-aanroep. Op deze manier is het mogelijk slechts een eerste deel van de procedure te laten uitvoeren.

piet
# hier gaat de uitvoer verder nadat 'piet' is voltooid
links
vooruit(1)


procedure piet
{
    vooruit(5)
    als(voorIsObstakel)
    {
        # breek de uitvoer van deze procedure af
        retourneer
    }
    vooruit(3)
}

retourneer(arg)
zorgt ervoor dat de uitvoer van de huidige procedure wordt afgebroken. De uitvoer zal worden hervat bij de eerste insructie na de procedure-aanroep. Op deze manier is het mogelijk slechts een eerste deel van de procedure te laten uitvoeren.

Standaard retourneert een procedure het getal nul. Je kan een andere waarde teruggeven door hier een expressie op te geven.

Voorbeeld:

vooruit(verdubbel(3))

# verdubbel het gegeven aantal
procedure verdubbel(n)
{
    retourneer(2 * n)
}                  

Recursie
Een procedure kan recursief worden gedefinieerd. Dat betekend dat je definieert wat er in een procedure moet gebeuren in termen van zichzelf door hem aan te roepen. Het is eerst lastig om te begrijpen, maar je kunt er soms mooie oplossingen mee maken.

Voorbeeld:

# voer de volgende instructies uit
naarMuur()
rechts
vooruit

# ga vooruit totdat je een muur tegenkomt
procedure naarMuur()
{
      # NB: er worden geen herhaal-
      # lussen gebruikt.
      als(voorIsObstakel)
      {
          # stop "naarMuur" procedure
          retourneer
      }
      anders{
          # doe een stap
          vooruit
          # en doe een recursieve aanroep!
          naarMuur()
      }
}                 

Rekenen

+,-,*,/
Met deze operaties kan je getallen optellen, aftrekken, vermenigvuldigen en delen. Let op: je kunt alleen rekenen met gehele getallen.

Voorbeeld:

# gebruik wat berekeningen
vooruit(2+3)
als(3*4 < 13){
    x = 3
    links(x-2)
}
achteruit(-(3+4)/2)
                  

Variabelen

x = ...
Met variabele kan je waarden onthouden onder een zelfgekozen naam. Variabelen kan je vervolgens verderop in het script gebruiken. Je kan later bij de opgeslagen waarde door de naam te gebruiken. Je kan waarden uit alle expressies opslaan (dus: getallen, berekeningen, logische expressies, geretourneerde waarden).

Voorbeeld:

# sla een getal op
x = 42

# sla nog een getal op, gebaseerd op x
y = x / 2

# sla een logische waarde op
vrij = linksIsVrij & voorIsVrij & rechtsIsVrij

# sla het werkelijk aantal stappen op dat je vooruit
# bent gegaan totdat je botste
# (wordt geretoureerd door  "vooruit")
echt = vooruit(100)

als(vrij){
     rechts(2)
     vooruit(echt) # ga terug
}
links(y)

                  

Einde

einde
zorgt ervoor dat het hele programma direct stopt met de uitvoer als deze instructie wordt bereikt.

Voorbeeld:

# stop na 5 stappen, of eerder als je rechts een baken ziet
herhaal(5)
{
	vooruit(1)
	als(rechtsIsBaken)
	{
		einde # breek het programma af
	}
}
# normaal einde van het programma
                  

 

RoboMind - Copyright © 2005 - 2016 - Research Kitchen