Arrays und Funktionen
Ein Argument kann auch ein Array sein. Eine Funktion, die ein Array bekommt, kann es in einer Schleife durchgehen und zum Beispiel die Summe seiner Elemente zurückgeben:
#include <stdio.h>
int summe(int zahlen[], int anzahl) {
int gesamt = 0;
for (int i = 0; i < anzahl; i++) {
gesamt += zahlen[i];
}
return gesamt;
}
int main(void) {
int punkte[] = {8, 5, 10};
int tore[] = {2, 0, 1, 3, 1};
printf("%d\n", summe(punkte, 3));
printf("%d\n", summe(tore, 5));
return 0;
}Dieses Programm gibt aus:
23
7Der Parameter int zahlen[] ist ein Array von int-Werten. Seine Klammern sind leer, weil die Funktion ein Array beliebiger Größe bekommen kann. Im Aufruf schreibst du nur den Namen des Arrays, ohne Klammern: summe(punkte, 3). Mit Klammern, summe(punkte[], 3), lässt sich das Programm nicht kompilieren: error: expected expression.
Wozu der zweite Parameter, anzahl? Die Funktion weiß nicht, wie viele Elemente das Array hat, also musst du es ihr sagen. Versuche nicht sizeof(zahlen) / sizeof(zahlen[0]) innerhalb der Funktion: Dort ist zahlen nicht wirklich das ganze Array (was es ist, siehst du in der Lektion über Zeiger), deshalb zählt sizeof seine Elemente nicht. Clang warnt nur davor (und diese Seite zeigt keine Warnungen), und die Anzahl kommt falsch heraus (hier 1, die Funktion würde also nur das erste Element addieren). Ermittle die Anzahl dort, wo das Array angelegt wurde, in main, und übergib sie der Funktion. Und achte darauf, dass die Anzahl stimmt: Mit einer größeren Anzahl würde die Funktion über das Ende des Arrays hinaus lesen, ein Fehler, den du aus der Lektion über Arrays kennst.
Beachte, wo das return steht: nach dem }, das die Schleife beendet, wenn alle Elemente addiert sind. Ein häufiger Fehler ist, es eine Zeile höher in die Schleife zu setzen. Es würde dann die ganze Funktion schon im allerersten Durchlauf der Schleife beenden. Hier lässt sich ein solches Programm nicht einmal kompilieren: non-void function does not return a value in all control paths. Bei einer Anzahl von 0 würde die Schleife gar nicht laufen, und die Funktion käme an ihr Ende, ohne ein return auszuführen.
Zwischen Arrays und Zahlen gibt es einen großen Unterschied. Ein Zahlenparameter bekommt eine Kopie, wie du in der vorigen Übung gesehen hast. Ein Array wird nicht kopiert: Die Funktion bekommt genau das Array, das der Aufrufer übergeben hat. Wenn eine Funktion seine Elemente ändert, bleiben die Änderungen also im Array in main:
#include <stdio.h>
void zu_allen_addieren(int zahlen[], int anzahl, int betrag) {
for (int i = 0; i < anzahl; i++) {
zahlen[i] += betrag;
}
}
int main(void) {
int punkte[] = {5, 8, 7};
zu_allen_addieren(punkte, 3, 10);
for (int i = 0; i < 3; i++) {
printf("%d\n", punkte[i]);
}
return 0;
}Dieses Programm gibt aus:
15
18
17Die Funktion hat zu jedem Element des Arrays punkte in main 10 addiert. Warum sich Arrays so verhalten, erfährst du in der Lektion über Zeiger. Merke dir vorerst, dass eine Funktion die Elemente eines Arrays ändern kann, das du ihr übergibst.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren, weil die Funktion
mittelwertnoch nicht existiert (lies den ersten Fehler). Schreibe sie anstelle des Kommentars: Sie hat zwei Parameter, ein Arrayzahlenvom Typintund seineanzahlvom Typint, und gibt den Mittelwert der Elemente alsdoublezurück: ihre Summe geteilt durchanzahl. Achte auf die Division von Ganzzahlen: Speichere die Summe in einer Variablen vom Typdouble. Das Programm gibt dann die durchschnittlichen Temperaturen von zwei Wochen aus,20.80und12.75. - 2
In der ersten Woche hat das Thermometer jede Temperatur um 1 Grad zu niedrig angezeigt. Schreibe unter
mittelwerteine Funktionzu_allen_addierenmit drei Parametern: ein Arrayzahlenvom Typint, seineanzahlund einbetrag(beideint). Sie addiertbetragzu jedem Element des Arrays und gibt nichts zurück. Rufe am Ende vonmain, vorreturn 0;,zu_allen_addieren(woche1, 5, 1)auf und gib dann den Mittelwert vonwoche1noch einmal aus, auf dieselbe Weise wie oben. Das Programm gibt21.80aus: Die Funktion hat das Array inmaingeändert.