Was ist eine Struktur?
In dieser Lektion lernst du, Werte, die zusammengehören, an einer Stelle aufzubewahren. Bisher hat jede Variable einen Wert enthalten und ein Array mehrere Werte desselben Typs. Denk aber an ein Produkt in einem Geschäft: Es hat einen Namen (Text), einen Preis (eine Dezimalzahl) und eine Anzahl, die sagt, wie viele Stück du kaufst (eine Ganzzahl). Mit dem, was du bisher kennst, bräuchtest du drei Variablen:
char brot_name[20] = "Brot";
double brot_preis = 3.5;
int brot_anzahl = 2;Für ein Produkt geht das. Für zehn Produkte bräuchtest du dreißig Variablen, und nur ihre Namen würden dir sagen, welche zusammengehören. Eine Funktion, die ein Produkt ausgibt, bräuchte drei Parameter. Auch ein Array hilft nicht: Alle seine Elemente müssen denselben Typ haben, und ein Name, ein Preis und eine Anzahl haben ihn nicht.
Eine Struktur löst das. Sie fasst mehrere Werte, auch verschiedener Typen, zu einem Ganzen zusammen. Zuerst beschreibst du, was die Struktur enthält:
struct produkt {
char name[20];
double preis;
int anzahl;
};Das ist die Definition einer Struktur. Das Schlüsselwort struct sagt, dass eine Struktur folgt, und produkt ist ihr Name. In den geschweiften Klammern stehen ihre Member (Mitglieder): die Werte, die jedes Produkt hat. Jeder Member wird wie eine Variablendeklaration geschrieben, mit einem Typ und einem Namen, aber ohne Wert. Schreibe die Definition wie bei Funktionen über main, damit der Compiler sie kennt, bevor du sie verwendest.
Die Definition selbst legt keine Variable an und enthält keine Werte. Sie ist wie ein leeres Formular mit den Feldern Name, Preis und Anzahl: Sie sagt nur, was ausgefüllt wird. Sie gibt dir einen neuen Typ, struct produkt, und du kannst Variablen dieses Typs anlegen, genau wie Variablen vom Typ int:
struct produkt brot = {"Brot", 3.5, 2};Die Werte in den geschweiften Klammern füllen die Member in der Reihenfolge aus, in der die Definition sie aufführt: "Brot" kommt in name, 3.5 in preis und 2 in anzahl. Es sieht aus wie das Initialisieren eines Arrays, aber die Werte können verschiedene Typen haben.
Um an einen Member zu kommen, schreibe den Namen der Variablen, einen Punkt und den Namen des Members: brot.preis ist der Preis des Brots. Ein Member wird wie eine gewöhnliche Variable seines Typs verwendet. brot.name ist eine Zeichenkette, also gibst du sie mit %s aus; brot.preis ist ein double, also mit %.2f:
#include <stdio.h>
struct produkt {
char name[20];
double preis;
int anzahl;
};
int main(void) {
struct produkt brot = {"Brot", 3.5, 2};
printf("%s: %.2f, %d Stück\n", brot.name, brot.preis, brot.anzahl);
return 0;
}Das gibt aus:
Brot: 3.50, 2 Stückprintf kann eine ganze Struktur nicht auf einmal ausgeben, genau wie ein ganzes Array nicht. Gib ihre Member einzeln aus.
Der häufigste Fehler ist das Semikolon nach der schließenden geschweiften Klammer. Bei einer Funktion steht dort keins, bei einer Struktur muss eins stehen. Wenn du es im Programm oben weglässt, meldet der Compiler:
main.c:7:2: error: expected ';' after struct
7 | }
| ^
| ;
1 error generated.Die erste Zeile sagt, wo das Problem liegt: in Zeile 7, Spalte 2, direkt nach dem }. Das ^ zeigt auf diese Stelle, und das ; darunter zeigt, was fehlt.
So schreibst du es:
Anweisungen
- 1
Definiere über
maineine Strukturstruct haustierfür ein Haustier mit drei Membern:name(ein Array aus 20 Zeichen,char),alter(eine Ganzzahl,int) undgewicht(eine Dezimalzahl,double). Vergiss das Semikolon nach}nicht. - 2
Lege in
mainanstelle des Kommentars eine Variablerexvom Typstruct haustieran, mit dem Namen"Rex", dem Alter3und dem Gewicht12.5. - 3
Gib darunter eine Zeile über Rex aus:
Rex ist 3 Jahre alt und wiegt 12.5 kg.Lies alle drei Werte aus den Membern vonrexund gib das Gewicht mit%.1faus.