MINT üben

Arrays und Zeichenketten

Eine Schul-Wetterstation zählt eine Woche Temperaturen durch, und ein Vokabeltrainer lernt, Wörter richtig zu vergleichen.

Dein Fortschritt:
0 / 0 Aufgaben
1

Eine Woche Wetterdaten

AFB I–II

Die Wetter-AG hat auf dem Schuldach eine Messstation aufgebaut. Jeden Mittag wird die Temperatur in Grad Celsius gespeichert. Mila schreibt ein C-Programm, das für eine Woche den Mittelwert und den wärmsten Tag ausgibt.

C · woche.c
#include <stdio.h>

int main(void)
{
    double temp[7] = {14.5, 17.0, 12.5, 19.5, 21.0, 16.5, 18.0};
    int n = sizeof(temp) / sizeof(temp[0]);
    int imax = 0;
    double summe = 0.0;
    for (int i = 0; i < n; i++) {
        summe = summe + temp[i];
        if (temp[i] > temp[imax]) {
            imax = i;
        }
    }
    printf("Mittelwert: %.1f Grad\n", summe / n);
    printf("Maximum: %.1f Grad am Tag %d\n", temp[imax], imax + 1);
    return 0;
}

Ihr Mitschüler Paul ändert die Schleifenbedingung zu i <= n, „damit auch der letzte Tag sicher dabei ist“. Das Programm lässt sich ohne Warnung übersetzen. Beim ersten Start erscheint als Mittelwert eine riesige negative Zahl mit über 80 Stellen, beim zweiten Start wieder 17.0.

Das Array im Speicher
double temp[7]Tag 114.5[0]Tag 217.0[1]Tag 312.5[2]Tag 419.5[3]Tag 521.0[4]Tag 616.5[5]Tag 718.0[6]Index
Die sieben Werte liegen lückenlos hintereinander; über jeder Zelle steht der Tag, darunter der Index.
  1. Geben Sie den Wert von temp[2], den größten zulässigen Index sowie die Werte von sizeof(temp) und n an (typische Größen).
  2. Ermitteln Sie die Ausgabe des Programms. Halten Sie dabei fest, bei welchem Schleifendurchlauf sich imax ändert.
  3. Begründen Sie, warum der Compiler Pauls Fehler nicht meldet und warum sich das Programm bei jedem Start anders verhalten kann.

Hinweise

Hinweis zu Aufgabe a)
Der Index beginnt bei 0. Ein double belegt typisch 8 Byte.
Hinweis zu Aufgabe b)
Legen Sie eine Tabelle mit den Spalten i, temp[i], summe und imax an. imax ändert sich nur, wenn ein Wert größer als das bisherige Maximum ist.
Hinweis zu Aufgabe c)
Welcher Index wird im letzten Durchlauf mit i <= n benutzt? Prüft C beim Zugriff temp[i], ob der Index gültig ist?