diff --git a/aufgaben/sheet6/README.md b/aufgaben/sheet6/README.md new file mode 100755 index 0000000..dd12b59 --- /dev/null +++ b/aufgaben/sheet6/README.md @@ -0,0 +1,5 @@ +Blatt 6 +======= + +Dreimal dürft ihr raten: Diese Aufgaben sollen auf dem Branch `sheet6` +bearbeitet werden, der von dem `master`-Branch entsprungen ist! diff --git a/aufgaben/sheet6/task1/README.md b/aufgaben/sheet6/task1/README.md new file mode 100755 index 0000000..5c49cb1 --- /dev/null +++ b/aufgaben/sheet6/task1/README.md @@ -0,0 +1,41 @@ +Aufgabe 1: Hilfsfunktionen +========================== + +In dieser Aufgabe soll eine Library-Crate (Cargo Projekt) erstellt werden, +welche ein paar kleine, aber nützliche Funktionalitäten bereitstellt. + +Für alle drei Funktionen/Methoden soll ein Unittest geschrieben werden. Alle +Unittests liegen in dem `tests` Untermodul der Crate; alles andere kann aber +im Wurzelmodul definiert sein. *Hinweis*: Mit `cargo test` können alle +Unittests ausgeführt werden. + + +### a) `clamp()` + +Diese Funktion nimmt drei Parameter: einen Wert sowie `min` und `max`. +Die Funktion returned einfach den gegebenen Wert, solange er zwischen `min` und +`max` liegt. Falls der gegebene Wert jedoch kleiner als `min` ist, wird `min` +returned; das gleiche entsprechend mit `max`. + +Die Funktion soll so allgemein wie möglich formuliert werden und keine +genauen Typen festlegen. + + +### b) Summe und Produkt + +Die Funktion nimmt zwei Argumente and und liefert sowohl die Summe als auch +das Produkt dieser beiden Werte zurück. Auch diese Funktion soll möglichst +allgemein formuliert werden. + + +### c) Extension Trait + +Wir würden gerne `bool`-Variablen sehr einfach in ein `Option` umwandeln +können, also z.B. so einen Code aufrufen können: + +```rust +true.into_option(3); // Some(3) +false.into_option("susi"); // None +``` + +Fügt die Methode zu `bool` mit Hilfe eines Extension Traits hinzu. diff --git a/aufgaben/sheet6/task2/README.md b/aufgaben/sheet6/task2/README.md new file mode 100755 index 0000000..943bd54 --- /dev/null +++ b/aufgaben/sheet6/task2/README.md @@ -0,0 +1,36 @@ +Aufgabe 2: Vektor +================= + +In dieser Aufgabe soll ein einfacher, generischer Vektor-Typ erstellt werden. +Wieder soll eine Library-Crate als Cargo-Projekt angelegt werden und im `tests` +Untermodul sollen ein paar kurze Unittests die eigentliche Funktionalität +testen. + +Der Datentyp soll `Vector2` heißen und besteht aus einer x- und y-Koordinate. +Der Typ dieser Koordinaten ist jedoch generisch und kann grundsätzlich erstmal +alles sein. Neben den expliziten Anforderungen in a) und b) kann und/oder +muss `Vector2` noch weitere Traits implementieren, solange das möglich ist. + + +### a) Konstruktor-Funktionen + +Wir möchten vier Konstruktor-Funktionen zu `Vector2` hinzufügen: + +- `new(x, y)`: bekommt beide Koordinaten als Parameter +- `origin()`: Vektor am Nullpunkt (beide Koordinaten 0) +- `unit_x()`: Ein Einheitsvektor mit x=1 +- `unit_y()`: Ein Einheitsvektor mit y=1 + +Um diese Funktionen implementieren zu können, greifen wir auf schon vorhandene +Traits zu. Diese finden wir in der Crate `num-traits`, die es wie gewohnt auf +crates.io gibt. Von dieser externen Bibliothek müsst ihr euch passende Traits, +die ihr nutzen wollt/müsst, aussuchen (wir sind nur an den Traits der +Bibliothek interessiert!). + + +### b) Operatoren überladen + +Für den Vektor soll der `+` und `*` Operator überladen werden (wenn dies +möglich ist). +Dabei ist das eine natürlich die Vektoraddition (also Vektor + Vektor), das +andere ist die Skalarmultiplikation (also Vektor * Skalar). diff --git a/aufgaben/sheet6/task3/README.md b/aufgaben/sheet6/task3/README.md new file mode 100755 index 0000000..a6560ea --- /dev/null +++ b/aufgaben/sheet6/task3/README.md @@ -0,0 +1,21 @@ +Aufgabe 3: Swagger +================== + +*Diese Aufgabe kann in einer einzelnen `.rs` Datei gelöst werden und benötigt +kein Cargo-Projekt.* + +Erstellt einen Typ `Swagger`, welcher einen beliebigen anderen Typen in sich +speichert. +`Swagger` soll mit `println!()` und dem normalen `{}` Platzhalter +ausgegeben werden können, wenn immer das möglich ist. +Die Ausgabe soll "yolo ??? swag" sein, wobei "???" für die Ausgabe des inneren +Objekts steht. +Wäre also eine `3` in einer Swagger-Instanz gespeichert und man würde diese +Instanz ausgeben, wäre die Ausgabe "yolo 3 swag". + +Weiterhin soll es möglich sein, auf jedem beliebigen Typen direkt eine Methode +`with_swag()` aufzurufen, die diesen Typen in eine `Swagger`-Instanz verpackt. + +``` +println!("{}", 3.with_swag()); // prints: "yolo 3 swag" +```