> restart: # Beispiele fuer Programmverzweigungen # # 1. Beispiel: Rechter Winkel # Pruefung mit Pythagoras, ob das Dreieck mit den Ecken 1, 2, 3 # an der Ecke 1 einen rechten Winkel besitzt # # Zunaechst Verwendung exakter Zahlen > w:=sqrt(2); > dreieck:=[[0,0],[40*w,-40*w],[30*w,30*w],[0,0]]; > plot(dreieck,scaling=constrained); > nops(dreieck); > dreieck[2]; # Ecke 2 > dreieck[2,1]; dreieck[2,2]; # x- und y-Koordinaten der Ecke 2 # Quadrate der Seitenlaengen nach Pythagoras > aqu:=(dreieck[2,1]-dreieck[1,1])^2 + (dreieck[2,2]-dreieck[1,2])^2; > bqu:=(dreieck[3,1]-dreieck[1,1])^2 + (dreieck[3,2]-dreieck[1,2])^2; > cqu:=(dreieck[2,1]-dreieck[3,1])^2 + (dreieck[2,2]-dreieck[3,2])^2; > if aqu+bqu=cqu then > print("rechter Winkel") > else print("kein rechter Winkel") > end if; # # Jetzt Naeherung der exakten Eckkoordinaten durch Dezimalzahlen mit endlicher Stellenzahl # Diese numerische Rechnung liefert nicht die richtige Aussage: > restart: > w:=sqrt(2.0); > dreieck:=[[0,0],[40*w,-40*w],[30*w,30*w],[0,0]]; > aqu:=(dreieck[2,1]-dreieck[1,1])^2 + (dreieck[2,2]-dreieck[1,2])^2; > bqu:=(dreieck[3,1]-dreieck[1,1])^2 + (dreieck[3,2]-dreieck[1,2])^2; > cqu:=(dreieck[2,1]-dreieck[3,1])^2 + (dreieck[2,2]-dreieck[3,2])^2; > if aqu+bqu=cqu then > print("rechter Winkel") > else print("kein rechter Winkel") > end if; > # Der Grund fuer dieses Versagen ist das Auftreten eines Rundungsfehlers. # Der folgende Ausdruck ist naemlich jetzt nicht exakt gleich 0. > aqu+bqu-cqu; # Abhilfe: # Bei der numerischen Rechnung muessen Toleranzen eingefuehrt werden. # Statt aqu + bqu = cqu ? muss abgefragt werden | aqu+bqu-cqu| < epsilon ? > epsilon:=1.0E-3; # Festlegung der Toleranz > if abs(aqu+bqu-cqu) print("rechter Winkel") > else print("kein rechter Winkel") > end if; # Merke: Abfragen mit = oder <> sind nur zulaessig, wenn sie sich # auf ganze Zahlen beziehen, bei Dezimalzahlen muss dagegen immer mit einer (vom Anwender # unter Beachtung des Zusammenhanges) vorzugebenden Toleranz abgefragt werden. # Das zeigt auch gut das folgende # 2. Beispiel. > restart: # Untersuchung, ob ein Polygonzug ein Quadrat beschreibt # Es wird eine Boole'sche Variable vermutung eingefuehrt. Sie bringt die # Vermutung zum Ausdruck, der Polygonzug beschreibe ein Quadrat. # Hat sie am Ende aller Pruefungen den Wert false, dann war die Vermutung falsch. # Hier ein Beispielpolygon: > p:=[[0,0],[4,3],[1,7],[-3,4],[0,0]]; > plot(p,scaling=constrained); > eps:=1.0E-6;#Toleranz > vermutung:=true; # Probe, ob 5 Punkte angegeben sind und Anfangspunkt und Endpunkt # an derselben Stelle liegen: > if nops(p)<>5 or (p[nops(p),1]-p[1,1])^2+(p[nops(p),2]-p[1,2])^2>eps > then vermutung:=false end if: > vermutung; # Zwischenabfrage zur Kontrolle # Probe, ob die vier Seiten gleich lang sind: > for i to 4 do lqu:=(p[i+1,1]-p[i,1])^2+(p[i+1,2]-p[i,2])^2; > if i>1 and abs(lqu-lqualt)>eps > then vermutung:=false end if; > lqualt:=lqu > end do: > vermutung; # Zwischenabfrage zur Kontrolle # Probe, ob die Laengen beider Diagonalen gleich sind der Seitenlaenge mal Wurzel aus 2: > if abs((p[3,1]-p[1,1])^2+(p[3,2]-p[1,2])^2-2*lqu)>eps > or abs((p[4,1]-p[2,1])^2+(p[4,2]-p[2,2])^2-2*lqu)>eps > then vermutung:=false end if: > vermutung; # Zwischenabfrage zur Kontrolle # Ausgabe des Ergebnisses der Pruefung: > if vermutung=true then > print("Polygon ist ein Quadrat") > else > print("Polygon ist kein Quadrat") > end if;