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.
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?
n != 1 den aktuellen Wert von n auf.Vollständige Lösung
| schritte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| n | 6 | 3 | 10 | 5 | 16 | 8 | 4 | 2 | 1 |
Bei n = 1 ist die Bedingung n != 1 falsch, die Schleife endet. → Ausgabe 8
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.
summe und 4? Welche Division rechnet C dann?81 / 4 wird als Ganzzahldivision gerechnet, bevor das Ergebnis in double gespeichert wird.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:
double mittel = (double) summe / 4;
Ausgabe 20.25
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?
double, aber rechne nach, welche Typen in Zeile 4 zusammentreffen.(7 + 8) / 2 = 15 / 2 — beide Operanden sind int.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.
