Ü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.
Du kennst Schleifen und Verzweigungen schon aus Python. Ordne jeder Python-Zeile die gleichwertige C-Zeile zu.
range(2, 8) mit i <= 8 übersetzen. Die Endgrenze von range gehört nicht mehr dazu, deshalb steht in C <. Bei negativer Schrittweite dreht sich der Vergleich um: i > 0. Aus and, or, not werden in C &&, ||, !.for-Schleife hat drei Teile: Start; Bedingung; Schritt. Lies sie aus dem range ab.range ist die erste Zahl, die nicht mehr drankommt.Gib die fehlenden Begriffe an — zwei Wörter bleiben übrig.
In einem switch springt das Programm zu dem , dessen Wert passt. Fehlt dort ein , läuft es einfach in den nächsten Fall weiter. Passt kein Fall, werden die Anweisungen bei ausgeführt. Eine do … while-Schleife prüft ihre Bedingung jedes Durchlaufs und läuft deshalb mindestens einmal. In C gilt nur der Wert als falsch, jede andere Zahl als wahr.
while-Schleife prüft am Anfang, eine do … while-Schleife am Ende. Und „wahr“ ist in C nicht nur die 1 — auch 7 oder −2 gelten als wahr. Nur 0 ist falsch.switch gibt es drei Schlüsselwörter: eins für jeden Fall, eins zum Verlassen, eins für „sonst“.do … while steht die Bedingung im Quelltext hinter dem Rumpf.Fünf Behauptungen über Bedingungen und Schleifen in C. Nenne jeweils, ob sie stimmt.
> zu <=, nicht zu <. Teste solche Umformungen immer mit dem Grenzwert — hier x = 3.switch vergleicht nur auf Gleichheit mit festen Werten.Der Ausschnitt berechnet die Quersumme einer Zahl.
int zahl = 4735; int summe = 0; while (zahl > 0) { summe = summe + zahl % 10; zahl = zahl / 10; }
Stelle den Ablauf als Tracetabelle dar: Trag für jeden Schleifendurchlauf die Werte ein.
| Durchlauf | zahl % 10 | summe danach | zahl danach |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 |
zahl % 10 liefert immer die letzte Ziffer, zahl / 10 streicht sie (Ganzzahldivision!). Nach dem vierten Durchlauf ist zahl gleich 0, die Bedingung zahl > 0 ist falsch — Quersumme 19. Typischer Fehler: im letzten Durchlauf 0.4 statt 0 eintragen. Bei int gibt es keine Nachkommastellen.int weg.20 16 8 4
Die Schleife soll rückwärts in Viererschritten zählen und dabei alle Zahlen überspringen, die durch 3 teilbar sind. Ergänze die Lücken.
for (int i = ; i 4; ) { if (i % 3 0) { printf("%d ", i); } } printf("\n");
i > 4 oder i != 4 fehlt am Ende die 4 — die Schleife bricht ab, bevor sie ausgegeben wird. Im if muss != stehen: Ausgegeben werden die Zahlen, bei denen der Rest nicht 0 ist. Ein einzelnes = wäre eine Zuweisung, keine Frage.int z = 0; for (int i = 1; i <= 30; i++) { if (i % 4 == 0 || i % 6 == 0) { z++; } } printf("%d\n", z);
Berechne, welche Zahl das Programm ausgibt.
|| nur einmal gezählt: 7 + 5 − 2 = 10. Typischer Fehler: 12 — dabei werden die gemeinsamen Vielfachen doppelt gezählt.if mit || erhöht z pro Durchlauf höchstens einmal.int a = 4, b = 0, c = -2;
Ordne jeden Ausdruck danach ein, ob er in einer Bedingung als wahr oder als falsch gilt.
c allein ist −2 und damit wahr — nur 0 ist falsch. Und a - 4 ergibt 0, ist also falsch, obwohl es gar kein Vergleich ist. Bei a > c && c > b ist der erste Teil wahr, der zweite (−2 > 0) aber falsch — bei && reicht das für „falsch“.! kehrt um: !0 ist 1, ! jeder anderen Zahl ist 0.Das Programm soll für jede Ampelfarbe genau eine Meldung zeigen, dreimal „Blinken“ ausgeben und dann von 5 herunterzählen.
Analysiere den Code — drei Zeilen sind fehlerhaft.
farbe = 2 fällt der Fehler gar nicht auf — das Programm startet ja bei case 2. Teste deshalb jeden Fall einzeln. Zeile 6 ohne break ist dagegen korrekt: Nach dem letzten Fall kommt nichts mehr, in das man „durchfallen“ könnte.Hier kommen die Rechenregeln aus 2.1.2 wieder ins Spiel.
int summe = 0; int k = 0; for (int i = 7; i <= 19; i += 4) { summe += i % 5; k++; } double schnitt = (double) summe / k; printf("%d %d %.2f\n", k, summe, schnitt);
Ermittle Schritt für Schritt, was bei diesem Ausschnitt herauskommt.
-
Wie oft läuft die Schleife? (
k) -
Wert von
summe -
Wert von
schnitt -
Wert von
schnitt, wenn(double)fehlt
7 / 4 ganzzahlig = 1, erst danach wird 1.0 daraus. Typischer Fehler: 15 % 5 übersehen und 1 statt 0 eintragen.i auf, bis die Bedingung i <= 19 falsch wird.Jede Zeile ist ein kurzer Ausschnitt. Beurteile ohne Ausprobieren, wie oft x ausgegeben wird.
int i = 5; while (i < 5) { printf("x"); i++; }
int i = 3; do { printf("x"); i += 2; } while (i < 6);
for (int i = 0; i < 6; i += 2) printf("x");
int i = 1; while (i != 8) { printf("x"); i += 2; }
for (int i = 1; i <= 1; i++) printf("x");
int i = 0; while (i < 3); { printf("x"); i++; }
while (i != 8) springt i von 7 direkt auf 9 und trifft die 8 nie — die Bedingung bleibt immer wahr. Und das Semikolon hinter while (i < 3); ist selbst der (leere) Rumpf: i wird nie erhöht, das Programm hängt, bevor es ein einziges x ausgibt. Diese Falle meldet übrigens gcc -Wall als Warnung (misleading indentation). Die do … while-Schleife läuft für i = 3 und i = 5, also zweimal.i auf, bevor die Bedingung geprüft wird.!= mit Schrittweite 2 und auf ein Semikolon direkt hinter der Bedingung.