# πŸŽ“ 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! πŸš€**