diff --git a/docs/programming-concepts-universal.md b/docs/programming-concepts-universal.md new file mode 100644 index 0000000..d671f68 --- /dev/null +++ b/docs/programming-concepts-universal.md @@ -0,0 +1,646 @@ +# πŸŽ“ Interaktiver Programmierkurs: Von C zu universellen Konzepten + +*Ein Kurs fΓΌr C/C++-Einsteiger mit Fokus auf ΓΌbertragbare Programmierkonzepte* + +--- + +## πŸ“‹ KursΓΌbersicht + +**Zielgruppe:** Student mit C-Grundlagen, geplantem C++-Umstieg +**Kursdauer:** 8 Wochen (selbstgewΓ€hltem Tempo) +**Lernziel:** SprachunabhΓ€ngige Programmierkonzepte verstehen und auf beliebige Sprachen anwenden + +--- + +## πŸ—ΊοΈ Modul-Struktur + +``` +Woche 1-2: Grundlagen & Denkweisen +β”œβ”€β”€ Modul 1: Das Memory-Modell (Stack vs Heap) +β”œβ”€β”€ Modul 2: Datentypen als Konzepte (nicht Syntax) +└── Checkpoint A: SelbsteinschΓ€tzung + +Woche 3-4: Kontrollstrukturen & Logik +β”œβ”€β”€ Modul 3: Flusskontrolle universell +β”œβ”€β”€ Modul 4: Funktionen als Abstraktion +└── Checkpoint B: Mini-Projekt #1 + +Woche 5-6: Datenstrukturen +β”œβ”€β”€ Modul 5: Arrays, Listen, Strukturen +β”œβ”€β”€ Modul 6: Pointer & Referenzen verstehen +└── Checkpoint C: Datenstruktur-Implementierung + +Woche 7-8: OOP & Fortgeschrittenes +β”œβ”€β”€ Modul 7: Von structs zu Objekten (C β†’ C++ β†’ Konzept) +β”œβ”€β”€ Modul 8: Modularisierung & Design Patterns +└── Final-Projekt: SprachunabhΓ€ngige Anwendung +``` + +--- + +## 🧠 Modul 1: Das Memory-Modell + +### Konzept: Speicher ist universell + +**In C:** +```c +int stack_var = 42; // Stack - automatisch verwaltet +int* heap_var = malloc(4); // Heap - manuell verwaltet +*heap_var = 42; +free(heap_var); // Nicht vergessen! +``` + +**Das universelle Konzept:** +> **Stack** = Kurzlebig, automatisch, schnell +> **Heap** = Langfristig, manuell/verwaltet, flexibel + +### 🎯 Interaktive Übung 1.1: Memory-Map + +Zeichne ein Diagramm: + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” High Address +β”‚ Stack β”‚ ← Wachst nach unten (lokal vars) +β”‚ ↓ β”‚ +β”‚ β”‚ +β”‚ ↑ β”‚ +β”‚ Heap β”‚ ← Wachst nach oben (malloc/new) +β”‚ (freier β”‚ +β”‚ Speicher) β”‚ +β”‚ β”‚ +β”‚ Static/Data β”‚ ← Globale Variablen, Strings +β”‚ (Programm) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Low Address +``` + +**Frage:** Was passiert bei dieser C-Code Sequenz? + +```c +void foo() { + int a = 10; // Wo landet das? + int *b = malloc(sizeof(int)); // Und das? + *b = 20; + // b vergessen zu free() +} +``` + +
+Antwort anzeigen + +- `a` β†’ **Stack** (automatisch gelΓΆscht nach foo()) +- `b` β†’ **Stack** (nur der Pointer!) +- `*b` (der Wert 20) β†’ **Heap** +- ⚠️ **Memory Leak**: *b bleibt im Heap, weil free() vergessen wurde + +**Universelles Konzept:** Jede Sprache hat Stack/Heap. Python/Java haben Garbage Collection, C/C++ nicht, Rust hat Ownership. +
+ +--- + +## πŸ”’ Modul 2: Datentypen als Konzepte + +### Konzept: Typen sind Speicher + Operationen + +**Nicht lernen:** "int ist 4 Bytes" +**Lernen:** "int ist ein ganzzahliger Typ mit begrenztem Bereich" + +### 🎯 Interaktive Übung 2.1: Typ-Universum + +Ordne diese Konzepte zu: + +| Konzept | C | C++ | Python | Java | JavaScript | +|---------|---|---|--------|------|------------| +| Ganzzahl (fix) | `int` | `int` | - | `int` | `Number` | +| Ganzzahl (beliebig) | `long long` | `long long` | `int` | `BigInteger` | `BigInt` | +| Fließkomma | `float` | `float` | `float` | `float` | `Number` | +| HochprΓ€zision | `double` | `double` | `float` | `double` | - | +| Wahrheitswert | `bool` (C99) | `bool` | `bool` | `boolean` | `boolean` | +| Text | `char[]` | `string` | `str` | `String` | `string` | + +**Erkenntnis:** Konzepte sind gleich, Syntax variiert! + +### πŸ§ͺ Praxis 2.2: Typische Fehler + +```c +// C-Fehler +int a = 2147483647; +int b = a + 1; // Was ist b nun? +``` + +**Antwort:** Überlauf (Overflow). `b` wird -2147483648 (Integer Overflow) + +**Universelles Konzept:** Alle Typen haben Grenzen. Kenne deine Grenzen! + +--- + +## πŸ”„ Modul 3: Flusskontrolle universell + +### Konzept: Programme = Sequenz + Auswahl + Wiederholung + +**Strukturdiagramm:** + +``` +SEQUENZ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β” +β”‚Aktionβ”‚ +β””β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β” +β”‚Aktionβ”‚ +β””β”€β”€β”€β”€β”€β”€β”˜ + +AUSWAHL (if/else) + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚Bedingung?β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚Ja β”‚Nein + β–Ό β–Ό +β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” +β”‚Dannβ”‚ β”‚Sonstβ”‚ +β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ + +WIEDERHOLUNG (loops) + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚Bedingung?│←────┐ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚Ja β”‚Nein + β–Ό β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β” β”‚ +β”‚Body β”‚β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +β””β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 🎯 Interaktive Übung 3.1: Struktur erkennen + +Welche Struktur hat dieser Code? + +```c +// Code A +for (int i = 0; i < 10; i++) { + if (i % 2 == 0) continue; + printf("%d ", i); +} + +// Code B +int x = 5; +if (x > 0) { + if (x < 10) { + printf("Im Bereich"); + } +} + +// Code C +while (1) { + char c = getchar(); + if (c == 'q') break; + process(c); +} +``` + +
+LΓΆsungen + +- **Code A:** Wiederholung (for) + Auswahl (if) + Sprung (continue) +- **Code B:** Verschachtelte Auswahl (nested if) +- **Code C:** Endlosschleife (while(1)) + Abbruchbedingung (break) + +**Universell:** `for`, `while`, `if`, `break`, `continue` existieren in fast allen Sprachen mit Γ€hnlicher Semantik. +
+ +--- + +## πŸ”§ Modul 4: Funktionen als Abstraktion + +### Konzept: Funktionen kapseln KomplexitΓ€t + +**Analogie:** Funktion = Rezept +- **Eingabe:** Zutaten (Parameter) +- **Prozess:** Anleitung (FunktionskΓΆrper) +- **Ausgabe:** Gericht (Return-Wert) + +### 🎯 Interaktive Übung 4.1: Black-Box-Denken + +Betrachte diese Funktion: + +```c +int mystery(int a, int b) { + int result = 0; + while (b != 0) { + if (b & 1) result += a; + a <<= 1; + b >>= 1; + } + return result; +} +``` + +**Ohne Code zu analysieren:** Was kΓΆnnte diese Funktion tun? + +
+Tipp + LΓΆsung + +**Tipp:** Teste mit Werten: +- `mystery(3, 4)` β†’ ? +- `mystery(5, 5)` β†’ ? + +**LΓΆsung:** Es ist die **Γ€gyptische Multiplikation** (schnelle Multiplikation ohne `*`). + +**Konzept:** Funktionen sind Black Boxes. Verstehe Input/Output, nicht unbedingt Implementation. +
+ +### πŸ§ͺ Praxis 4.2: Design by Contract + +```c +/** + * Berechnet den Durchschnitt eines Arrays. + * + * PRECONDITION: array != NULL, size > 0 + * POSTCONDITION: RΓΌckgabe = Summe(array) / size + * + * @param array Nicht-leeres Array von double + * @param size Anzahl der Elemente (> 0) + * @return Durchschnittswert + */ +double average(const double* array, size_t size); +``` + +**Universelles Konzept:** Design by Contract (Eiffel, aber ΓΌberall anwendbar) + +--- + +## πŸ“¦ Modul 5: Datenstrukturen + +### Konzept: Strukturen organisieren Daten + +**Evolution:** + +```c +// 1. Primitive +int score = 100; + +// 2. Array (Sammlung gleicher Typen) +int scores[5] = {100, 95, 87, 92, 88}; + +// 3. Struct (Zusammengesetzter Typ) +typedef struct { + char name[50]; + int scores[5]; + float average; +} Student; + +// 4. Dynamische Struktur (Linked List) +typedef struct Node { + Student data; + struct Node* next; +} Node; +``` + +**Universelle Datenstrukturen:** +| Struktur | Verwendung | Sprachen | +|----------|-----------|----------| +| Array | Indexierter Zugriff | Alle | +| Linked List | EinfΓΌgen/LΓΆschen | C, C++, Java | +| Stack | LIFO (Undo, Parsing) | Alle (meist builtin) | +| Queue | FIFO (Scheduling) | Alle | +| Hash Map | SchlΓΌssel-Wert Lookup | Python, JS, Java, C++ | +| Tree | Hierarchien | Alle | + +### 🎯 Interaktive Übung 5.1: Struktur wΓ€hlen + +**Szenarien:** Welche Datenstruktur? + +1. **Browser-History (Back/Forward)** β†’ ? +2. **Druck-Warteschlange** β†’ ? +3. **WΓΆrterbuch (Wort β†’ Definition)** β†’ ? +4. **DOM-Elemente einer Webseite** β†’ ? + +
+Antworten + +1. **Stack** (LIFO - letzter Besuch zuerst zurΓΌck) +2. **Queue** (FIFO - erste Anfrage zuerst drucken) +3. **Hash Map/Dictionary** (O(1) Lookup) +4. **Tree** (hierarchische Struktur, Parent-Child) + +**Konzept:** Datenstrukturen sind sprachunabhΓ€ngige Muster! +
+ +--- + +## 🎯 Modul 6: Pointer & Referenzen + +### Konzept: Indirektion ist universell + +**Die 3 Ebenen:** + +``` +Wert ──────→ Variable ──────→ Pointer + β”‚ β”‚ β”‚ + β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό + 42 int x int* p + x = 42 p = &x + *p = 42 +``` + +**In verschiedenen Sprachen:** + +| Sprache | Konzept | Syntax | +|---------|---------|--------| +| C | Pointer | `int* p = &x;` | +| C++ | Reference | `int& r = x;` | +| Python | Name/Referenz | `a = b` (referenziert selbes Objekt) | +| Java | Reference | `Object o = obj;` | +| Rust | Borrowing | `&x` (immutable), `&mut x` (mutable) | +| Go | Pointer | `p := &x` | + +### 🎯 Interaktive Übung 6.1: Pointer-Diagramm + +Zeichne fΓΌr diesen Code: + +```c +int a = 5; +int b = 10; +int* p = &a; +int* q = &b; +p = q; +*p = 20; +``` + +**Fragen:** +1. Was ist `a`? +2. Was ist `b`? +3. Was ist `*p`? +4. Was ist `*q`? + +
+Diagramm + LΓΆsung + +``` +Initial: +β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” +β”‚ a β”‚ 5 β”‚ b β”‚ 10 +β”‚(0x100)β”‚ β”‚(0x104)β”‚ +β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ + +p = &a: +β”Œβ”€β”€β”€β”€β”€β” +β”‚ p │───→ β”Œβ”€β”€β”€β”€β”€β” +β”‚(0x200)β”‚ β”‚ a β”‚ 5 +β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ + +q = &b: +β”Œβ”€β”€β”€β”€β”€β” +β”‚ q │───→ β”Œβ”€β”€β”€β”€β”€β” +β”‚(0x204)β”‚ β”‚ b β”‚ 10 +β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ + +p = q: +β”Œβ”€β”€β”€β”€β”€β” +β”‚ p │──┐ +β”‚(0x200)β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”˜ β”‚ +β”Œβ”€β”€β”€β”€β”€β” β”‚ +β”‚ q β”‚β”€β”Όβ”˜ +β”‚(0x204)β”‚ β”Œβ”€β”€β”€β”€β”€β” +β””β”€β”€β”€β”€β”€β”˜ └──→│ b β”‚ 10 + β”‚(0x104)β”‚ + β””β”€β”€β”€β”€β”€β”˜ + +*p = 20: + β”Œβ”€β”€β”€β”€β”€β” + β”‚ b β”‚ 20 ←── p und q zeigen hierhin! + β”‚(0x104)β”‚ + β””β”€β”€β”€β”€β”€β”˜ +``` + +**Antworten:** +1. `a` = 5 (unverΓ€ndert!) +2. `b` = 20 (verΓ€ndert via *p) +3. `*p` = 20 +4. `*q` = 20 + +**Konzept:** Pointer sind Adressen. Mehrere Pointer kΓΆnnen auf dieselbe Adresse zeigen (Aliasing). +
+ +--- + +## πŸ—οΈ Modul 7: Von structs zu Objekten + +### Konzept: Daten + Verhalten = Objekt + +**Evolution in C β†’ C++:** + +```c +// C: Daten und Funktionen getrennt +typedef struct { + float x, y; +} Point; + +float point_distance(Point* a, Point* b) { + return sqrt((a->x - b->x) ** 2 + ...); +} +``` + +```cpp +// C++: Daten und Verhalten zusammen +class Point { +private: + float x, y; + +public: + Point(float x, float y) : x(x), y(y) {} + + float distanceTo(const Point& other) const { + return sqrt((x - other.x) ** 2 + ...); + } +}; +``` + +**Universelles OOP-Konzept:** +- **Kapselung:** Daten schΓΌtzen (private/public) +- **Abstraktion:** Wie etwas funktioniert ist egal +- **Vererbung:** "Ein Hund IST EIN Tier" +- **Polymorphie:** Gleiche Schnittstelle, verschiedene Implementationen + +### 🎯 Interaktive Übung 7.1: OOP-Konzepte zuordnen + +```cpp +class Animal { +public: + virtual void speak() = 0; // Was ist das? +}; + +class Dog : public Animal { // Was ist das? +private: + string name; // Was ist das? + +public: + void speak() override { // Was ist das? + cout << "Wuff!" << endl; + } +}; +``` + +
+LΓΆsungen + +- `virtual ... = 0` β†’ **Abstrakte Methode** (Polymorphie) +- `class Dog : public Animal` β†’ **Vererbung** (Dog IST EIN Animal) +- `private: string name` β†’ **Kapselung** (Daten geschΓΌtzt) +- `void speak() override` β†’ **Polymorphe Implementation** + +**Konzept:** Diese 4 Prinzipien existieren in Python, Java, C#, Ruby, Swift... nur Syntax variiert! +
+ +--- + +## 🎨 Modul 8: Modularisierung & Design + +### Konzept: Trennung von Belangen (Separation of Concerns) + +**Schichten-Architektur (universell):** + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Presentation β”‚ ← UI, Output +β”‚ (View/Controller) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Business Logic β”‚ ← Verarbeitung +β”‚ (Model/Services) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Data Access β”‚ ← Datenbank, Files +β”‚ (Repository/DAO) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Infrastructure β”‚ ← Logging, Config +β”‚ (Utils/Helpers) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**In C:** +``` +src/ +β”œβ”€β”€ main.c # Einstieg +β”œβ”€β”€ ui/ # Presentation +β”‚ β”œβ”€β”€ display.c +β”‚ └── input.c +β”œβ”€β”€ core/ # Business Logic +β”‚ β”œβ”€β”€ calculator.c +β”‚ └── validator.c +β”œβ”€β”€ data/ # Data Access +β”‚ β”œβ”€β”€ file_io.c +β”‚ └── database.c +└── utils/ # Infrastructure + β”œβ”€β”€ logger.c + └── config.c +``` + +**In C++:** +``` +src/ +β”œβ”€β”€ main.cpp +β”œβ”€β”€ view/ # Presentation (MVC) +β”œβ”€β”€ controller/ # Flow Control +β”œβ”€β”€ model/ # Business Logic +β”œβ”€β”€ repository/ # Data Access +└── utils/ # Infrastructure +``` + +### 🎯 Interaktive Übung 8.1: Design Patterns + +**WΓ€hle das passende Pattern:** + +| Problem | Pattern | Beschreibung | +|---------|---------|--------------| +| Genau eine DB-Verbindung | Singleton | Nur eine Instanz erlaubt | +| Verschiedene Zahlungsmethoden | Strategy | Austauschbare Algorithmen | +| Objekte ohne `new` erstellen | Factory | Zentralisierte Erstellung | +| Schritte A β†’ B β†’ C ausfΓΌhren | Template Method | Algorithmus-Skelett | + +**Konzept:** Design Patterns sind sprachunabhΓ€ngige LΓΆsungen fΓΌr wiederkehrende Probleme! + +--- + +## πŸš€ Final-Projekt: SprachunabhΓ€ngige Anwendung + +### Aufgabe: Todo-App mit mehreren Implementationen + +**Anforderungen (sprachunabhΓ€ngig):** +1. CRUD-Operationen fΓΌr Todos +2. Speicherung (File oder Memory) +3. CLI-Interface +4. Modularer Aufbau + +**Implementiere in:** +- **Version A:** C (Structs, Function Pointers) +- **Version B:** C++ (Klassen, STL) +- **(Optional) Version C:** Python oder JavaScript + +**Der Test:** Vergleiche die Implementationen. Welche Konzepte sind gleich? Was unterscheidet sich? + +--- + +## πŸ“ Checkpoints & SelbsteinschΓ€tzung + +### Checkpoint A (nach Modul 2) +**Fragen:** +- [ ] Ich kann Stack vs Heap erklΓ€ren +- [ ] Ich kenne die Grenzen primitiver Typen +- [ ] Ich verstehe, warum Konzepte wichtiger sind als Syntax + +### Checkpoint B (nach Modul 4) +**Mini-Projekt:** Schreibe einen Taschenrechner mit: +- MenΓΌ (Sequenz/Auswahl) +- Mathematische Funktionen (Abstraktion) +- Fehlerbehandlung + +### Checkpoint C (nach Modul 6) +**Datenstruktur:** Implementiere eine dynamische Liste (wie `std::vector` oder Python `list`) in C mit: +- `void list_append(List* list, int value)` +- `int list_get(List* list, size_t index)` +- `void list_remove(List* list, size_t index)` + +### Final Check +- [ ] Ich kann Konzepte auf neue Sprachen ΓΌbertragen +- [ ] Ich verstehe OOP-Prinzipien +- [ ] Ich kann modularen Code strukturieren + +--- + +## πŸ“š Ressourcen & WeiterfΓΌhrendes + +### BΓΌcher +- **"The C Programming Language"** (K&R) - Klassiker +- **"C++ Primer"** (Lippman) - Umfassend +- **"Clean Code"** (Martin) - SprachunabhΓ€ngig! +- **"Design Patterns"** (Gang of Four) - Das Original + +### Online +- **exercism.org** - SprachΓΌbergreifende Übungen +- **leetcode.com** - Algorithmen in beliebiger Sprache +- **codewars.com** - Katas fΓΌr verschiedene Sprachen + +### Praxis-Tipp +> Lerne eine zweite Sprache parallel! Wenn du C lernst, schau dir Python-Γ„quivalente an. Die Kontraste machen die Konzepte klarer. + +--- + +## 🎯 Abschluss + +**Die wichtigste Erkenntnis:** + +> Programmieren ist nicht das Lernen von Syntax. Es ist das Verstehen von Konzepten, die in jeder Sprache wiederkehren – nur mit anderem "Akzent". + +Wenn du diesen Kurs durchgearbeitet hast, kannst du: +- Jede neue Sprache schneller lernen (Konzepte bereits bekannt) +- Bessere Architektur-Entscheidungen treffen +- SprachΓΌbergreifend als Entwickler arbeiten + +**Viel Erfolg! πŸš€**