mirror of
https://github.com/LukasKalbertodt/programmieren-in-rust.git
synced 2024-11-18 02:48:58 +01:00
Add sheet7
This commit is contained in:
parent
68a89defc2
commit
af781344ee
4
aufgaben/sheet7/README.md
Executable file
4
aufgaben/sheet7/README.md
Executable file
@ -0,0 +1,4 @@
|
||||
Blatt 7
|
||||
=======
|
||||
|
||||
Ok, langsam wird es tatsächlich langweilig, mich zu wiederholen: Ab jetzt für jedes Aufgabenblatt einen eigenen Branch anlegen... der vom `master` abzweigt. Wehe, ihr vergesst das beim nächsten mal! :worried:
|
10
aufgaben/sheet7/task1/README.md
Executable file
10
aufgaben/sheet7/task1/README.md
Executable file
@ -0,0 +1,10 @@
|
||||
Aufgabe 1: Fibonacci Iterator
|
||||
=============================
|
||||
|
||||
Schreibt ein Programm, welches die ersten 20 Zahlen in der [Fibonacci-Folge][fib-wiki] ausgibt.
|
||||
Entwerft dazu selber einen Typ, der das Trait `Iterator` implementiert und so *theoretisch* alle Zahlen aus der Fibonacci-Folge generieren kann.
|
||||
In `main()` sollen dann die ersten 20 ausgegeben werden.
|
||||
|
||||
|
||||
|
||||
[fib-wiki]: https://de.wikipedia.org/wiki/Fibonacci-Folge
|
24
aufgaben/sheet7/task2/README.md
Executable file
24
aufgaben/sheet7/task2/README.md
Executable file
@ -0,0 +1,24 @@
|
||||
Aufgabe 2: Diverse Funktionen
|
||||
=============================
|
||||
|
||||
In dieser Aufgabe sollen diverse kleinere Funktionen enstehen.
|
||||
In der Musterlösung habe ich immer irgendwie Iteratoren und Iterator-Methoden genutzt, also liegt es nahe, dass ihr es auch tun solltet.
|
||||
Wenn ihr natürlich meint, eine schönere Lösung ohne Iteratoren gefunden zu haben, könnt ihr sie eurem Tutor natürlich auch vorstellen ;-)
|
||||
|
||||
Versucht bei dieser Aufgabe alle Funktionen immer möglichst kurz (also mit wenigen Anweisungen) zu implementieren. Ihr müsst also auch nicht so sehr auf die Laufzeit eurer Algorithmen achten.
|
||||
|
||||
Euch ist ein Gerüst mit diversen Unittests gegeben. Die Testfälle erklären die Funktionen zusätzlich.
|
||||
|
||||
*Hinweis*: Es könnten für diese Aufgabe auch Funktionen direkt aus dem Modul `std::iter` sinnvoll sein.
|
||||
|
||||
### Funktionen
|
||||
|
||||
- `factorial()`: Berechnet `x!` für ein gegebenes `x`.
|
||||
|
||||
- `rot13()`: "Verschlüsselt" einen gegebenen String mit der derzeit besten [Verschlüsselungsmethode Rot13](https://de.wikipedia.org/wiki/ROT13). Die einzige noch bessere Verschlüsselung ist Rot26. Falls ihr meint, dass ihr es hinbekommt, könnt ihr zusätzlich auch gerne Rot26 implementieren...
|
||||
|
||||
- `is_palindrome()`: Testet ob ein gegebener String ein Palindrom ist.
|
||||
|
||||
- `used_chars_count()`: Gibt die Anzahl der unterschiedlichen Zeichen im übergebenen String zurück. Whitespace-Zeichen sollen aber nicht mitgezählt werden. Ihr könnt hier auch gerne eine passende collection aus `std` benutzen...
|
||||
|
||||
- `greatest_subsequencial_sum()`: Bekommt ein Array von ganzen Zahlen gegeben und sucht nun das Subarray (die Slice), bei dem die Summe aller Zahlen am größten unter allen möglichen Subarrays ist.
|
47
aufgaben/sheet7/task2/iters.rs
Executable file
47
aufgaben/sheet7/task2/iters.rs
Executable file
@ -0,0 +1,47 @@
|
||||
#[test]
|
||||
fn test_factorial() {
|
||||
assert_eq!(factorial(1), 1);
|
||||
assert_eq!(factorial(2), 2);
|
||||
assert_eq!(factorial(3), 6);
|
||||
assert_eq!(factorial(15), 1_307_674_368_000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_palindrome() {
|
||||
assert!(is_palindrome("bob"));
|
||||
assert!(is_palindrome("anna"));
|
||||
assert!(is_palindrome("lagerregal"));
|
||||
|
||||
assert!(!is_palindrome("peter"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_greatest_subsequencial_sum() {
|
||||
let a = [1, 2, 39, 34, 20, -20, -16, 35, 0];
|
||||
assert_eq!(greatest_subsequencial_sum(&a), &a[0..5]);
|
||||
|
||||
let b = [-3, -9, -8, -34];
|
||||
assert_eq!(greatest_subsequencial_sum(&b), &[]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rot13() {
|
||||
assert_eq!(rot13("hello"), "uryyb");
|
||||
assert_eq!(rot13("uryyb"), "hello");
|
||||
|
||||
assert_eq!(
|
||||
rot13("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
|
||||
"NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
|
||||
);
|
||||
|
||||
assert_eq!(rot13("peter"), "crgre");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_used_letters() {
|
||||
assert_eq!(used_chars_count(&["hi", "ih gitt"]), 4);
|
||||
assert_eq!(used_chars_count(&["peter"]), 4);
|
||||
assert_eq!(used_chars_count(&["p e t e r", "barbara"]), 6);
|
||||
}
|
||||
|
||||
fn main() {}
|
6
aufgaben/sheet7/task3/README.md
Executable file
6
aufgaben/sheet7/task3/README.md
Executable file
@ -0,0 +1,6 @@
|
||||
Aufgabe 3: Fold
|
||||
===============
|
||||
|
||||
Die Methode `Iterator::fold()` ist sehr mächtig, aber nicht trivial zu benutzen. In dieser Aufgabe sollt ihr `fold()` benutzen, um das Verhalten von `Iterator::{product(), max(), all()}` zu simulieren. Das heißt, dass euer `fold()` Aufruf genau zu dem gleichen Ergebnis wie `product()`, `max()` oder `all()` kommt.
|
||||
|
||||
Ihr könnt alle drei Aufrufe einfach mit einem kleinen Beispiel in `main()` programmieren. Es sollte also irgendetwas funktionieren und ihr solltet in der Lage sein, eurem Tutor zu erklären, warum es funktioniert.
|
40
aufgaben/sheet7/task4/README.md
Executable file
40
aufgaben/sheet7/task4/README.md
Executable file
@ -0,0 +1,40 @@
|
||||
Aufgabe 4: Kopierbefehl
|
||||
=======================
|
||||
|
||||
(*In dieser Aufgabe geht es nicht mehr unbedingt nur um Iteratoren!*)
|
||||
|
||||
In dieser Aufgabe sollt ihr den `cp` Befehl nachprogrammieren ... Ok, nur einen Teil davon.
|
||||
Euer Programm soll zwei Dateinamen als *command line parameter* erhalten und dann von der einen Datei in die andere kopieren:
|
||||
|
||||
```
|
||||
$ mycp Cargo.toml Peter.toml
|
||||
```
|
||||
|
||||
Euer Programm soll also `mycp` heißen!
|
||||
Wenn ihr es richtig gemacht habt, könnt ihr mit dem Befehl `cargo install` euer Programm global auf eurem System installieren (die Executable wird in `~/.cargo/bin` kopiert, welches im `$PATH` ist). Damit ihr es aber nicht immer neu installieren müsst, um es auszuprobieren, könnt ihr es aber natürlich mit `cargo run` testen. Die Kommandozeilenparameter werden nach den `--` übergeben:
|
||||
|
||||
```
|
||||
$ cargo run -- Cargo.toml Peter.toml
|
||||
```
|
||||
|
||||
Die Hauptschritte zur Implementation sind folgende:
|
||||
|
||||
### a) Parsen der Kommandozeilenparameter
|
||||
|
||||
Diese müssen zunächst eingelesen werden und auf Gültigkeit überprüft werden (richtige Anzahl?).
|
||||
Dies soll in einer eigenen Funktion geschehen, in der *keine* Ausgabe auf dem Terminal geschehen soll.
|
||||
Alle Informationen müssen im Rückgabewert kodiert sein.
|
||||
|
||||
Hierzu ist sicherlich das [`std::env` Modul](https://doc.rust-lang.org/std/env/index.html) interessant.
|
||||
|
||||
|
||||
### b) Kopieren des Dateiinhalts
|
||||
|
||||
Falls die Parameter korrekt waren, muss jetzt von einer Datei in die andere kopiert werden.
|
||||
Das soll ebenfalls in einer eigenen Funktion passieren, welche *keine* Ausgaben auf dem Terminal macht.
|
||||
|
||||
Dabei sollten natürlich auch Fehler behandelt werden.
|
||||
Das heißt aber nicht, dass ihr selber viel Code programmieren müsst; wahrscheinlich ist die Implementierung kürzer, als ihr anfangs vermuten würdet.
|
||||
|
||||
Wie man schon vermutet, wird hier das [`std::io` Modul](https://doc.rust-lang.org/std/io/index.html) eine Rolle spielen.
|
||||
Nur die Funktion `std::fs::copy()` dürft ihr **nicht** nutzen! Das wäre ja zu einfach ;-)
|
Loading…
Reference in New Issue
Block a user