30.1.2013
Teil I: Datentypen (20 Punkte) L¨osen sie die Probleme, indem sie die korrekten L¨osungen ankreuzen bzw. in die vorgesehenen Freir¨aume die L¨osungen eintragen. Falsche Markierungen bzw. Eintr¨age f¨uhren zu Punktabzug!
1 Pkt 1. Tragen Sie auf allenSeiten oben rechts Ihren Namen ein!
3 Pkt 2. Geben Sie jeweils an, um was f¨ur eine Art Datentyp es sich handelt:
(a) doubleist ein
(a) Ganzzahltyp (b) Fließkommatyp(c) Zeichentyp (d) Struct (e) Pointertyp (b)int *ist ein
(a) Ganzzahltyp (b) Fließkommatyp(c) Zeichentyp (d) Struct (e) Pointertyp (c) charist ein
(a) Ganzzahltyp (b) Fließkommatyp(c) Zeichentyp (d) Struct (e) Pointertyp
3 Pkt 3. Geben Sie jeweils an, um welchen Datentyp es sich handelt:
(a) int a;Der Ausdruck&ahat den Typ
(a) int (b)long (c)float (d)char (e) int *
(b)int a; float b;Der Ausdrucka+bhat den Typ
(a) int (b)long (c)float (d)char (e) int *
(c) Der Ausdruck’a’hat den Typ
(a) int (b)long (c)float (d)char (e) int *
13 Pkt 4. Richtig oder falsch?
Geben Sie jeweils an, ob die folgenden Aussagen richtig oder falsch sind.
(a) Die Gr¨oße eines Typs in Bytes kann mit dersizeof-Anweisung ermittelt werden, z.B.
sizeof(int).
(b) Die Gr¨oße einer Variable in Bytes kann ebenfalls mit dersizeof-Anweisung ermittelt werden, z.B.int i; int j = sizeof(i).
(c) Die Gr¨oße der primitiven Typen, insbesondere int, ist auf allen Systemen gleich, so dass die Verwendung vonsizeoff¨ur solche Typen ¨uberfl¨ussig ist.
(d) Arrays erlauben die Gruppierung von Elementen gleichen Typs.
(e) Structs erlauben die Gruppierung von Elementen unterschiedlichen Typs.
(f) Die Anzahl Elemente eines Arrays wird in runden Klammern hinter die Variable ge- schrieben, also z.B.int array(10);.
(g) Die Indizies eines Arrays beginnen bei 1 und gehen bis zu der angegebenen Gr¨oße.
(h) sizeof liefert nur bei Structs die Gr¨oße in Bytes zur¨uck, bei Arrays hingegen die Anzahl Elemente.
(i) Bei Arrays als Funktionsparametern wird genau wie bei primitiven Typen eine lokale Kopie erstellt, so daßsizeofauch korrekt auf solchen Array-Parametern funktioniert.
(j) Structs k¨onnen einander zugewiesen werden, also z.B.struct blah s1, s2 = s1;.
(k) Arrays k¨onnen ebenfalls einander zugewiesen werden, also z.B.int a[4], b[4] = a;.
(l) Mit dem Ausdrucksizeof(a)/sizeof(a[0])kann die Anzahl Elemente einer Array- Variablenaermittelt werden.
(m) F¨ur Zeichenketten bietet C den primitiven Typstring, welche mittels der+-Operation sehr bequem miteinander verkettet werden k¨onnen, also z.B.string s1, s2, s3; s1
= s2+s3;
Teil II (Algorithmen)(40 Punkte) In den folgenden Aufgaben m¨ussen Sie unter anderem auch selbst Quellcode schreiben. Benutzen Sie in diesem Fall dazu die mehr als ausreichend großen freien Bereiche unter den Aufgaben.
9 Pkt 1. Tragen Sie in Bezug auf den folgenden Quellcode die fehlenden Texte ein:
1 #include <s t d l i b . h>
2
3 char ∗f x y z (char ∗s1 , char ∗s 2 )
4 {
5 i n t l 1 , l 2 ; 6
7 f o r ( l 1 = 0 ; s 1 [ l 1 ] != ’ \0 ’; l 1 ++);
8 f o r ( l 2 = 0 ; s 2 [ l 2 ] != ’ \0 ’; l 2 ++);
9
10 char ∗e r g = (char ∗) m a l l o c ( l 1+l 2 +1);
11
12 f o r ( l 1 = 0 ; s 1 [ l 1 ] != ’ \0 ’; e r g [ l 1 ] = s 1 [ l 1 ++]);
13 f o r ( l 2 = 0 ; s 2 [ l 2 ] != ’ \0 ’; e r g [ l 1+l 2 ] = s 2 [ l 2 ++]);
14
15 e r g [ l 1+l 2 ] = ’ \0 ’; 16
17 return e r g ; 18 }
(a) Im Quellcode kommen die Datentypen und vor.
(b) Die Bedingung derfor-Schleife in Zeile 7 lautet . (c) Die Initialisierung derfor-Schleife in Zeile 7 lautet .
(d) Die for-Schleifen in Zeile 7 und 8 (als auch 12 und 13) werden aufgrund ihrer Bedingungen solange durchlaufen, bis das der entsprechenden Zeichenkette erreicht ist.
(e) Mit den for-Schleifen in Zeile 7 und 8 wird jeweils die einer Zeichenkette berechnet.
(f) Der Aufruf von malloc reserviert neuen Speicher. Die +1 muss dabei verwendet werden, da Zeichenketten in C immer mit dem besonderen Zeichen beendet werden.
(g) Beim Aufruf vonf xyzmit einem Zeiger auf eine Zeichenkette"Hallo"und einem Zeiger auf eine Zeichenkette" Welt"liefert die Funktion einen Zeiger auf eine Zeichenkette
zur¨uck.
(h) Falls nicht mehr genug Heap-Speicher zur Verf¨ugung steht, liefert malloc NULL zur¨uck. Zum Schutz vor ung¨ultigem Speicherzugriff sollten die Zeilen 11–16 daher in einen if-Block einge- schlossen werden. Die Bedingung muss dabei lauten.
10 Pkt 2. Schreiben Sie eine Funktion, die in einem int-Array nach einem bestimmtem Wert sucht. Ist der
Wert in dem Array vorhanden, soll der entsprechende Index zur¨uckgegeben werden, ansonsten -1.
Frage: Warum ist die R¨uckgabe von 0 statt -1 im Fehlerfall hier nicht angeraten?
10 Pkt 3. Schreiben Sie eine Funktion filter(FILE* infile, FILE* outfile), die alle Ziffern ’0’ . . . ’9’
durch die Buchstaben ’a’ . . . ’j’ ersetzt.
11 Pkt 4. Deklarieren Sie eine Struktur f¨ur eine einfach verkettete Liste, die je Element einenint-Wert enth¨alt.
Schreiben Sie eine Funktion, die eineumgekehrteKopie einer solchen Liste zur¨uckliefert. Im Vergleich zum Original sind also alle Zeiger vertauscht.