MINT üben

Programmieren mit C & C++

Zehn Aufgaben zum Anwenden — Code verfolgen, Fehler finden, Werte ergänzen, quer durch C und C++.

Dein Fortschritt:
0 / 0 Aufgaben
2

Aufgabenblock — AFB II

Zehn Aufgaben zum Anwenden: Code Schritt für Schritt verfolgen, Fehler finden, fehlende Werte ergänzen. Nutze die gestuften Tipps erst, wenn du wirklich festhängst — und schreib die Tracetabellen auf Papier mit, wie in der Arbeit.

A1
Eine while-Schleife verfolgen
AFB II
C
int n = 6;
int schritte = 0;
while (n != 1) {
    if (n % 2 == 0) {
        n = n / 2;
    } else {
        n = 3 * n + 1;
    }
    schritte++;
}
printf("%d\n", schritte);

Stelle den Ablauf als Tracetabelle mit den Spalten n und schritte dar. Welcher Wert wird ausgegeben?

Schreibe vor jeder Prüfung der Bedingung n != 1 den aktuellen Wert von n auf.
Gerade Zahlen werden halbiert, ungerade werden zu 3 · n + 1. Beginne mit 6 → 3 → 10 → …
Folge: 6, 3, 10, 5, 16, 8, 4, 2, 1 — zähle die Pfeile.
Vollständige Lösung
schritte012345678
n63105168421

Bei n = 1 ist die Bedingung n != 1 falsch, die Schleife endet. → Ausgabe 8

A2
Ein Mittelwert, der nicht stimmt
AFB II
C
int werte[4] = {18, 21, 19, 23};
int summe = 0;
for (int i = 0; i < 4; i++) {
    summe += werte[i];
}
double mittel = summe / 4;
printf("%.2f\n", mittel);

Die Wetter-AG will die mittlere Temperatur von vier Messungen ausgeben. Erkläre, warum das Programm einen falschen Wert anzeigt. Gib den ausgegebenen und den richtigen Mittelwert an.

Welchen Typ haben summe und 4? Welche Division rechnet C dann?
Die Summe ist 81. 81 / 4 wird als Ganzzahldivision gerechnet, bevor das Ergebnis in double gespeichert wird.
Ausgabe 20.00; richtig ist 81 / 4 = 20,25.
Vollständige Lösung

18 + 21 + 19 + 23 = 81. Weil summe und 4 beide int sind, rechnet 81 / 4 ganzzahlig = 20. Erst danach wird 20 in mittel umgewandelt — die Nachkommastellen sind schon verloren. Ausgabe: 20.00.

Korrektur mit Cast vor der Division:

C
double mittel = (double) summe / 4;

Ausgabe 20.25

A3
Fehler in einer Funktion
AFB II
C · durchschnitt.c
 1#include <stdio.h>
 2
 3double durchschnitt(int a, int b) {
 4    return (a + b) / 2;
 5}
 6
 7int main(void) {
 8    printf("%.1f\n", durchschnitt(7, 8));
 9    return 0;
10}

Die Funktion soll den Durchschnitt zweier ganzer Zahlen liefern. Überprüfe das Programm: Welche Zahl gibt es aus, und in welcher Zeile steckt der Fehler?

Der Rückgabetyp ist zwar double, aber rechne nach, welche Typen in Zeile 4 zusammentreffen.
(7 + 8) / 2 = 15 / 2 — beide Operanden sind int.
Ganzzahldivision 15 / 2 = 7, Ausgabe 7.0; Zeile 4.
Vollständige Lösung

(a + b) / 2 rechnet mit zwei int-Werten: 15 / 2 = 7. Erst beim return wird 7 in 7.0 umgewandelt. Der Rückgabetyp double allein rettet nichts.

Fehler in Zeile 4. Richtig: return (a + b) / 2.0; oder return (double) (a + b) / 2; → Ausgabe 7.5.