Programmeren in REXX/Voorbeeld1: verschil tussen versies
Verwijderde inhoud Toegevoegde inhoud
kGeen bewerkingssamenvatting |
Geen bewerkingssamenvatting |
||
Regel 1:
{{Programmeren in REXX}}
=Ons eerste programma=
Hier gaan we een eerste werkend voorbeeld van REXX programma bestuderen. We willen de priemgetallen tussen 1 en 100 opzoeken.
==Code==
1 | /* Berekenen priemgetallen tussen 1 en 100 */
2 | start=
3 | einde=100 /* Het einde van onze zoektocht*/
4 | priem.0=1 /* Definitie van stem en teller*/
Regel 9 ⟶ 11:
6 | z=1 /* onze priemgetallenteller */
7 | say 2 /* We tonen ons eerste priemgetal */
8 | do i=start
9 | do j=
10 | if i<priem.j**2 then leave j /* als voorbij kwadraat priem, verlaten we lus j */
11 | if i//priem.j=0 then iterate i /* als rest i/priem nul is, volgende zoeken */
12 | end
13 | z=z+1 /* 1 bij aan priemgetallenteller */
14 | priem.z=i /* toevoegen aan reeks */
15 | priem.0=z /* Element nul van stem aanpassen */
16 | say i /* we tonen het gevonden priemgetal */
17 | end
18 | say 'We hebben' z 'priemgetallen gevonden tussen' start 'en' einde
19 | exit /* einde van het programma */
In de eerste kolom hebben we lijnnummers gezet om naar te kunnen verwijzen. Ze maken geen deel uit van het programma.
==Bespreking==
'''Lijn 1''': een REXX programma moét met een commentaar beginnen. Het is een goede gewoonte hier op z'n minst te schrijven wat het programma doet. Er kan ook een auteur, creatiedatum en zelfs historiek aan toegevoegd worden.
<br>'''Lijn 2''': we definiëren de variabele ''start'' en geven ze de waarde
<br>'''Lijn 3''': we definiëren de variabele ''einde'' en geven ze de waarde 100, omdat we ons nu willen beperken tot de priemgetallen tot 100.
<br>'''Lijn 4''': in één enkele operatie creëren we een stem, ''priem.'' genaamd, en geven aan het element ''priem.0'' de waarde 1. De conventie wil namelijk dat we in het "nulde" element van een stem (array) bijhouden hoeveel elementen er in de stem zitten, en op
'''Lijn 5''' vullen we nu net dat eerste element van de stem op
<br>'''Lijn 6''': we definiëren de variabele ''z'' die zal dienen om de index van onze stem te verhogen.
<br>'''Lijn
<br>'''Lijn
We gaan in de lus blijven vanaf
<br>'''Lijn 9''': binnen de eerste lus beginnen we nu een tweede lus. We gaan (dank zij lusteller '''j''') alle reeds gekende priemgetallen af. Vermits we enkel onpare getallen onderzoeken moeten we echter ons allereerste priemgetal 2 niet meenemen, want deelbaar door 2 zal het nooit zijn.▼
▲'''Lijn 8''': we mogen niet vergeten ons eerste priemgetal 2 te tonen op het scherm...
▲<br>'''Lijn 9''': binnen de eerste lus beginnen we nu een tweede lus. We gaan (dank zij lusteller '''j''') alle reeds gekende priemgetallen af.
Merk hier op dat we de eerste maal een lus-definitie zullen hebben die resulteert in '''do j=2 to 1'''. Dit is helemaal OK voor REXX, en maakt dat de lus niet zal worden uitgevoerd.
<br>'''Lijn 10''': als nu blijkt dat het getal dat we aan het onderzoeken zijn (en dat in variabele i staat) kleiner is dan het kwadraat van het priemgetal dat we in de binnenste lus tegenkomen, dan kunnen we de j-lus verlaten, en hebben we een nieuw priemgetal gevonden. Het getal is dan inderdaad niet deelbaar geweest door één van de voorgaande priemgetallen (test van lijn 11), en het is nutteloos nog verder het rijtje priemgetallen af te gaan.▼
<br>'''Lijn 11''': hier testen we of het te onderzoeken getal (i) deelbaar is door het huidig priemgetal. We testen dit door na te gaan of de restdeling op nul uitkomt. Indien zo, dan hebben we geen priemgetal en kunnen we onmiddellijk naar het volgende te onderzoeken getal gaan, dus de rest van de i-lus overslaan en terug naar lijn 8 springen.▼
▲<br>'''Lijn 10''': als nu blijkt dat het getal dat we aan het onderzoeken zijn (en dat in variabele i staat) kleiner is dan het kwadraat van het
▲<br>'''Lijn 11''': hier testen we of het te onderzoeken getal (i) deelbaar is door het
<br>'''Lijn 12''' geeft het einde van de binnenste lus aan. Alhoewel niet nodig, is het een goede gewoonte de lusteller (j) als parameter mee te geven, zeker bij heel lange lussen. Dat maakt foutonderzoek gemakkelijker.
<br>'''Lijn 13''': als we hier zijn terechtgekomen, dan hebben we een priemgetal gevonden. We voegen dus één bij aan onze teller, zodat we op
'''lijn 14''' ons nieuw priemgetal kunnen toevoegen aan het ''z-de'' element van onze stem.
<br>'''Lijn 15''': als we vergeten ons element 0 aan te passen aan het juiste aantal elementen van de stem zal het later hopeloos mislopen.
<br>'''Lijn 16''': we tonen het gevonden priemgetal en kunnen het volgende getal gaan onderzoeken.
<br>'''Lijn 18''': we hebben nu alle getallen van 1 tot 100 onderzocht. Zowel variabele ''z'' als ''stem.0'' bevatten het aantal gevonden priemgetallen, dus een kleine moeite om dat aan de gebruiker te melden.
<br>'''Lijn 19''': we beëindigen het programma. We geven geen returncode mee, dus die zal steeds 0 zijn. In dit eenvoudig programmaatje is die '''exit''' eigenlijk zelfs niet écht nodig, maar het blijft toch een goede gewoonte er één te schrijven.
==Extra opmerkingen==
Het gebruik van variabele '''start''' en stem-element '''priem.0''' zijn in bovenstaand programma niet strikt nodig (o.a. omdat de variabele '''z''' ook al de teller bevat). Maar we gaan dit programma later nog verder uitbreiden, en dan komen die variabelen wel van pas.
Als eerste voorbeeld van de kracht van de '''PARSE''' instructie kunnen we melden dat de regels 2 tot 6 kunnen vervangen worden door
parse '''value'''
Vermits we hier een reeks tokens willen parsen mogen we het sleutelwoord '''with''' niet vergeten, anders is onduidelijk waar het sjabloon begint.
Het sjabloon is hier in zijn meest eenvoudige vorm, namelijk een reeks tokens, die variabelen zullen worden.
De eerste token van het sjabloon (start) zal het eerste woord van de bron (
En, het is niet alleen een kortere schrijfwijze, het kan de uitvoeringssnelheid ook ten goede komen! Het aantal interpretatiestappen wordt hierdoor namelijk met 4 verminderd, al is de interpretatie van deze ene lijn wel complexer en dus iets meer tijdrovend.
Desgevallend kan
parse value
start einde priem.0 priem.1 z
Of er nu één of meerdere blanco karakters tussen de woorden van de bron staan doet er in dit geval niet toe. Op deze manier wordt duidelijk welke waarde naar welke variabele gaat.
|