© h.hofstede (h.hofstede@hogeland.nl)

De ABC-formule
 
Deze les gaan we een programma voor de ABC-formule maken.
Misschien denk je dat dat een makkie is, en maak je haastig het volgende programma:
       

       
Rechts staat jouw programma, midden en links laat jij mij trots zien dat het inderdaad werkt!!!!
En toch heb je een fout gemaakt.....
 
Probeer het maar eens met A = 1, B = 2 en C = 6.
Dan krijg je een foutmelding  "NONREAL ANS"
En als je 2: GOTO  indrukt kom je in je programma op de plaats van het zwarte blokje in de tweede figuur.

Zie je wat er fout is gegaan?

Je wilt de waarde van √(B2 - 4AC)  uitrekenen, maar als dat getal onder die wortel negatief is, dan bestaat die wortel niet!!!

Weet je het nog?  Bij de ABC formule zijn er drie mogelijkheden:
1.  D > 0  met twee oplossingen
2.  D = 0  met één oplossing
3.  D < 0  met geen oplossingen
       
Je wilt natuurlijk wel graag dat jouw programma met alle drie de mogelijkheden rekening houdt. Maar dat betekent dat je de gevallen  D > 0, D = 0, D < 0 apart moet bekijken:  je zult het programma moeten splitsen, afhankelijk van de waarde van D.
Dat kan met de commando's    IF.....THEN...... ELSE......END
Of, iets schematischer: 
       
 IF (A) THEN (B)  ELSE (C) END
       
Hoe werkt het?

•  Op de plaats van A kun je een voorwaarde  neerzetten  (bijvoorbeeld  D > 0)
•  Als die voorwaarde klopt dan worden de opdrachten B uitgevoerd en gaan we naar END
•  Als die voorwaarde niet klopt dan worden de opdrachten C uitgevoerd en gaan we naar END

Laten we nadat we D hebben uitgerekend daarom eerst maar eens testen of D misschien negatief is, want dan is er geen oplossing.  Dat gaat zo:

Die  "<" bij D < 0  vind je bij   2nd    TEST    5:  <

Als de discriminant kleiner dan nul is, dan wordt er de melding "geen oplossing" gegeven en gaan we naar END.

Tussen Else en End bij die rode pijl komt de rest van het programma, en daarin weten we dus nu zeker dat de discriminant niet kleiner dan nul is.

Nou, laten we in die rest van het programma dan nu maar eens testen of de discriminant misschien precies nul is.

     
Dat is hiernaast gebeurd. Ik stap even af van de rekenmachineschermpjes om het hele programma wat overzichtelijker te maken.   Bovendien kun je dan door in te springen beter laten zien welke IF-THEN-ELSE-END bij elkaar horen. Dat zie je hiernaast weergegeven

Daar bij die rode pijl komt nu de rest van het programma waarvoor we nu weten dat D > 0 dus dat er twee oplossingen zijn.

 
PROGRAM: ABC
: ClrHome
: Prompt  A, B, C
: B^2-4AC
D
: If  D < 0
: Then  Disp "geen oplossing"
: Else
:     If  D = 0
:     Then  -B/(2A)
X
:     Disp  "1 oplossing",X
:     Else
:    
:     End
: End
       
Hiernaast is ook die rest van het programma toegevoegd (de twee oplossingen).  Merk nog even op dat door dat inspringen direct duidelijk is welke END bij welke IF THEN ELSE hoort. Vooral bij erg grote programma's helpt je dat om het overzicht te behouden.

Nou, dat lijkt zo een mooi compleet programma geworden !

Kan er nog iets fout gaan?
Is er nog iets waarmee we geen rekening hebben gehouden?

Jazeker; het zou kunnen dat één of andere sukkel probeert ons ABC-formule programma te gebruiken met a = 0. Jij en ik weten dat het dan een gewone lineaire vergelijking is, maar dat weet die sukkel kennelijk niet.

 
PROGRAM: ABC
: ClrHome
: Prompt  A, B, C
: B^2-4AC
D
: If  D < 0
: Then  Disp "geen oplossing"
: Else
:     If  D = 0
:     Then  -B/(2A)
X
:          Disp  "1 oplossing",X
:     Else
:    
     (-B - (D))/(2A)
  X
:          (-B +
(D))/(2A)
Y
:          Disp "2 oplossingen", X, Y
:     End
: End
       
Daarom zou je kunnen overwegen om eerst A te laten invoeren en dan even te testen of die niet nul is.

Dat is hiernaast gebeurd.
Nu kan er niets meer misgaan.


(Je zou trouwens kunnen overwegen om in het geval van a = 0 de lineaire vergelijking ook gewoon op te lossen). 
PROGRAM: ABC
: ClrHome
: Prompt  A
: If A = 0
: Then Disp: "een lineaire
   vergelijking, sukkel!": STOP
: Else
:       Prompt B, C
:       B^2-4AC
D
:       If  D < 0
:       Then  Disp "geen oplossing"
:       Else
:               If  D = 0
:               Then  -B/(2A)
X
:                   Disp  "1 oplossing",X
:               Else
:    
              (-B - (D))/(2A)
  X
:                   (-B +
(D))/(2A)
Y
:                   Disp "2 oplossingen", X, Y
:               End
:       End
: End

 

Een Stroomdiagram

   
Als jouw programma's steeds maar groter en ingewikkelder worden, dan wil een stroomdiagram nog wel eens een handig hulpje zijn om de zaken duidelijk te houden.

Hiernaast zie je een stroomdiagram voor het ABC-formule programma dat we in deze les hebben gemaakt.

Volg de pijlen maar en kijk of je snapt wat er gebeurt!

Bij die blauwe vakken splitst het programma want daar wordt een vraag gesteld.

Bij die groene vakken is er een uitvoer naar het scherm.

Ik hoop dat je met me eens bent dat dit een mooie overzichtelijke manier is om de structuur van een programma weer te geven. Nou was dit nog een vrij makkelijk programma, maar bij erg ingewikkelde programma's kun je je misschien voorstellen dat zo'n stroomdiagram je helpt om overzicht te houden.
     

menu

for.... end

       
       
  OPGAVEN
       
1. Pas het ABC-programma hierboven aan zodat ook lineaire vergelijkingen worden opgelost.
       
2. Schrijf een programma dat drie in te voeren getallen op volgorde van klein naar groot weer uitvoert. Gebruik het stroomdiagram hieronder
       
 

       
3. Schrijf een programma dat vraagt de drie zijden van een driehoek in te voeren, en dat daarna onderzoekt of de driehoek een rechte hoek heeft  (bedenk dat een driehoek rechthoekig is als de stelling van Pythagoras geldt!).
       
       
     
       

© h.hofstede (h.hofstede@hogeland.nl)