Startseite
Über Mich
AHP4
Galerie
Sehschlangen
Tourenbuch
Bookmarks
Elektronik
Bewertung
Geschichten
|
Klausur des Programmierkurses C WS97/98
1.a) | Was versteht man unter dem Turnaround-Zyklus eines C-Compilers? |
3 Punkte |
1.b) | Nenne die Hauptaufgaben des Präprozessors! |
3 Punkte |
2.a) | Welche Datentypen werden zur Darstellung von Fließkommazahlen eingesetzt? |
2 Punkte |
2.b) | Nenne drei strukturierte Datentypen! |
2 Punkte |
2.c) | Welche Schritte werden bei der Deklaration von
int a[10]; durchgeführt? |
5 Punkte |
2.d) | Erkläre den Unterschied zwischen einer
statischen und einer dynamischen Speicherverwaltung! |
5 Punkte |
2.e) | Worin unterscheiden sich lokale und globale Variablen? |
3 Punkte |
2.f) | Was versteht man unter formalen und
was unter einem aktuellen Parameter? |
5 Punkte |
2.g) | Wie wird eine Zeichenkette dargestellt?
Was muß man bei der Arbeit mit Zeichenketten
beachten? |
5 Punkte |
3.a) | Erkläre die Auswertung des Ausdrucks
a=b--; , wobei int a, b=5;! |
6 Punkte |
3.b) | Welche Schleifenbefehle gibt es in C?
Erkläre die Syntax der while-Schleife! |
3 Punkte |
3.c) | Was versteht man unter dem Problem des
dangling else (herumhängendes else)
und wie wird dieses gelöst? |
5 Punkte |
3. d) | Wann wird eine switch-case-Anweisung eingesetzt? |
4 Punkte |
4.a) | Was ist ein Zeiger? Erkläre die
unären Operatoren, die auf Zeiger anwendbar sind! |
5 Punkte |
4.b) | Was versteht man unter Zeigerarithmetik?
Welche Operationen sind dabei zugelassen? |
4 Punkte |
4.c) | Erkläre die Syntax und die Funktion von malloc()! |
5 Punkte |
4.d) | Es sei folgende Funktion gegeben :
int strlen( char *s) { int i=0; *******; return i; }.
Ersetze die *-Zeile durch einen einzeiligen
Schleifenkonstrukt, mit dem die
Länge des Strings s bestimmt werden kann! |
5 Punkte |
4.e) | Welche Übergabemechanismen für
Parameter bei Funktionsaufrufen sind
allgemein bekannt?
Welche davon werden in C verwendet? |
3 Punkte |
4.f) | Wie muß die main-Funktion definiert
werden, damit man mit Kommandozeilenparametern
arbeiten kann? |
3 Punkte |
5.a) | Welche sind die Hauptmerkmale der
High-Level-Dateibearbeitung in C? |
5 Punkte |
5.b) | Welcher Befehl wird für die wahlfreie
Positionierung (relativ zur aktuellen Position)
des Dateizeigers benutzt? |
3 Punkte |
5.c) | Was versteht man unter einer typisierten Datei? |
3 Punkte |
6.a) | In welchen Fällen wird die Anweisung
fprintf() statt printf() verwendet? |
3 Punkte |
6.b) | Wie werden 2 Arrays int a[10] und int b[10]
verglichen? |
3 Punkte |
6.c) | Erkläre den Zusammenhang zwischen
Arrays und Zeigern! |
5 Punkte |
Lösungen
1.a) | Stationen der Compilierung:
- Editor
- Präprozessor (Makros übersetzen)
- Compiler (C-Quelltext in Assembler)
- Assembler (=> Maschinensprache)
- Linker
|
1.b) |
- Textuelles Ersetzen von Makros (#define)
- Einbinden von Header-Files (z.B. #include )
- Bedingtes Compilieren (#ifdef - #endif)
- Pragma-Anweisungen (#pragma)
|
2.a) | float und double |
2.b) | struct, union und das Array (z.B. int a[10];) |
2.c) |
- Es wird Speicher für 10 Elemente vom Typ int beschafft. (10 * sizeof(int))
- Bezeichner a zeigt auf das erste Element a[0];
|
2.d) | Bei statischer Verwaltung wird der Umfang einer Datenmenge zur Kompilierung
festgelegt, läßt sich bei Programmablauf nicht mehr ändern:
Entweder wird zu wenig Speicher benutzt, oder Speicherplatz fehlt.
Bei dynamischer Verwaltung wird der Speicherplatz bei Programmablauf
angefordert, es wird daher der angeforderte Speicher auch immer
ausgenutzt, dies ist speichereffizienter. |
2.e) | Unterscheiden sich in Sichtbarkeit und Lebensdauer
lokale sind nur dort sichtbar, wo sie definiert wurden, das restliche
Programm kann auf sie nicht zugreifen.
Globale Variable sind im ganzen Programm sichtbar. Existieren lokale und
globale Variable mit gleichem Namen, so gilt: Lokal vor global.
lokale Variable werden in der Regel auf dem Stack angelegt, nach Verlassen
der Funktion existieren sie nicht mehr, während globale Variable
während der gesamten Laufzeit des Programms exisiteren. | >
2.f) | Der formale Parameter befindet sich in der Funktionsdefinition. Der
aktualle Parameter ist der Wert, der beim Funktionsaufruf tatsächlich
übergeben wird.
|
2.g) | Eine Zeichenkette wird als Array von char dargestellt. Zu beachten:
Es muß immer ein Byte (char) mehr reserviert werden als Zeichen
hineinkommen sollen, da ans Ende immer ein NULL-Byte angehängt wird
(´/0´)
|
3.a) |
- b wird a zugewiesen, a ist jetzt 5
- Nebeneffekt: b wird dekrementiert und erhält den Wert 4
- a=5, b=4
|
3.b) | Es gibt for, do-while und while.
for und while sind kopfgesteuert.
do-while ist fußgesteuert.
Syntax von while:
while (bedingung)
anweisung;
Solange die Bedingung erfüllt ist, wird anweisung ausgeführt. Ist
(bedingung) schon zu Beginn nicht erführt, so wird anweisung
überhaupt nicht ausgeführt.
|
3.c) | Bei zwei hintereinanderfolgenden if-else-Konstruktionen mt nur einem
else kann das else keinen if eindeutig zugordnet werden.
Beispiel:
if (...)
if (...)
anweisung1;
else
anweisung2;
Gelöst wird dies durch die Vereinbarung, daß ein else immer an
das vorhergehende if gebunden wird. |
3.d) | Wird dann eingesetzt, wenn eine Variable ganzzahligen Typs auf
konstante Ausdrücke abgefragt werden soll:
switch (a)
{
case 1:
...
break;
case 2:
...
break;
default:
...
break;
}
|
4.a) | Ein Zeiger ist ein typgebundener Variablentyp, der auf eine Adresse
zeigt.
Unäre Operatoren:
- & ermittelt die Adresse, an der sich ein Zeiger befindet.
- * gibt den Inhalt der Adresse zurück, auf den der Zeiger zeigt.
|
4.b) | Zeigerarithmetik beschreibt Rechenmöglichkeiten mit Zeigern.
mögliche Operationen:
- Addition von Ganzzahlen (int, char) zu einem Zeiger +
- Subtraktion von Ganzzahlen mit einem Zeiger -
- Vergleich von zwei Zeigern (==, !=, <, >, >=, <=)
- Subtraktion/Addition mit typgleichen Zeigern
|
4.c) | Syntax: void *malloc(unsigned long)
Mit malloc() kann ein laufendes Programm Speicherplatz vom System anfordern.
Der Parameter gibt an, wieviele Bytes angefordert werden sollen.
Ist nicht genug Speicher vorhanden, wird NULL zurückgegeben,
ansonsten ein Zeiger (typenlos) auf den Speicherbereich.
Erforderlich für dynamische Datenverwaltung!
|
4.d) | while (s[i]) i++; |
4.e) | allgemeint bekannt:
- CALL BY VALUE, Werte werden direkt übergeben
- CALL BY REFERENCE, Werden werden indirekt mit einer Referenz übergeben.
in C:
- CALL BY VALUE: Werte werden direkt übergeben.
- CALL BY REFERENCE: kann über Zeiger nachgebildet werden
|
4.f) | int main (int argc, char **argv) |
5.a) |
- gepufferte Dateiein- und ausgabe
- Öffnen zum Lesen/Schreiben/Anhängen/Schreiben und Lesen ist sehr einfach
- Daten werden strukturiert in Form von Textzeilen geschrieben/gelesen
|
5.b) | fseek() |
5.c) | Darunter versteht man, wenn mit typisierten Befehlen auf die
Datei zugegriffen werden muß, da die Datei Datensätze (Strukturen)
eines gewissen Datentypes beinhaltet.
|
6.a) |
- Generell zur Ausgabe von formatiertem Text in eine Datei
- Zur Ausgabe von Fehlermeldungen nach stderr, wenn ein Fehelr auftritt
|
6.b) | Es muß elementweise verglichen werden mit einer Schleife
z.B.:
int count = 0;
for (;count < 10; count++)
if (a[count] != b[count])
break;
if (count == 10)
printf("Arrays sind gleich!\n");
else
printf("Arrays sind verschieden!\n");
|
6.c) | Ein Array int a[10] kann auch über Zeiger angesprochen werden.
Der Bezeichner a ist selbst ein Zeiger auf int und zeigt auf das erste
Element a[0].
Es ist auch möglich, einem Zeiger den Anfang des Arrays mitzuteilen.
int a[10], *b;
b = a;
Die andere Richtung ist auch möglich. Auf einen Zeiger kann so
zugegriffen werden, als wäre es ein Array.
Ein Zugriff wie b[20] ist wie *(b + 20).
|
Letzte Änderung : 22-Aug-2023
Copyright Jens Köhler, Wolfsburg, Obere Dorfstraße 10d
|