Startseite
Über Mich
AHP4
Galerie
Sehschlangen
Tourenbuch
Bookmarks
Elektronik
Gästebuch
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 : 26-Dez-2016
Copyright Jens Köhler, Velpke, Steinbruchstraße 1