MODULE FlaechenInhaltProc; FROM InOut IMPORT ReadCard, WriteString, WriteInt, WriteLn; FROM RealInOut IMPORT ReadReal, WriteFloat; FROM MathLib IMPORT sqrt; (* * -- Programm zur Berechnung des Flaecheninhalts elementarer * -- geometrischer Figuren (diesmal mit Prozeduren !) *) TYPE Position = RECORD x, y : REAL END; geoTyp = (Dreieck, Rechteck, Kreis, Ellipse); geoFigur = RECORD pos : Position; (* Lage der Figur *) CASE typ : geoTyp OF Dreieck : (* 3 Ecken *) (* A : pos *) posB, posC : Position | Rechteck : (* 1 Ecken + 2 Seitenlaengen *) (* A : pos *) hoehe, breite : REAL | Kreis : (* Zentrum + Radius *) (* c : pos *) rad : REAL | Ellipse : (* 2 Brennpunkte + Achse *) (* 1. Brennpunkt : pos *) F : Position; ha : REAL (* 2a = grosse Achse *) ELSE (* leer *) END END; VAR figur : geoFigur; PROCEDURE Flaeche( figur : geoFigur) : REAL; CONST pi = 3.141592; VAR la, lb, lc, lp, flaeche : REAL; PROCEDURE Laenge( a, b : Position) : REAL; VAR hor, ver : REAL; BEGIN hor := a.x - b.x; ver := a.y - b.y; RETURN sqrt(hor * hor + ver * ver) END Laenge; BEGIN (* * -- ------------------------------------------ * -- Berechnen der Flaeche der gewaehlten Figur * -- ------------------------------------------ *) WITH figur DO CASE typ OF Dreieck : (* Heronische Flaechenformel: * flaeche = sqrt(p (p-a) (p-b) (p-c)) * mit p = 1/2 (a + b + c) *) la := Laenge(pos, posB); lb := Laenge(posB, posC); lc := Laenge(posC, pos); lp := 0.5 * (la + lb + lc); flaeche := sqrt(lp * (lp-la) * (lp-lb) * (lp-lc)) | Rechteck : flaeche := hoehe * breite | Kreis : flaeche := pi * rad * rad | Ellipse : lc := 0.5 * Laenge(pos, F); lb := sqrt(ha*ha - lc*lc); flaeche := pi * ha * lb ELSE flaeche := 0.0; WriteString("** unbekannter Figurtyp ! **"); WriteString("(flaeche = "); WriteFloat(flaeche, 4, 2); WriteString(")"); WriteLn END (* CASE *) END; (* WITH *) RETURN flaeche END Flaeche; PROCEDURE FigurEingabe( VAR figur : geoFigur); VAR t : CARDINAL; PROCEDURE ReadPos( VAR pos : Position); BEGIN WriteString("Position eingeben : "); WriteLn; WITH pos DO WriteString(" x ? "); ReadReal(x); WriteString(" y ? "); ReadReal(y); WriteLn END END ReadPos; BEGIN (* * -- ------------------- * -- Eingabe einer Figur * -- ------------------- *) WriteString("Figur eingeben ... "); WriteString("Typ: 0 (3Eck), 1 (4Eck), 2 (Kreis), 3 (Ellipse) : "); ReadCard(t); WriteLn; IF (t < 0) OR (t > 3) THEN (* set default value to 1 !! *) t := 1 END; WITH figur DO typ := VAL(geoTyp, t); ReadPos(pos); CASE typ OF Dreieck : (* Position = Eckpunkt A *) WriteString("Eckpunkte B u. C eingeben : "); WriteLn; WITH posB DO WriteString(" B "); WriteString(" x ? "); ReadReal(x); WriteString(" y ? "); ReadReal(y); WriteLn END; WITH posC DO WriteString(" C "); WriteString(" x ? "); ReadReal(x); WriteString(" y ? "); ReadReal(y); WriteLn END | Rechteck : (* Position = Eckpunkt A *) WriteString("Hoehe u. Breite eingeben : "); WriteLn; WriteString(" hoehe ? "); ReadReal(hoehe); WriteString(" breite ? "); ReadReal(breite); WriteLn | Kreis : (* Position = Mittelpunkt *) WriteString("Radius eingeben : "); WriteLn; WriteString(" radius ? "); ReadReal(rad); WriteLn | Ellipse : (* Position = 1. Brennpunkt *) WriteString("2. Brennpunkt eingeben : "); WriteLn; WITH F DO WriteString(" F "); WriteString(" x ? "); ReadReal(x); WriteString(" y ? "); ReadReal(y); WriteLn END; WriteString("Achse eingeben : "); WriteLn; WriteString(" ha ? "); ReadReal(ha); WriteLn ELSE WriteString("** unbekannter Figurtyp ! **"); WriteLn END (* CASE *) END (* WITH *) END FigurEingabe; PROCEDURE FigurAusgabe( figur : geoFigur); PROCEDURE WritePos( VAR pos : Position); BEGIN WITH pos DO WriteString("("); WriteFloat(x, 3, 2); WriteString(","); WriteFloat(y, 3, 2); WriteString(")"); WriteLn END END WritePos; BEGIN (* * -- --------------------------------------- * -- Ausgabe der Figur (Parameter + Flaeche) * -- --------------------------------------- *) WITH figur DO WriteString("Position = "); WritePos(pos); CASE typ OF Dreieck : WriteString(" Ecke B = "); WritePos(posB); WriteString(" Ecke C = "); WritePos(posC); WriteString("Dreiecks-Flaeche = "); WriteFloat(Flaeche(figur), 4, 2); WriteLn | Rechteck : WriteString("Hoehe = "); WriteFloat(hoehe, 3, 2); WriteLn; WriteString("Breite = "); WriteFloat(breite, 3, 2); WriteLn; WriteString("Rechtecks-Flaeche = "); WriteFloat(Flaeche(figur), 4, 2); WriteLn | Kreis : WriteString("Radius = "); WriteFloat(rad, 3, 2); WriteLn; WriteString("Kreis-Flaeche = "); WriteFloat(Flaeche(figur), 4, 2); WriteLn | Ellipse : WriteString(" 2. Brennpunkt F = "); WritePos(F); WriteString("Achse ha = "); WriteFloat(ha, 3, 2); WriteLn; WriteString("Ellipsen-Flaeche = "); WriteFloat(Flaeche(figur), 4, 2); WriteLn ELSE WriteString("** unbekannter Figurtyp ! **"); WriteLn END (* CASE *) END (* WITH *) END FigurAusgabe; BEGIN (* -- Hauptprogramm -- *) FigurEingabe(figur); FigurAusgabe(figur) END FlaechenInhaltProc.