Ömer sagt:
Bisher hast du immer nur Variablen gleichen Typs zusammengefasst (Arrays). Was aber wenn du eine Person speichern willst – mit Name, Alter und Note? Dafür gibt es struct! Es ist das Fundament für Klassen in anderen Sprachen. 🏛️
struct definieren
struct-Variablen erstellen
Mitglieder mit . abrufen
typedef für bequeme Syntax
Array von structs
🏛️ Was ist ein struct?
Ein struct (Struktur) fasst verschiedene Datentypen unter einem Namen zusammen – ein eigener, benutzerdefinierter Datentyp:
char
name[30]
→ "Max Mustermann"
#include <stdio.h>
#include <string.h>
typedef struct {
char name[30];
int alter;
float schnitt;
} Schueler;
void zeige_schueler(Schueler s) {
printf("Name: %s | Alter: %d | Ø: %.1f\n",
s.name, s.alter, s.schnitt);
}
int main() {
Schueler s1;
strcpy(s1.name, "Oemer");
s1.alter = 17;
s1.schnitt = 1.8f;
Schueler s2 = {"Anna", 16, 2.3f};
zeige_schueler(s1);
zeige_schueler(s2);
return 0;
}
▶ Ausgabe
Name: Oemer | Alter: 17 | Ø: 1.8
Name: Anna | Alter: 16 | Ø: 2.3
📚 Array von structs
Schueler klasse[3] = {
{"Oemer", 17, 1.8f},
{"Anna", 16, 2.3f},
{"Ben", 17, 1.5f}
};
for (int i=0; i<3; i++)
zeige_schueler(klasse[i]);
✏️ Übungen
Übung 1struct definieren
Definiere eine Struktur Produkt mit den Feldern: Name (char[50]), Preis (float), Lagerbestand (int):
typedef struct {
/* Felder hier */
} Produkt;
Übung 2 – ProgrammProdukt-Verwaltung
Erstelle 3 Produkte als Array und gib alle aus. Berechne auch den Gesamtwert (Preis × Lagerbestand):
#include <stdio.h>
#include <string.h>
typedef struct {
char name[50];
float preis;
int bestand;
} Produkt;
void zeige_produkt(Produkt p) {
printf("%-20s %.2f EUR Bestand: %d\n", p.name, p.preis, p.bestand);
}
int main() {
Produkt lager[3] = {
{"C-Buch", 29.90f, 15},
{"USB-Stick", 12.50f, 42},
{"Laptop", 899.00f, 5}
};
float gesamt = 0;
for (int i = 0; i < 3; i++) {
zeige_produkt(lager[i]);
gesamt += lager[i].preis * lager[i].bestand;
}
printf("Gesamtwert: %.2f EUR\n", gesamt);
return 0;
}
Übung 4 – Bonus
Schüler-Struct mit Notendurchschnitt
Erstelle eine Struct für Schüler mit Name, Klasse und drei Noten. Schreibe eine Funktion, die den Durchschnitt berechnet und alle Schüler nach Durchschnitt sortiert ausgibt:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[30];
char klasse[10];
float noten[3];
} Schueler;
float durchschnitt(Schueler s) {
return (s.noten[0] + s.noten[1] + s.noten[2]) / 3.0f;
}
void zeige(Schueler s) {
printf("%-15s %-6s Noten: %.1f %.1f %.1f Schnitt: %.2f\n",
s.name, s.klasse,
s.noten[0], s.noten[1], s.noten[2],
durchschnitt(s));
}
int main() {
Schueler klasse[] = {
{"Anna Mayer", "3AHIF", {1.0f, 2.0f, 1.0f}},
{"Ben Schmidt", "3AHIF", {3.0f, 2.0f, 4.0f}},
{"Clara Huber", "3AHIF", {2.0f, 1.0f, 2.0f}}
};
int n = 3;
/* Bubble Sort nach Durchschnitt (aufsteigend = beste Note) */
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
if (durchschnitt(klasse[j]) > durchschnitt(klasse[j+1])) {
Schueler tmp = klasse[j];
klasse[j] = klasse[j+1];
klasse[j+1] = tmp;
}
printf("Rangliste:\n");
for (int i = 0; i < n; i++) zeige(klasse[i]);
return 0;
}
Structs können wie normale Variablen kopiert werden (tmp = klasse[j]). Beim Sortieren tauscht man ganze Struct-Objekte – praktisch!