///////////////////////////////////////////////////////////////////// Maximieren Sie das Fenster, um die Datei im urspr◯nglich vorgesehenen Layout zu lesen //////////////////////////////////////////////////////////////////// Datei: Dreieck.txt Dokumentation zu Dreieck.java Author: Benedikt Huber Matrikelnummer: 0060387 e-mail: e0060387@student.tuwien.ac.at Erstellungsdatum: 09.12.2001 ******************************************************************** Aufgabenstellung lt. Spezifikation ******************************************************************** - Seitenl∽ngen rechtwinkliger Dreiecke einlesen und ausgeben, ob sie sich l◯ckenlos so aneinander legen lassen, dass entweder ein Quadrat oder eine Raute entsteht - Zuerst soll die Anzahl der einzulesenden Dreiecke gelesen werden(2-4) - Bei einem ung◯ltigen Wert wird sofort abgebrochen und "FALSCHE EINGABE" ausgegeben - Bei einem g◯ltigen Wert werden pro Dreieck 3 float-Werte eingelesen (Alle Einlesen!!!) - Die Seitenl∽ngen m◯ssen zwischen 0 und 30 liegen - Bei einem ung◯ltigen Wert soll "FALSCHE EINGABE" ausgegeben werden - Bei ung◯ltigen Datentypen soll "?" ausgegeben werden - Berechnungen sollen mit einer Genauigkeit von 0.3 durchgef◯hrt werden - Wenn die 3 Seitenl∽ngen kein rechtwinkliges Dreieck ergeben, soll "FALSCHE EINGABE" ausgegeben werden - Wenn die rechtwinkligen Dreiecke sich zu einem QUADRAT oder einer RAUTE zusammenlegen lassen, soll "J" ausgegeben werden - Ansonsten "N" ******************************************************************** Theorie I) Wann kann aus 3 Seitenl∽ngen ein Dreieck gebastelt werden II) Wann ist dieses Dreieck Rechtwinklig III) Wann lassen sich 2,3 od.4 Dreiecke zu einer Raute zusammenlegen ******************************************************************** ad I) Dreiecksungleichung: Zwei Seitenl∽ngen zusammen m◯ssen immer gr‡≡er als die Dritte sein ad II) Satz von Phytagoras: Die Summe der Quadrate der zwei k◯rzeren Seitenl∽ngen ist gleich dem Quadrat der l∽ngsten Seitenl∽ngen (hinreichende Dreiecksungleichung) ad III) Anm.: Alle nachfolgenden Behauptungen wurden durch stundenlanges Zeichnes und elendslange Forumsdiskussion bekr∽ftigt, werden aber aufgrund fehlender Grafikm‡glichkeiten und um den Rahmen des Lesefreudigkeit des Lesers nicht zu strapazieren, as short as possible gehalten ;-) Zum Zeitpunkt der Erstellung waren die Grafiken unter stud4.tuwien.ac.at/~e0060387 abrufbar Au≡erdem gibts am Ende des Files tolle ANSI-Bilder 2 Dreiecke: 1 Fall -> QUADRAT Genau dann, wenn zwei identische,gleichschenkelige Dreiecke vorliegen 3 Dreiecke: 1 Fall -> QUADRAT Genau dann, wenn zwei identische,gleichschenkelige Dreiecke aneinandergelegt identisch mit dem dritten, ebenfalls gleichschenkligen Dreieck sind 4 Dreiecke: 3 F∽lle; I) Rekursive Struktur - Die zwei kleinsten Dreiecke sind identisch - Aneinandergelegt identisch mit dem n∽chstgr‡≡ten - Fortfahren wie bei 3 Dreiecken II) Deltoid - Je 2 Dreiecke sind identisch -> Deltoid - 3 Sub-F∽lle a) - Als Deltoid betrachtet: f teilt e mittig - d.h. Alle vier Dreiecke sind identisch -> Raute b) - Als Deltoid betrachtet: e=a,f=a/2 -> Quadrat - d.h.: Je zwei Dreiecke ergeben ein Rechteck - Die beiden Rechtecke zusammen ein Quadrat c) - Als Deltoid betrachtet: e=a, entweder AB oder BC sind = a - d.h Jeweils 2 unterschiedliche Dreiecke ergeben zusammengelegt ein gleichschenkliges - die identischen gleichschenkligen(aber nicht rechtwinkligen) Dreiecke ergeben immer eine -> Raute III) Loose One in the Middle (d.h. ein Dreieck liegt mit keiner Seite an dem Quadrat an) - 4 Verschiedene Dreicke ergeben Quadrat - 3 Sub-F∽lle a) Das Dreieck in der Mitte hat einen Eckpunkt in einem Eckpunkt des Quadrates, die anderen zwei Eckpunkte teilen jeweils eine Seite Algorithmus: - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete - F◯r die anderen 2 Dreiecke gilt: Die k◯rzere Kathete des gr‡≡eren Dreieckes(das "in der Mitte") ist gleich der Hypothenuse des letzten Dreieckes - Die k◯rzere(oder l∽ngere, das ist egal) Kathete des letzten Dreieckes plus die k◯rzere Kathete eines der beiden ersten 2 Dreiecke gleich a - HINREICHEND (Alle Seitenl∽ngen fixiert)! b) Das Quadrat wird durch 3 Dreiecke gebildet, das mittlere davon durch die H‡he in zwei rechtwinklige geteilt Algorithmus: - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete - Die l∽ngeren Katheten der anderen 2 Dreiecke sind gleich - Die Summe der k◯rzeren Katheten der ersten 2 Dreiecke ist a - HINREICHEND (Alle Seitenl∽ngen fixiert)! c) Wiederum wird das Quadrat durch drei Dreiecke gebildet Dies ist jedoch der Spezialfall, wo eines dieser Dreiecke das Quadrat in zwei Dreiecke teil Ein H∽lfte des Quadrats wid wieder in 2 Dreiecke geteilt (eines davon rechtwinklig) Das nicht rechtwinklige durch die H‡he wieder in zwei Dreiecke (ohne Gfx braucht man halt imaginiation) Algorithmus: - Fl∽cheninhalte addieren und Wurzelziehen => Quadratseite - Zwei Dreiecke haben Quadratseite als l∽ngere Kathete - Das gr‡≡te Dreieck ist Gleichschenklig - Die k◯rzeren Katheten der anderen 2 Dreiecke sind gleich - Und schlie≡lich die Hypothenuse vom zweit- und drittgr‡≡ten Dreieck gleich - HINREICHEND (Alle Seitenl∽ngen fixiert)! *********************************************************************************** Design-Goals ********************************************************************************** I) Korrektheit II) Sinnvolles! OOP und Verwendbarkeit III) Lesbarkeit ad I) imho das wichtigste bei einem Eprog-Programm - Ich denke, dass ich alle F∽lle inkludiert habe; von dieser Seite her sollte die Korrektheit gegeben sein. - ACHTUNG: Bei sehr kleinen Seitenl∽ngen(<0.5) erhalten Sie kein sinnvolles Ergebniss. Die Schuld daran tr∽gt die Spezifikation die eine ABSOLUTE Toleranz (von 0.3) fordert(d.h. z.B. dass alle Werte zw. 0.1 und 0.4 identisch zu behandeln sind). In diesem Sinne erf◯llt das Programm die Anforderungen der Spezifikation, nicht aber die eines realen Problems. Anm.: Das Zulassen einer relativen Toleranz(z.B. 1%) w∽re sinnvoller gewesen, aber das ist eine andere Geschichte ;-) ad II) - Alle Methoden, die in meinem Programm public definiert sind, sind sinnvoll von au≡erhalb der Klasse zu verwenden - Einlesen,Verarbeiten sowie einzelne Teile der Verarbeitung k‡nnen direkt von einer anderen Klasse angesteuert werden - Die wichtigen Konstanten wie die R◯ckgabestrings oder die Genauigkeit k‡nnen statisch ver∽ndert werden ad III) - Stil(Einr◯cken,Abs∽tzte) lt. Konvention - JavaDoc-Kompatibilit∽t - Neben den JavaDoc Kommentaren (Bl‡cke vor Methoden) nur kurze,pr∽gnante Comments zum ungef∽hren Verst∽ndniss (-> bessere Lesbarkeit) *********************************************************************************** Implentierungs-Details ********************************************************************************** Um den Aufbau der Klasse auf einen Blick bestm‡glich erfassen zu k‡nnen geben sie in der Kommandozeile "javadoc Dreieck.java -author -version" ein -> hier wird alles, was public ist, ausf◯hrlich beschrieben I) Klassen und Packages II) Variablen und Konstanten III) Programmablauf ad I) - public class Dreieck Diese Klasse enth∽lt mein Programm(keine super/subclasses) - eprog.EprogIO Importiert f◯r I/O - java.util.Arrays Importiert zum Sortieren - java.lang.Math Importiert f◯r Absolutbetrag und Wurzel ad II) - nur statische Konstanten zur Berechnung - ich habe sie (noch) nicht final deklariert, da ein dritter ihnen m‡glicherweise neue Werte zuordnen will - siehe JavaDoc ad III) Im folgenden wird der Programmablauf kurz skizziert: 1) main -> readInput: Einlesen, wenn ung◯ltiger Datentyp EprogException, wenn ung◯ltige Anzahl null -> main 2) main -> perform -> isRwDreieck: Schaun ob des g◯ltige Dreiecke sind -> perform 4) -> sortDreiecke: Sortiert die rwDreiecke nach Hypothenuse, kleinste zuerst -> perform 5) -> istRaute: Schaut, ob sich Quadrat/Raute bilden l∽≡t bei 2 Dreiecken -> istQuadrat_2: Berechne f◯r 2 Dreiecke -> perform->main 3 -> ist Quadrat_3: 3 -> istQuadrat_2 -> perform->main im Falle III -> istQuadrat_4: Berechnen ob Quadrat und zur◯ckgeben -> perform->main im Falle I -> zusammenf◯gen ->istQuadrat_3 -> istQuadrat_2 -> perform->main im Falle II: Berechnen ob Raute und zur◯ckgeben -> perform->main 6) main: Drucke Ausgabestring Zum Berechnen wird aus≡erdem folgende Zusatzfunktion verwendet - equals - schaut, ob zwei Dreiecke gleich sind ************************************************************************************** Anhang A: ANSI-Grafiken des Falles IIIa,IIIb,IIIc ************************************************************************************** Glossary: R = rechter Winkel a = Quadrat/Rautenseite Fall I ######################################## #R ## # # ## # # ## # # ## # # ## # # ## # # ## # # ## # # ##R # # ##### # # ## # ## # # ## # ## # # ## # ## # # ## # ## # # ## # ## # # ## # ## # # ## # ## # # ## R#R ### ######################################## Fall IIa ### ## # ## ## # ## a ## # ## a ## # ### ## # ## ## # ## ## # ## ## R#R ## ######################################## ## R#R # ## # ### ## # # ## # ### ## # # a ## # ### a ## # # ## # ### ### # ## Fall IIb ######################################## #R #### R# # ## # # # # # # # # # # ## # # # # # # # # # # # # # # ## # # # # # # # # # # # a # # # ## # # # # # # # # # ## # # # # # # # # # # # # # # ## # # # # # # ## # # # ## R#R ### ######################################## a Fall IIc ################################ ## # # ## ## # # # ## # # # ## # ## ## ## # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # ## # # # # # a ## # # # # # # # # # # # # # # ## # # # # # # ## # # # ## ## # # ## # ## # ## # # # ## ################################### a Fall IIIa ######################################## ##### R# # # ### # # # ### # # ## ### # # # ### # # # ### # # # ### # # # ### # # # ### # # ## ### # # # ### # # # ### # # # ## # # #### # ## #### # # # #### # # # R #### # #R ### R# ######################################## Fall IIIb: ######################################## ##### ## # # #### # # # # ### # # # # ### # # # # #### # # # # ### # # # # ### # # # # ####R # # # # R## # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #R # # R# ######################################## Fall IIIc: ######################################## ### ## # R# # ## # # # # ## ## # # # ## # # # # ##R ## # # # ##R # # # ## # # # ## # # # ## # # # ### # # # ## # # # ## # # # ## # # # ## # # # ## # # # ## # # # ## # # #R #### ########################################