Übungsaufgaben
Zehn Übungen zu Arrays, Indizes und Zeichenketten — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.
Nenne die fehlenden Begriffe, indem du sie in die Lücken setzt — zwei Wörter bleiben übrig.
Ein Array fasst mehrere Werte unter einem Namen zusammen. Der erste Index ist immer ; bei int tage[7]; ist der letzte gültige Index . Eine Zeichenkette ist ein char-Array, das mit dem abschließt. Wie viele Zeichen davor stehen, liefert . Ob zwei Zeichenketten gleich sind, prüfst du mit .
tage[0] bis tage[6]) und Zeichenketten mit == zu vergleichen — das vergleicht nur die Adressen.<string.h> eigene Funktionen — zum Messen und zum Vergleichen.int noten[] = {2, 1, 3, 2, 4, 1};
Gib den Wert des Ausdrucks noten[noten[2]] + noten[5] an.
noten[2] ist 3 (drittes Element!), also wird noten[3] = 2 gelesen. Dazu kommt noten[5] = 1, zusammen 3. Typischer Fehler: noten[2] als zweites Element (1) lesen — dann ergibt sich noten[1] + noten[5] = 2.noten[2] aus — Index ab 0 zählen.char tier[] = "Katze";
Ordne jedem Ausdruck seinen Wert zu.
sizeof um 1 größer als strlen. Typischer Fehler: 5 und 6 vertauschen — strlen zählt das '\0' nicht mit.sizeof misst den belegten Speicher in Byte, strlen zählt die Zeichen bis zum Endezeichen.int z[5] = {5, 2, 7, 7, 3}; int max = z[0], pos = 0; for (int i = 1; i < 5; i++) { if (z[i] > max) { max = z[i]; pos = i; } }
Stelle den Ablauf als Tracetabelle dar: Werte am Ende jedes Schleifendurchlaufs.
i | z[i] | max | pos |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 |
z[3] ist wieder 7, aber 7 > 7 ist falsch — pos bleibt 2. Das Programm merkt sich also das erste Vorkommen des Maximums. Mit >= wäre es das letzte (pos = 3). Typischer Fehler: pos = 3 eintragen.z[0] schon als Startwert in max steht.z[i] > max — echt größer, nicht größer-gleich.Die Funktion zaehle soll zählen, wie oft das Zeichen z in der Zeichenkette s vorkommt. Ergänze die Lücken.
int zaehle(char s[], char z) { int n = 0; for (int i = 0; ; i++) { if () { n++; } } return n; } int main(void) { printf("%d\n", zaehle("Mississippi", )); // Ausgabe: 4 return 0; }
"\0" und "s" wären Zeichenketten, also Adressen. Typischer Fehler: s[i] = z — eine Zuweisung, die fast immer „wahr“ ist. Und die Ausgabe 4 gilt nur für kleines s; 'S' käme gar nicht vor.'x'. Zeichenkette: "x". Vergleich: ==.char gruss[] = "Moin\0Moin"; printf("%zu\n", sizeof(gruss) - strlen(gruss));
Bestimme die Ausgabe. (%zu gibt den Wert von sizeof als ganze Zahl aus.)
\0 in der Mitte zählt als ein Zeichen) und hängt ein weiteres Endezeichen an: sizeof = 10. strlen hört aber am ersten '\0' auf: 4. Ergebnis 10 − 4 = 6. Typischer Fehler: 1 — als wäre sizeof immer strlen + 1.\0 ist ein einzelnes Zeichen mit dem Wert 0 — auch mitten im Text.sizeof: alle Zeichen im Literal plus das angehängte Endezeichen. strlen: Zeichen bis zum ersten Endezeichen.Hier treffen Zeiger aus 2.2.2 auf Arrays: Der Array-Name steht für die Adresse des ersten Elements.
int v[4] = {10, 20, 30, 40}; int *p = v; // Zeile 2 *p = *p + 5; // Zeile 3 p = &v[2]; // Zeile 4 *p = v[1] * 2; // Zeile 5 v[3] = *p - v[0]; // Zeile 6
Ermittle die Werte Schritt für Schritt.
-
v[0]nach Zeile 3 -
*pnach Zeile 4 -
v[2]nach Zeile 5 -
v[3]nach Zeile 6
int *p = v; bedeutet dasselbe wie int *p = &v[0]; — deshalb ändert Zeile 3 das erste Element. Zeile 5 schreibt über p in v[2]: 20 · 2 = 40. Zeile 6: 40 − 15 = 25. Typischer Fehler: in Zeile 6 mit dem alten Wert v[0] = 10 rechnen.*p in jeder Zeile durch das Element, auf das p gerade zeigt.v[0], ab Zeile 4 auf v[2].Das Programm soll Regal rückwärts in rueck kopieren und umgedreht: lageR ausgeben. Überprüfe den Code — drei Zeilen sind fehlerhaft.
rueck[0] wird zum Endezeichen, und printf würde eine leere Zeichenkette ausgeben. Zeile 8 ist dagegen richtig und wichtig — ohne sie fehlt rueck das Endezeichen.wort gelesen wird, und zähle, wie viele Byte rueck braucht.char a[10] = "Rot"; char b[10] = "Rot";
Beurteile die Aussagen über Zeilen, die danach folgen könnten, und markiere alle zutreffenden.
a und b sind zwei verschiedene Arrays an verschiedenen Adressen — == ist deshalb falsch (gcc warnt sogar „comparison between two arrays“). Einem Array kann man nichts zuweisen; kopiert wird mit strcpy. Tückisch ist die letzte Aussage: strcmp liefert bei Gleichheit 0, und 0 ist in C „falsch“.sizeof) gegen Textlänge (strlen).strcmp liefert 0 bei Gleichheit — denk an die Wahrheitswerte aus 2.1.3.int t[4]; char n[6] = "Anna";
Bewerte jede folgende Zeile und lege sie in den passenden Korb.
t[4] und t[-1] übersetzt gcc ohne Fehler, sie überschreiben aber fremden Speicher (undefiniertes Verhalten). "Annika" braucht 7 Byte, n hat nur 6. Die geschweiften Klammern gibt es nur bei der Initialisierung, danach kann man einem Array nichts mehr zuweisen. Typischer Fehler: n[5] = 'x'; für verboten halten — Index 5 ist bei 6 Byte der letzte gültige.t: 0 bis 3, bei n: 0 bis 5.= (außer bei der Deklaration).