
Das ist das letzte Arbeitsblatt des Kurses — und eines der wichtigsten! Du lernst heute, wie echte C-Projekte strukturiert sind. Schreibe eigene Header-Dateien, implementiere Module und baue ein komplettes Drei-Datei-Projekt. Das ist das, was professionelle Entwickler jeden Tag tun. 💪
Verstehen: Gehört in .h oder .c?
Unten siehst du verschiedene Code-Fragmente. Ordne jedes zu: Schreibe H (Header/.h) oder C (Quelldatei/.c) in die Spalte "Gehört in".
| Code-Fragment | Gehört in | Begründung |
|---|---|---|
int berechne(int x, int y); |
||
int berechne(int x, int y) { return x * y + 2; } |
||
#define MAX_WERT 100 |
||
typedef struct { int x; int y; } Punkt; |
||
int zaehler = 0; (Globale Variable) |
||
extern int zaehler; |
||
static void hilfs_funktion() { ... } |
||
void drucke_ergebnis(float wert); |
Include Guard schreiben
Schreibe den vollständigen Include Guard für eine Header-Datei namens geometrie.h. Der Guard soll die Konvention für den Makro-Namen einhalten. Fülle die Lücken aus:
Erkläre in eigenen Worten, was passiert wenn geometrie.h zweimal von verschiedenen Dateien eingebunden wird:
Header-Datei schreiben: string_utils.h
Schreibe eine vollständige Header-Datei string_utils.h mit den folgenden Anforderungen:
- Include Guard für
STRING_UTILS_H - Include für
<stddef.h>(für den Typsize_t) - Deklaration:
int count_chars(char *s, char c)— zählt wie oft Zeichen c in s vorkommt - Deklaration:
void reverse_string(char *s)— kehrt den String in-place um - Deklaration:
int is_palindrome(char *s)— gibt 1 zurück wenn s ein Palindrom ist, sonst 0
Implementierung: string_utils.c
Implementiere die drei Funktionen aus Übung 3 in der Datei string_utils.c. Vergiss nicht, am Anfang #include "string_utils.h" und eventuell weitere nötige Includes einzubinden.
Hinweise:
count_chars: Schleife durch den String, Zähler erhöhen wenns[i] == creverse_string: Zwei Zeiger von vorne und hinten, Zeichen tauschen bis sie sich treffenis_palindrome: Nutzereverse_stringoder vergleiche von beiden Enden
Vollständiges 3-Datei-Projekt: geometrie-Modul
Schreibe ein vollständiges Drei-Datei-Projekt für ein geometrie-Modul. Das Modul soll Funktionen für Kreis und Rechteck bereitstellen.
Geforderte Funktionen:
| Funktion | Parameter | Rückgabe |
|---|---|---|
| flaecheKreis | float radius | float — π × r² |
| umfangKreis | float radius | float — 2 × π × r |
| flaecheRechteck | float breite, float hoehe | float — breite × hoehe |
| umfangRechteck | float breite, float hoehe | float — 2 × (breite + hoehe) |
Datei 1 — geometrie.h (Header mit Include Guard und Deklarationen):
Datei 2 — geometrie.c (Implementierung aller vier Funktionen, PI = 3.14159f):
Datei 3 — main.c (Hauptprogramm: berechnet und gibt Ergebnisse für Kreis r=5 und Rechteck 4×7 aus):
GCC-Befehl zum Kompilieren (schreibe den vollständigen Befehl):
Erwartete Ausgabe (berechne selbst oder nutze den Taschenrechner):
Makefile für das geometrie-Projekt
Ein Makefile automatisiert die Kompilierung. Unten ist ein vollständiges Makefile für das Projekt aus Übung 5 — lies es durch und beantworte dann die Fragen.
Beantworte die folgenden Fragen zum Makefile:
1. Was bewirkt der Befehl make ohne Argumente?
2. Warum steht geometrie.h als Abhängigkeit von main.o und geometrie.o?
3. Was macht make clean?
4. Du änderst nur geometrie.c. Welche Dateien muss make neu erzeugen?
Erweitere das Makefile: Füge ein neues Modul statistik (statistik.c / statistik.h) hinzu. Schreibe die zwei neuen Regeln:
Reflexion: Was habe ich gelernt?
- Ich verstehe, warum große Programme in mehrere Dateien aufgeteilt werden
- Ich kann den Unterschied zwischen .h (Deklaration) und .c (Implementierung) erklären
- Ich kann einen korrekten Include Guard schreiben
- Ich kann eine vollständige Header-Datei für ein Modul erstellen
- Ich kann mehrere .c-Dateien mit GCC zu einem Programm kompilieren
- Ich kann ein einfaches Makefile lesen und verstehen
- Ich habe alle 36 Units von "Ömer erklärt C" abgeschlossen! 🎉
✅ Musterlösungen (Kurzübersicht)
Übung 1 — Gehört in .h: Prototyp, #define, typedef struct, extern int zaehler, Prototyp mit void.
Gehört in .c: Funktionsdefinition mit {}, int zaehler = 0; (Definition), static void.
Übung 2 — Include Guard: #ifndef GEOMETRIE_H / #define GEOMETRIE_H / … / #endif /* GEOMETRIE_H */
Übung 5 — GCC-Befehl: gcc main.c geometrie.c -o geometrie (oder mit Makefile: make)
Erwartete Ausgabe: Fläche Kreis (r=5) ≈ 78.54, Umfang Kreis ≈ 31.42, Fläche Rechteck (4×7) = 28.00, Umfang Rechteck = 22.00