Uitwerking even-oneven opdracht in PERL
Het even/oneven probleem is een mooi voorbeeld van hoe de juiste werkwijze leidt tot een goed programma.
Probleembeschrijving:
Wanneer is een getal even?
Het moet gaan over een geheel getal
Even getallen eindigen op een 2,4,6,8,of 0
Als je een even getal moduul deelt door 2 is er geen rest
Als je een even getal deelt door 2 komt er een geheel getal uit
In de probleembeschrijvig komt 2 maal de term geheel en getal voor, als je dat kunt bepalen heb je een oplossing.
Om vast te stellen of iets aan getal is kun je $getal/1, of $getal*1, $getal-0 of $getal+0 doen.
In typevaste talen is dit niet nodig omdat een variabele die niet aan de voorwaarden voldoet tot een foutmelding leidt.
Als je een integer declareert weet je zeker dat alleen dat geaccepteerd wordt.
In veel talen is invoer altijd een string en moet je er een getal van maken.
In de voorbeelden is de PERL-syntaxis gebruikt, maar het kan ook in de meeste andere talen.
Een geheel getal heeft geen komma of punt, je kunt met een reguliere expressie uitzoeken of er in de string een komma of punt voorkomt.
if ($getal =~ m/[.,]/ig){print "$getal is geen geheel getal";}else{doorgaan}
Letterlijk: als het ingevoerde getal een komma of een punt bevat dan ....
Op dezelfde manier kun je uitvinden of er niet-cijfers in de string voorkomen
if ($getal =~ m/\-d/ig){print "$getal is geen getal";}else{doorgaan}
Letterlijk: als het ingevoerde getal een niet-getal bevat dan ....
Je kunt met de int, trunc, ciel, round of floor functies het getal afronden en kijken of het gelijk is aan het oorspronkelijke getal.
int en trunc kappen het getal af na de komma (en ronden dus naar beneden af), ciel rondt naar boven af,
round rond af naar het dichtstbijzijnde gehele getal.
if (!ciel($getal) == $getal){print "$getal is geen geheel getal";}else{doorgaan}
Letterlijk: als het naar boven afgeronde getal niet glijk is aan het ingevoerde getal dan ....
Je kunt een moduuldeling uitvoeren en kijken of er een rest is (deze is fraai omdat de rest 0 of 1 is en dat is hetzelfde als waar / onwaar).
if ($getal%2){print "$getal dit is een even getal";}else{print "$getal dit is een oneven getal";}
Letterlijk: als er een rest is dan .....
Je kunt het laatste cijfer afsplitsen en controleren of het een 2,4,6,8,of 0 is.
if (right($getal,1) == 2 || right($getal,1) == 4 || right($getal,1) == 5 || right($getal,1) == 8 || right($getal,1) == 0))
{print "$getal dit is een even getal";}else{print "$getal dit is een oneven getal";}
Letterlijk :als het laatste cijfer gelijk is aan 2,4,6,8,of 0 dan .....
Veel talen hebben een odd / even functie
if (even($getal)){print "$getal dit is een even getal";}else{print "$getal dit is een oneven getal";}
Letterlijk: als het getal even is dan ...
Problemen ontstaan bij het cijfer 0, dat is volgens de meeste algoritmen een even getal, hoewel dit wiskundig niet juist zou zijn.
Ook de letter e kan leiden tot problemen die wordt gebruikt voor de wetenschappelijke notatie en is dus een geldig onderdeel van een getal,
gelukkig zijn die getallen altijd even (want veelvouden van 10) behalve bij e0 want dat is 1.
Voor gevorderde programmeurs voor wetenschappelijke toepassingen is er nog een probleem te overwinnen,
een oneven getal delen door 2 levert soms door de beperkte precisie van zelfs de double-precision-floating point number
geen 0,5 op maar 0,499999...(ongeveer 120 negens) die zullen moeten werken met typevaste talen.