Strukturen und Funktionen
Eine Struktur kann ein Parameter einer Funktion sein. Statt drei Parametern für den Namen, den Preis und die Anzahl bekommt die Funktion ein Produkt:
#include <stdio.h>
typedef struct {
char name[20];
double preis;
int anzahl;
} Produkt;
double zeilensumme(Produkt artikel) {
return artikel.preis * artikel.anzahl;
}
int main(void) {
Produkt milch = {"Milch", 1.2, 3};
printf("%s: %.2f\n", milch.name, zeilensumme(milch));
return 0;
}Das gibt aus:
Milch: 3.60Die Definition von Produkt muss über der Funktion stehen, weil die Funktion den Typ verwendet. Deshalb werden Strukturen meist ganz oben im Programm definiert, direkt unter den #includes.
Wenn du zeilensumme(milch) aufrufst, bekommt der Parameter artikel eine Kopie der ganzen Struktur: alle ihre Member, auch den Text in name. Das ist wie bei einem int-Parameter und anders als bei einem Array, das eine Funktion ohne Kopieren bekommt. Wenn die Funktion ihren Parameter ändert, ändert sie also nur die Kopie:
#include <stdio.h>
typedef struct {
char name[20];
double preis;
int anzahl;
} Produkt;
void eins_verkaufen(Produkt artikel) {
artikel.anzahl--;
printf("In der Funktion: %d\n", artikel.anzahl);
}
int main(void) {
Produkt milch = {"Milch", 1.2, 3};
eins_verkaufen(milch);
printf("In main: %d\n", milch.anzahl);
return 0;
}Das gibt aus:
In der Funktion: 2
In main: 3Die Funktion hat eine Packung Milch verkauft, aber nur von ihrer Kopie: milch in main hat immer noch 3. In der nächsten Übung siehst du, wie eine Funktion das Original ändern kann. Bei Funktionen, die die Struktur nur lesen, wie zeilensumme, spielt die Kopie keine Rolle.
Auch wenn du eine Struktur mit = einer anderen zuweist, wird sie kopiert. Nach Produkt kopie = milch; hat die Variable kopie ihren eigenen Namen, Preis und ihre eigene Anzahl, und wenn du kopie.anzahl änderst, ändert sich milch nicht. Sogar das Array name darin wird kopiert, obwohl man einem Array allein nichts zuweisen kann. Zwei Strukturen kannst du aber nicht mit == vergleichen: milch == kopie endet mit dem Fehler invalid operands to binary expression ('Produkt' and 'Produkt'). Vergleiche stattdessen die Member, die du brauchst, etwa milch.preis == kopie.preis, und die Namen mit strcmp.
So schreibst du es:
Anweisungen
- 1
Schreibe anstelle des Kommentars eine Funktion
double flaeche(Raum raum), die die Fläche des Raums zurückgibt: seine Breite mal seine Länge. - 2
Gib in der Schleife die Fläche jedes Raums neben seinem Namen mit 2 Nachkommastellen aus und hole sie dir von deiner Funktion
flaeche. Das Programm gibtKüche: 13.50 m2,Schlafzimmer: 14.00 m2undFlur: 9.00 m2aus.