MINT lernen

Übungen: printf

Warum ist 17 / 5 in C nur 3 — und wie bringst du printf dazu, genau zwei Nachkommastellen zu zeigen?

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zum Klicken, Zuordnen, Nachverfolgen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen dir die gestuften Tipps.

A1
Welcher Typ passt?
AFB I

In C bekommt jede Variable einen festen Typ. Ordne jeden Wert dem Datentyp zu, in dem er ohne Verlust gespeichert wird.

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1int
2double
3char
Zwei Fallen: '7' ist keine Zahl, sondern ein Zeichen — die einfachen Anführungszeichen machen es zum char. Und 100.0 ist wegen des Punkts ein double, obwohl der Wert „glatt“ ist. Negative Zahlen passen problemlos in int.
Ansatz: Achte auf zwei Merkmale: Steht ein Dezimalpunkt in der Zahl? Stehen einfache Anführungszeichen drumherum?
Weiter: In C trennt ein Punkt die Nachkommastellen, kein Komma.
A2
Formatangabe und Ausgabe
AFB I
C · Ausschnitt
int punkte = 85;
double preis = 2.5;
char note = 'B';

Gib zu jedem Aufruf die Ausgabe an, indem du beide verbindest.

Ansatz: Beginne mit %d und %c — die sind eindeutig.
Weiter: %f ohne Zusatz zeigt 6 Nachkommastellen, %.1f genau eine.
A3
Stimmt's? — Variablen in C
AFB I

Fünf Behauptungen über Variablen und Ausgabe. Nenne jeweils, ob sie stimmt.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Merke dir den Unterschied zu Python: Dort darf eine Variable erst eine Zahl und später einen Text enthalten. In C bleibt der Typ fest — und wer einen Kommawert in ein int steckt, verliert still die Nachkommastellen.
Ansatz: Denke an den festen Typ: Was passiert mit Nachkommastellen in einer Ganzzahlvariablen?
Weiter: Einfache Anführungszeichen: genau ein Zeichen (char). Doppelte: ein Text.
A4
Ganzzahldivision und cast
AFB II
C · Deklarationen
int a = 17, b = 5;
double x = 17;

Berechne den Wert jedes Ausdrucks. Schreib Kommazahlen mit Punkt oder Komma.

Füll alle Felder aus und prüfe dann. Enter in einem Feld prüft ebenfalls.
AusdruckWert
a / b
a % b
x / b
(double) a / b
(double) (a / b)
a / 2 * 2
b % a
Die meisten Fehler passieren bei (double) (a / b): Die Klammer wird zuerst ausgewertet — als Ganzzahldivision mit Ergebnis 3. Der cast macht daraus nur noch 3.0. Bei (double) a / b wird dagegen a vor der Division umgewandelt, also 3.4. Und a / 2 * 2 ist nicht 17, sondern 8 · 2 = 16. b % a ist 5: 5 geteilt durch 17 ergibt 0 Rest 5.
Ansatz: Sind beide Operanden ganze Zahlen, ist auch das Ergebnis ganzzahlig — der Rest fällt weg.
Weiter: Ein cast wirkt nur auf das, was direkt dahinter steht: eine Variable oder eine ganze Klammer.
A5
Formatstring für die Wetterstation
AFB II
C · Messwerte
int tag = 12;
double temp = 7.456;
char einheit = 'C';
int feuchte = 64;
Gewünschte Ausgabe
Tag 12: 7.46 C
Luftfeuchte: 64%

Bestimme die Formatangaben so, dass genau diese Ausgabe entsteht.

Wähle in jedem Menü den passenden Eintrag und prüfe dann alle auf einmal.
C · Ausgabe
printf("Tag :  ", tag, temp, einheit);
printf("Luftfeuchte: %d\n", feuchte);
Typischer Fehler: %f für die Temperatur — das ergibt 7.456000. Erst %.2f rundet auf zwei Stellen: 7.46. Beim Prozentzeichen hilft kein Backslash: \% ist keine gültige Escape-Sequenz, gcc warnt. Richtig ist das doppelte %%.
Ansatz: Ordne zuerst die Typen zu: tag ist int, temp ist double, einheit ist char.
Weiter: Zähle die Nachkommastellen in der gewünschten Ausgabe.
A6
Leerzeichen zählen
AFB II
C · Ausgabe
printf("[%9.3f]\n", -2.5);

Die eckigen Klammern zeigen, wo die Ausgabe beginnt und endet. Ermittle, wie viele Leerzeichen zwischen [ und der Zahl stehen.

Zähle selbst und trage das Ergebnis ein — Enter prüft direkt.
Die Zahl wird mit drei Nachkommastellen zu -2.500 — das sind 6 Zeichen, Minuszeichen und Punkt mitgezählt. Die Feldbreite 9 füllt printf von links mit 9 − 6 = 3 Leerzeichen auf: [ -2.500]. Wer das Minus oder den Punkt vergisst, kommt auf 4 oder 5.
Ansatz: Schreib zuerst die Zahl so auf, wie %.3f sie formatiert.
Weiter: Die Feldbreite zählt alle Zeichen: Ziffern, Punkt und Vorzeichen.
A7
Mittelwert mit Tücken
AFB II

Beim Vokabeltrainer werden 23 Punkte aus 4 Runden gemittelt.

C · Ausschnitt
int summe = 23;
int anzahl = 4;
double m1 = summe / anzahl;
double m2 = (double) summe / anzahl;
int rest = summe % anzahl;
printf("%.2f %.2f %d %.2f\n", m1, m2, rest, anzahl * m2);

Wende die Rechenregeln von C auf den Ausschnitt an und gib die Werte Schritt für Schritt an.

Arbeite die Kette Schritt für Schritt ab: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Wert von m1
  2. Wert von m2
  3. Wert von rest
  4. Wert von anzahl * m2
Die Falle steckt in m1: Obwohl die Variable ein double ist, rechnet C summe / anzahl mit zwei int-Werten — das Ergebnis 5 wird erst danach in 5.0 umgewandelt. Entscheidend ist der Typ der Operanden, nicht der Typ der Zielvariablen. Mit dem cast stimmt der Mittelwert: 5.75 · 4 = 23.
Ansatz: Prüfe bei jeder Division: Welchen Typ haben die beiden Werte links und rechts vom /?
Weiter: 23 = 5 · 4 + 3.
A8
Fehlersuche: Mensa-Kasse
AFB III

Die Mensa-Kasse soll ausgeben: Summe: 3.60, Rabatt: 10%, E und eine Kopfzeile mit Tabulator. Untersuche den Code — drei Zeilen sind fehlerhaft.

In diesem Code stecken Fehler. Klicke genau die fehlerhaften Zeilen an — die richtigen musst du stehen lassen.
Zeile 4 sieht verdächtig aus, ist aber korrekt: Bei int * double wird das int automatisch umgewandelt, das Produkt ist 3.6. Gefährlich an den drei Fehlern: gcc gibt nur Warnungen aus und erzeugt trotzdem ein Programm — mit falscher Ausgabe. Deshalb immer mit -Wall übersetzen.
Ansatz: Vergleiche in jeder printf-Zeile die Formatangabe mit dem Typ der Variablen.
Weiter: Achte auf die Art der Anführungszeichen und auf jedes einzelne % im Text.
A9
Wer merkt was?
AFB III Mix

Hier treffen Datentypen auf die Übersetzungsstationen aus 2.1.1. Beurteile die Aussagen und markiere alle, die zutreffen.

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Überraschend für viele: Das Abschneiden in int x = 2.9; ist erlaubt — gcc warnt mit -Wall nicht einmal. Eine nicht deklarierte Variable meldet schon der Compiler (undeclared), denn er prüft jeden Namen in deiner Datei. Der Präprozessor kümmert sich nur um #-Zeilen, und 7 / 2 wäre ohnehin 3.
Ansatz: Ordne jede Aussage einer Station zu: Präprozessor, Compiler oder Linker — und prüfe dann, ob sie stimmt.
Weiter: Eine Warnung stoppt die Übersetzung nicht. Ein char fasst genau ein Zeichen.
A10
Welcher Ausdruck ist größer?
AFB III Trick
C · Deklaration
int a = 9, b = 4;

Vergleiche die Werte der sechs Ausdrücke und sortiere sie aufsteigend — der kleinste Wert steht oben.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1b / a
2a % b
3a / b
4a / (double) b
5a / b * b
6a * 1.0 / b * b
Zwei Ausdrücke sehen aus, als wären sie gleich 9 bzw. ungefähr 0,44 — und genau da steckt die Falle: b / a ist 0 (4 : 9 ergibt 0 Rest 4), und a / b * b ist 2 · 4 = 8, weil der Rest schon bei der Division verloren geht. Erst mit 1.0 bzw. (double) wird mit Nachkommastellen gerechnet: 2.25 und 9. Reihenfolge: 0, 1, 2, 2.25, 8, 9.
Ansatz: Berechne jeden Ausdruck einzeln von links nach rechts und notiere den Wert daneben.
Weiter: Sobald ein double beteiligt ist, bleiben die Nachkommastellen erhalten — vorher nicht.