In diesem Labor werden Sie:
struct Person klasse[30];klasse[i].name - erst Index, dann Komponenteptr->name statt (*ptr).nameErstellen Sie ein Array von Strukturen für 3 Studenten und geben Sie alle Daten aus.
Statt einzelner Variablen können wir viele Strukturen in einem Array speichern:
Student mit name, matrikelnummer, note#include <stdio.h> struct Student { char name[50]; int matrikelnummer; double note; }; int main() { // Array mit 3 Studenten initialisieren struct Student klasse[3] = { {"Anna", 12345, 1.7}, {"Ben", 12346, 2.3}, {"Clara", 12347, 1.0} }; printf("--- Studentenliste ---\n"); for (int i = 0; i < 3; i++) { printf("Student %d: %s, Matr: %d, Note: %.2f\n", i + 1, klasse[i].name, klasse[i].matrikelnummer, klasse[i].note); } return 0; }
Schreiben Sie eine Funktion, die einen Studenten ausgibt (Call by Value).
Bei der Übergabe wird eine Kopie der gesamten Struktur erstellt:
zeigeStudent(struct Student s)#include <stdio.h> struct Student { char name[50]; int matrikelnummer; double note; }; // Funktion: Struktur als Parameter (Call by Value) void zeigeStudent(struct Student s) { printf("Name: %s\n", s.name); printf("Matrikelnummer: %d\n", s.matrikelnummer); printf("Note: %.2f\n", s.note); printf("---\n"); } int main() { struct Student klasse[3] = { {"Anna", 12345, 1.7}, {"Ben", 12346, 2.3}, {"Clara", 12347, 1.0} }; printf("=== Alle Studenten ===\n"); for (int i = 0; i < 3; i++) { zeigeStudent(klasse[i]); // Kopie wird übergeben } return 0; }
Verwenden Sie einen Zeiger auf eine Struktur und den Pfeil-Operator.
Bei Zeigern auf Strukturen verwenden wir -> statt dem Punkt:
#include <stdio.h> struct Student { char name[50]; int matrikelnummer; double note; }; int main() { struct Student s = {"Max", 99999, 2.0}; // Zeiger auf die Struktur struct Student *ptr = &s; // Zugriff mit Pfeil-Operator printf("Name: %s\n", ptr->name); printf("Matrikel: %d\n", ptr->matrikelnummer); printf("Note vorher: %.2f\n", ptr->note); // Note ändern über Zeiger ptr->note = 1.3; printf("Note nachher: %.2f\n", ptr->note); printf("Original auch geändert: %.2f\n", s.note); return 0; }
Schreiben Sie eine Funktion, die die Note eines Studenten verbessert.
Um das Original zu ändern, übergeben wir die Adresse:
verbessereNote(struct Student *s)#include <stdio.h> struct Student { char name[50]; int matrikelnummer; double note; }; // Call by Reference: Zeiger auf Struktur void verbessereNote(struct Student *s) { s->note -= 0.3; // Minimum ist 1.0 if (s->note < 1.0) { s->note = 1.0; } } int main() { struct Student s = {"Lisa", 11111, 2.0}; printf("Note vorher: %.2f\n", s.note); verbessereNote(&s); // Adresse übergeben! printf("Note nachher: %.2f\n", s.note); // Nochmal verbessern verbessereNote(&s); printf("Nach 2. Verbesserung: %.2f\n", s.note); return 0; }
Finden Sie den Studenten mit der besten Note in einem Array.
#include <stdio.h> struct Student { char name[50]; int matrikelnummer; double note; }; int main() { struct Student klasse[4] = { {"Anna", 12345, 1.7}, {"Ben", 12346, 2.3}, {"Clara", 12347, 1.0}, {"David", 12348, 1.3} }; int n = 4; // Besten finden (kleinste Note = beste) int bestIndex = 0; for (int i = 1; i < n; i++) { if (klasse[i].note < klasse[bestIndex].note) { bestIndex = i; } } printf("Beste/r Student/in: %s mit Note %.2f\n", klasse[bestIndex].name, klasse[bestIndex].note); return 0; }
Schreiben Sie eine rekursive Funktion für einen Countdown.
Jede rekursive Funktion braucht:
countdown(int n) schreiben#include <stdio.h> void countdown(int n) { // Basisfall: Bei 0 aufhören if (n == 0) { printf("Start!\n"); return; } // Rekursionsfall printf("%d...\n", n); countdown(n - 1); // Selbstaufruf mit n-1 } int main() { countdown(5); return 0; }
Berechnen Sie die Fakultät n! rekursiv.
int fakultaet(int n) schreiben#include <stdio.h> int fakultaet(int n) { // Basisfall if (n == 0) { return 1; } // Rekursionsfall: n! = n * (n-1)! return n * fakultaet(n - 1); } int main() { for (int i = 0; i <= 6; i++) { printf("%d! = %d\n", i, fakultaet(i)); } return 0; }
Berechnen Sie die Summe 1 + 2 + 3 + ... + n rekursiv.
#include <stdio.h> int summe(int n) { // Basisfall if (n == 0) { return 0; } // Rekursionsfall: n + Summe der vorherigen return n + summe(n - 1); } int main() { int n = 5; printf("Summe 1 bis %d = %d\n", n, summe(n)); n = 10; printf("Summe 1 bis %d = %d\n", n, summe(n)); return 0; }
| Thema | Wichtige Punkte |
|---|---|
| Array von Strukturen | struct X arr[n]; - Zugriff: arr[i].feld |
| Funktion + Struktur | Call by Value = Kopie, Call by Reference = Adresse (&) |
| Pfeil-Operator | ptr->feld statt (*ptr).feld |
| Rekursion | Funktion ruft sich selbst auf: Basisfall + Rekursionsfall |
| Rekursive Beispiele | Countdown, Fakultät, Summe 1 bis n |