From d9da49d8b9ec6c83b8554c991f2f999efa714247 Mon Sep 17 00:00:00 2001
From: Semih <3025014@stud.hs-mannheim.de>
Date: Fri, 12 Jun 2026 20:12:09 +0200
Subject: [PATCH] Basics erweitert und README aktualisiert
---
.../{9-funktionen.rs => 10-funktionen.rs} | 20 ++++++++++
B-basics/5-kontrollfluss.rs | 32 +++++++++++++++-
B-basics/7-compounds.rs | 4 +-
B-basics/9-enums.rs | 20 ++++++++++
{F-testing => F-error}/TODO | 0
H-advanced/result.rs | 0
I-homework/Homework.md | 38 +------------------
README.md | 33 ++++++++--------
8 files changed, 91 insertions(+), 56 deletions(-)
rename B-basics/{9-funktionen.rs => 10-funktionen.rs} (81%)
create mode 100644 B-basics/9-enums.rs
rename {F-testing => F-error}/TODO (100%)
create mode 100644 H-advanced/result.rs
diff --git a/B-basics/9-funktionen.rs b/B-basics/10-funktionen.rs
similarity index 81%
rename from B-basics/9-funktionen.rs
rename to B-basics/10-funktionen.rs
index 536fcf3..1c3f2bc 100644
--- a/B-basics/9-funktionen.rs
+++ b/B-basics/10-funktionen.rs
@@ -1,3 +1,5 @@
+#[allow(dead_code)]
+
fn main() {
// Das ist die Main Funktion
// Diese Funktion wird beim Aufruf von rust-script und von cargo run ausgeführt
@@ -9,6 +11,11 @@ fn main() {
let mut r = Rechteck::new(400.0, 20.0);
r.skalieren(4.0);
println!("{:?}", r.flaeche());
+
+ use Arbeit::*; // Use dafür, damit man nicht immer Arbeit:: schreiben muss
+ let person = Arbeitnehmer;
+
+ inspect(person);
}
// Das ist eine Funktion, die ein Boolean zurückgibt, Parameter können in die Klammern geschrieben werden
@@ -57,3 +64,16 @@ impl Rechteck {
self.breite *= s;
}
}
+
+enum Arbeit {
+ Arbeitnehmer,
+ Arbeitgeber,
+ Selbstaendiger,
+}
+
+fn inspect(person: Arbeit) {
+ match person {
+ Arbeit::Arbeitnehmer => println!("Grrr, Chefs"),
+ _ => println!("Grrr, Steuern"),
+ }
+}
\ No newline at end of file
diff --git a/B-basics/5-kontrollfluss.rs b/B-basics/5-kontrollfluss.rs
index 38a1396..137ff3e 100644
--- a/B-basics/5-kontrollfluss.rs
+++ b/B-basics/5-kontrollfluss.rs
@@ -17,8 +17,8 @@ fn main() {
x += 1;
}
- // For Loops sind etwas wilder, die klassische Java for-Loop (for (int i = 0; i <= 100; i++) {}) sehe so aus
- for i in 0..100 {
+ // For Loops sind etwas wilder, die klassische Java for-Loop (for (int i = 0; i < 10; i++) {}) sehe so aus
+ for i in 0..10 {
// Das ist quasi der Ternary Operator aus Python
let gerade = if i % 2 == 0 { true } else { false }; // Semicolon wichtig, da das eine Variableninitialisierung ist
@@ -30,4 +30,32 @@ fn main() {
println!("Endlosschleifeeeee...");
break; // nicht mehr endlos
}
+
+ for tag in 1..8 {
+ // Switch Case werden realisiert durch Pattern Matching
+ match tag {
+ 1 => println!("Montag :O"),
+ 2 => println!("Dienstag >:("),
+ 3 => println!("Mittwoch :("),
+ 4 => println!("Donnerstag :|"),
+ 5 => println!("Freitag :)"),
+ 6 => println!("Samstag :D"),
+ 7 => println!("Sonntag :D"),
+ _ => println!("Tag unbekannt"), // Default Fall
+ }
+ }
+
+ let punktzahl = 50;
+
+ // Durch match kann ein Wert einer Variable zugeordnet werden, je nachdem, was die Lage ist
+ let note = match punktzahl {
+ 0..50 => "Ungenügend",
+ 50..67 => "Ausreichend",
+ 67..80 => "Befriedigend",
+ 80..92 => "Gut",
+ 92..101 => "Sehr gut",
+ _ => "Unbekannte Punktzahl",
+ }; // Hier ist ein Semikolon nötig, da es eine Variableninitialisierung ist
+
+ println!("{note}");
}
diff --git a/B-basics/7-compounds.rs b/B-basics/7-compounds.rs
index ec83fbe..ac3ec94 100644
--- a/B-basics/7-compounds.rs
+++ b/B-basics/7-compounds.rs
@@ -1,7 +1,9 @@
fn main() {
- let string: &str = "Das ist ein String.";
+ // Dieser String ist ein String Slice, welcher eine unveränderliche Referenz auf einen bestehenden String ist
+ let string: &str = "Das ist ein String.";
println!("{string}");
+ // Ein im Heap allokierter, veränderlicher und besitzender String, mehr dazu später
let string = String::from("Das ist auch ein String.");
println!("{string}");
diff --git a/B-basics/9-enums.rs b/B-basics/9-enums.rs
new file mode 100644
index 0000000..a29dcdf
--- /dev/null
+++ b/B-basics/9-enums.rs
@@ -0,0 +1,20 @@
+#[allow(dead_code)]
+#[allow(unused_variables)]
+
+fn main() {
+ // Beides macht dasselbe
+ let semih = Hochschule::Student;
+ let steger = Hochschule::Professor;
+
+ // Durch Enums kann Pattern Matching in etwas sehr wertvolles umgewandelt werden
+ match semih {
+ Hochschule::Student => println!("Ich bin ein armer Student :("),
+ Hochschule::Professor => println!("Ich bin ein Professor :)")
+ }
+}
+
+// Eine Enumeration wird durch enum eingeleitet, danach folgt die Deklarierung der Enum-Konstanten
+enum Hochschule {
+ Student,
+ Professor,
+}
\ No newline at end of file
diff --git a/F-testing/TODO b/F-error/TODO
similarity index 100%
rename from F-testing/TODO
rename to F-error/TODO
diff --git a/H-advanced/result.rs b/H-advanced/result.rs
new file mode 100644
index 0000000..e69de29
diff --git a/I-homework/Homework.md b/I-homework/Homework.md
index 3898b5f..9979596 100644
--- a/I-homework/Homework.md
+++ b/I-homework/Homework.md
@@ -1,9 +1,6 @@
# Rust Übungsaufagaben:
-
## 1. Ownership & Borrowing:
-
### Aufgabe 1:
-
Erkläre, warum folgender Rust-Code nicht kompiliert:
```rust
@@ -15,11 +12,8 @@ fn main() {
}
```
Ändere den Code so, dass ```s1``` und ```s2``` augegeben werden können.
-
-
### Aufgabe 2:
-
Warum verbietet Rust folgenden Code?
```rust
@@ -36,7 +30,6 @@ fn main() {
Schreibe den Code so um, sodass beide ```println!``` statements funktionieren.
## 2. Pattern Matching & Enums:
-
### Aufgabe 3:
Gegeben sei folgender Rust Code für eine 3-Phasen Ampel:
```rust
@@ -62,9 +55,7 @@ fn main(){
Was passiert wenn nicht alle Varainten in ```match ampel_status``` aufgelistet werden?
## 3. Option & Result Types:
-
### Aufgabe 4:
-
Erkläre, warum folgender Code nicht funktioniert und behebe das Problem:
```rust
@@ -79,10 +70,7 @@ fn main() {
Verwende `Option` oder eine andere Fehlerbehandlung, um sicher auf den Vektor zuzugreifen. Erkläre die Vorteile dieses Ansatzes gegenüber einem Laufzeitfehler ("panic").
-
-
### Aufgabe 5:
-
Schreibe eine Funktion `parse_number`, die einen String nimmt und ein `Result` zurückgibt:
- Bei erfolgreicher Konvertierung: `Ok(zahl)`
- Bei Fehler: `Err("Ungültige Eingabe".to_string())`
@@ -102,9 +90,7 @@ fn main() {
Wie unterscheidet sich `Result` von `Option`? Wann verwendet man welchen Typ?
## 4. String vs &str und Ownership:
-
### Aufgabe 6:
-
Erkläre den Unterschied zwischen `String` und `&str`. Warum verbietet Rust folgende Funktion zu kompilieren?
```rust
@@ -123,10 +109,7 @@ fn main() {
Behebe den Fehler und erkläre, warum die Verwendung von `&str` als Parameter flexibler ist.
-
-
### Aufgabe 7:
-
Was ist der Unterschied zwischen folgenden zwei Funktionen? Welche ist besser und warum?
```rust
@@ -144,9 +127,7 @@ fn create_greeting_2(name: &str) -> String {
Schreibe für beide Varianten ein Beispiel in `main()`, das die Flexibilität von Variante 2 demonstriert.
## 5. Traits und Polymorphismus:
-
### Aufgabe 8:
-
Gegeben sind folgende Structs und ein Trait:
```rust
@@ -168,11 +149,8 @@ Implementiere den `Flaeche` Trait für beide Structs. Schreibe dann eine Funktio
Bonus: Erstelle einen Vektor mit verschiedenen Formen und iteriere über sie.
-
## 6. Mutability und Interior Mutability:
-
### Aufgabe 9:
-
Erkläre, warum folgender Code nicht funktioniert:
```rust
@@ -202,9 +180,7 @@ fn main() {
Erkläre die Rolle von `mut`, `&mut` und `*`.
## 7. Lifetimes:
-
### Aufgabe 10:
-
Warum kompiliert folgender Code nicht und wie behebt man das Problem?
```rust
@@ -230,10 +206,8 @@ fn main() {
Erkläre, was Lifetimes sind und warum Rust sie braucht. Behebe den Code mit korrekten Lifetime-Annotationen.
-## 9. Error Handling und Panic:
-
+## 8. Error Handling und Panic:
### Aufgabe 11:
-
Was ist der Unterschied zwischen `panic!` und `Result`? Wann sollte man welches verwenden?
Schreibe eine Funktion `divide`, die zwei Zahlen dividiert:
@@ -254,13 +228,3 @@ fn main() {
```
Erkläre, warum `Result` sicherer ist als ein `panic!` in einer Library-Funktion.
-
-
-
-
-
-
-
-
-
-
diff --git a/README.md b/README.md
index 322124e..2e0ae52 100644
--- a/README.md
+++ b/README.md
@@ -2,20 +2,24 @@
In diesem Repo sind alle Unterlagen für die Präsentation der Programmiersprache Rust
Das Repo beinhaltet:
- Dockerfile
-- Basics (TODO)
+- Basics
- Ownership und Borrowing
-- Pattern Matching und Enumerationen (TODO)
-- Testing und Debugging (TODO)
-- Advanced Features von Rust (TODO)
+- Pattern Matching und Enumerationen (wurde noch nicht gemacht)
+- Testing und Debugging (wurde noch nicht gemacht)
+- Advanced Features von Rust
Link zur Präsentation: https://docs.google.com/presentation/d/1vkq-cDprBH-5ya1Vvn4xmCyAN0YgbcioXG6CJkVKWDQ/edit?usp=sharing
+
# Ablauf
1. Warum Rust, (welche Apps), welche Entwicklungsumgebung (ca. 10 Minuten)
2. Ökosystem und Einrichtung (Compiler, Cargo) (ca. 5 Minuten)
3. Syntax und Basics (ca. 15 Minuten)
1. HelloWorld Programm
- 2. Variablen
- 3. Kontrollstrukturen
- 4. Types
+ 2. Variablen und Konstanten
+ 3. Datentypen und Arithmetik
+ 4. Kontrollstrukturen
+ 5. Print Makro
+ 6. Zusammengesetzte Typen (Compounds, Structs und Enums)
+ 7. Funktionen
4. Ownership & Borrowing (Live Coding) (ca. 20 Minuten)
1. Motivation: Warum Ownership
2. Prinzip: Ownership
@@ -27,12 +31,13 @@ Link zur Präsentation: https://docs.google.com/presentation/d/1vkq-cDprBH-5ya1V
# Aufgabenbereich
- Semih Uguz (3025014)
- - B-basics
- - C-cargo
+ - Basics
+ - Cargo
- Präsentieren
- Organisation des Repos
+ - Teile von Advanced
- Lukas Müller (3017761)
- - D-ownership
+ - Ownership
- Präsentieren
- Live Coding
- Oliver Stolle (3024383)
@@ -42,12 +47,8 @@ Link zur Präsentation: https://docs.google.com/presentation/d/1vkq-cDprBH-5ya1V
- Fakten und Anwendungen von Rust
- Cheat Sheet
- Präsentieren
- - G-advanced
+ - Concurrency
- Vincent Laux (3019006)
- Präsentieren
- Endpräsentation erstellen
- - G-advanced
-- Dominik Stuck (3018438)
- - Präsentieren
- - E-enums
- - F-testing
+- Dominik Stuck (3018438) (aktuell noch nichts gemacht)