Programmeren in REXX/Voorbeeld1: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
kGeen bewerkingssamenvatting
GuyDC (overleg | bijdragen)
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=13 /* De start van onze zoektocht */
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+2 to einde by 2 /* lus van start tot einde, per 2 */
9 | do j=12 to priem.0 /* lus over al gevonden priemgetallen */
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 j /* einde van lus j */
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 i /* einde van lus i */
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 13. Alle priemgetallen zijn namelijk onpaar, behalve het allereerste, namelijk 2. We zullen later enkel de onpare getallen onderzoeken, dus starten we onmiddellijk aan 3.
<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., Vermitsnamelijk 2 hetons enig mogelijk parepaar priemgetal is gaan we later de pare getallen niet meer onderzoeken. We moet het getal 2 dus wel expliciet vermelden.
<br>'''Lijn 6''': we definiëren de variabele ''z'' die zal dienen om de index van onze stem te verhogen.
<br>'''Lijn 87''': we mogen niet vergeten ons eerste priemgetal 2 te tonenook op het scherm... te tonen!
<br>'''Lijn 78''': nu starten we een lus. De variabele die als teller gebruikt wordt is '''i'''. De naam van deze variabele kan vrij gekozen worden, maar het is ietwat historisch dat variabelen i, j, k, l als eerste worden gekozen omdat in oorspronkelijke programmeertalen deze variabelen impliciet gehele getallen voorstelden. Een langere naam zou in dit geval ook alleen meer schrijfwerk betekenen.
 
We gaan in de lus blijven vanaf 2 meer dan onze '''start'''waarde (3) tot onze '''eind'''waarde (100). -En hetom priemgetalenkel 2de hebbenonpare we tenslotte al. Daar priemgetallen niet paargetallen kunnente zijnonderzoeken maken we de stap ook 2 groot.
 
<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 priemgetal dat we in ''j-de'' binnenste lus tegenkomenpriemgetal, 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 afafgaan teis gaandus nutteloos.
<br>'''Lijn 11''': hier testen we of het te onderzoeken getal (i) deelbaar is door het huidig''j-de'' 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 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''' 13 100 1 2 1 '''with''' start einde priem.0 priem.1 z
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 (13) ontvangen. En zo verder. Dus, met één regel kennen we een initiële waarde aan 5 variabelen toe.
 
En, het is niet alleen een kortere schrijfwijze, het komt de snelheid van uitvoering ook ten goede! REXX wordt op de meeste systemen als ''''interpreter'''' gebruikt. De broncode wordt namelijk niet gecompileerd tot machinetaal. Dit betekent dat REXX lijn voor lijn leest, interpreteert wat er staat, en als de syntax correct is, overgaat tot de uitvoering. Voor de mainframe besturingssystemen bestaan wel compilers.
 
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.
In ons geval hebben we 5 regels vervangen door één regel, dus de interpretatiestap is maar éénmaal nodig, zelfs al is hij ietwat complexer.
 
Desgevallend kan hetde meerleesbaarheid leesbaarals geschrevenvolgt verbeterd worden, als volgt:
parse value 13 100 1 2 1 with,
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.
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.