# π 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! π**