Bestimme, ob ein Dreieck equilateral, isosceles oder scalene ist.
Ein Dreieck ist equilateral, wenn alle drei Seiten die gleiche Länge haben.
Ein Dreieck ist isosceles, wenn mindestens zwei Seiten die gleiche Länge haben. (Manchmal wird es so definiert, dass genau zwei Seiten gleich lang sind, aber für diese Übung sagen wir mindestens zwei.)
Ein Dreieck ist scalene, wenn alle Seiten unterschiedliche Längen haben.
Damit eine Form überhaupt ein Dreieck ist, müssen alle Seiten eine Länge > 0 haben, und die Summe der Längen zweier beliebiger Seiten muss größer oder gleich der Länge der dritten Seite sein.
Entartete Dreiecke sind Dreiecke, bei denen die Summe der Längen zweier Seiten gleich der Länge der dritten Seite ist, z. B. 1, 1, 2.
Wir haben uns entschieden, für diese Übung keine Tests für entartete Dreiecke aufzunehmen.
Du kannst diese Fälle behandeln, wenn du möchtest, oder sie getrost ignorieren.
In Gleichungen:
Seien a, b und c die Seiten des Dreiecks.
Dann müssen alle drei der folgenden Ausdrücke wahr sein:
a + b ≥ c
b + c ≥ a
a + c ≥ b
Siehe Dreiecksungleichung
Die Umsetzung kann viele Formen annehmen. Hier sind einige Themen, die dir helfen können, je nachdem, für welchen Ansatz du dich entscheidest.
Oder vielleicht fällt dir ein Ansatz ein, der ganz ohne diese Themen auskommt!
Die Basisübung testet das Erkennen von Dreiecken, deren Seiten alle Ganzzahlen sind. Manche Dreiecke lassen sich jedoch nicht durch reine Ganzzahlen darstellen. Ein einfaches Beispiel ist ein Dreieck mit einem 90-Grad-Winkel zwischen zwei gleich langen Seiten der Länge 1. Seine dritte Seite hat die Länge der Quadratwurzel aus 2, also eine irrationale Zahl (das heißt, sie lässt sich nicht als Ganzzahl oder Bruch schreiben).
Es wäre mühsam, die Analysefunktionen neu zu schreiben, damit sie sowohl Ganzzahl- als auch Gleitkommafälle abdecken. Besonders mühsam wäre es, das für alle möglichen Ganzzahl- und Gleitkommatypen zu tun: Mit vorzeichenbehafteten und vorzeichenlosen Varianten der Bitbreiten 8, 16, 32, 64 und 128 wären das 10 Neuimplementierungen von im Grunde demselben Code, noch bevor man Gleitkommazahlen überhaupt betrachtet!
Es gibt einen besseren Weg: Generics. Indem du dein Triangle als Triangle<T> schreibst, kannst du deinen Code einmal schreiben und die Arbeit, all diese Spezialisierungen zu erzeugen, dem Compiler überlassen. Beachte, dass du deinen generischen Typ auf Typen einschränken musst, die diese Operationen unterstützen, und zwar mithilfe von Traits.
Es gibt einige Bonustests, die du ausführen kannst und die deine Implementierung mit Gleitkommazahlen testen. Um sie zu aktivieren, führe deine Tests mit dem Feature-Flag generic aus, so wie hier:
cargo test --features generic
Melde dich bei Exercism an, um Rust mit 99 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.