Sie sind auf Seite 1von 20

Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . .

Seite 2

Aufgabe 1: Multiple Choice zu C und C++ (15 Punkte)


Hinweis: Pro Aufgabe ist angegeben, wieviele Antworten richtig (r) oder falsch (f ) sind.

a) Welche der folgenden Aussagen über die C++-Programmiersprache sind wahr? (w=wahr,
f=falsch)? (2P., 2 zutreffende Antworten)

w f
  C ist eine Erweiterung von C++.
  C++ ist größtenteils zu C kompatibel. Deshalb können in C geschriebene Programme
meist auch mit einem C++-Compiler übersetzt werden.
  Im Gegensatz zu C müssen sich C++-Entwickler nie selbst um dynamische Speicherver-
waltung kümmern, denn C++ hat wie z.B. Java einen Garbage-Collector, der nicht mehr
benötigten Speicher automatisch frei gibt.
  In C++ geschriebene Programme sind schneller als in C geschriebene Programme.

b) p1, p2 und p3 seien bereits initialisierte Zeiger auf Integer. Geben Sie für jede der folgenden
Operationen an, ob sie erlaubt (=w) ist oder nicht (=f) sind. (2P., 1 zutreffende Antwort)
w f w f
  *p3 = p1;   p2 = p1 + 3.0;
  p3 = p2 + p1;   *p3 = *p2 **p1;

c) Es gilt: double d; float f; short s; Tritt bei nachfolgenden Zuweisungen in der Regel
Informationsverlust auf (j=ja, n=nein)? (3P., 3 zutreffende Antworten)
j n j n j n
  d = f;   d = s;   f = s;
  f = d;   s = d;   s = f;

d) Welche der folgenden Aussagen sind wahr (w=wahr, f=falsch)?


(2 P., 2 wahre Antworten)

w f
  Abstrakte Datentypen gibt es in C und C++.
  Klassen in C++ vereinen Daten und Funktionen zum Zugriff und zur Bearbeitung dieser
Daten in einer Struktur.
  Funktionen in C entsprechen Attributen in C++.
  Klassen in C++ haben weniger Funktionalität wie strukturierte Datentypen in C.
  Methoden in C++ erlauben es den Zugriff auf Daten ausschließlich über eine Funktion
zu realisieren.

e) Gegeben sei folgender Code:


 
double x;
typedef struct {int i; double d;} test;
test T, *TP=&T;
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 3

Geben Sie für jede der nachfolgenden Operationen an, ob sie äquivalent zu x = TP->d; ist.
(2P., 2 richtige Antworten)
r f r f
  x = *TP.d;   x = (&TP)->d;
  x = T.d;   x = TP[0].d;

f) Wer gilt als Erfinder der Programmiersprache C? (w=wahr, f=falsch)? (1P., 1 zutreffende
Antwort)

w f
  Kenneth Thompson und Dennis Ritchie
  George Bush und Barack Obama
  Walter Bright und Guido van Rossum
  Brendan Eich und Rasmus Lerdorf
  Larry Wall und Perl Porter

g) Geben Sie für die nachfolgenden Aussagen an, für welche Methode der Parameterüberga-
be (v=„Call by Value“, r=„Call by Reference“) sie jeweils zutreffen. (3P., 3 „Call by Va-
lue“Antworten)

v r
  Eine Kopie der Variablen muss im Speicher angelegt werden.
  Die Menge der übergebenen Daten in Byte variiert mit dem Variablentyp.
  Es werden nicht die Variablen selbst, sondern deren Adresse im Speicher übergeben.
  Die aufgerufene Funktion kann Variablen beim Aufrufer nicht direkt ändern.
  In der Regel die effizientere Methode der Parameterübergabe.
  Array-Variablentypen können so übergeben werden.

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 4

Aufgabe 2: Nachvollziehen von C-Programmen


(13 Punkte)
Hinweis: Alle Teilaufgaben sind unabhängig voneinander lösbar.

a) Präprozessor (2P.)

Gegeben ist folgender Quelltext:


 
1 #include <stdio.h>
2 #define DEFINED
3 #ifdef DEFINED
4 int VALUE = 2;
5 #endif
6 #define FUNCTION(x) x+x
7 #ifndef UNDEFINED
8 int function = FUNCTION(3);
9 #endif
10 int main() {
11 printf("%i\n",function);
12 printf("%i\n",FUNCTION(VALUE));
13 return 0;
14 }
 

Geben Sie die Ausgabe des Programmes in Zeile 11 und Zeile 12 an.

b) Deklaration und Definition (1P.)

Gegeben ist folgender Quelltext:


 
1 #include <stdio.h>
2 int main(int argc, char * argv[]) {
3 printHello();
4 return 0;
5 }
6 void printHello() {
7 printf("Hello␣World␣:-)\n");
8 }
 

Weshalb kompiliert das Programm nicht? Begründen Sie kurz.

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 5

c) Globale Variablen und Call-by-Pointer (3P.)

Gegeben ist folgender Quelltext, wobei die Standardbibliothek <stdio.h> eingebunden ist:
 
1 static int a = 1;
2
3 int func (int* x) {
4 static int b = 1;
5 b=b+1;
6 *x=*x+b;
7 return b;
8 }
9 int main() {
10 printf("%i\n",a);
11 printf("%i\n",func(&a));
12 printf("%i\n",a);
13 return 0;
14 }
 

Geben Sie die Ausgabe des Programmes für folgende Zeilen mit kurzer Begründung an:

Zeile 10-12:

Zeile 13:

Zeile 14:

d) Implizite Typumwandlung (2P.)

Gegeben ist folgender Quelltext, wobei die Standardbibliothek <stdio.h> eingebunden ist:
 
1 int main() {
2 int i = 3;
3 float j = 2;
4 j=i/j;
5 i=j/i;
6 printf("j:%f\n",j);
7 printf("i:%i\n",i);
8 return 0;
9 }
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 6

Geben Sie die Ausgabe des Programmes für folgende Zeilen mit kurzer Begründung an:

Zeile 6-7:

Zeile 8:

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 7

e) Daten auf dem Stack (Stapelspeicher) (5P.)

Gegeben sei das Programm auf der linken Seite. Das Diagramm auf der rechten Seite stellt
den Stack (Kellerspeicher) dar. Der Anfang des Stacks sei die unterste Zelle. Das Programm
wird ausgeführt und es werden in main mehrere Variablen auf dem Stack angelegt. Das
Programm befinde sich nun innerhalb der while-Schleife in der 3. Iteration in Zeile 16 und
hat die Anweisungen in dieser Zeile bereits ausgeführt. Vervollständigen Sie das Diagramm,
indem Sie in die Kästchen die Werte der jeweiligen Variablen schreiben. Schreiben Sie
rechts neben die Kästchen die Variablen. Beispielhaft ist die Variable r mit Wert 0 bereits
eingetragen.

Hinweis: Die Adressierung des Stacks erfolgt über eine Blockgröße von 4 Bytes. Deshalb
belegt int r auch genau ein Kästchen.

 
1 struct Data {
2 int a, b, c;
0x049A6
3 };
4
0x049A2
5 int main(void) {
6 int r = 0;
0x0499E
7 int i = 0;
8
0x0499A
9 struct Data data = {0, 0, 0};
10 0x04996
11 while (i < 10) {
12 int inc = 3 * i; 0x04992
13 data.a += inc;
14 data.b += inc; 0x0498E
15 data.c += inc;
16 i++; 0x0498A
17 }
18 0x04986
19 return r;
20 } 0x04982 0 r
21
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 8

Aufgabe 3: Grundlagen und Programmieren in C


(20 Punkte)
Hinweise

• Alle Teilaufgaben sollen in der Programmiersprache C implementiert werden. Die Ver-


wendung von C++ ist nicht erlaubt.

• Alle Teilaufgaben können unabhängig voneinander gelöst werden.

a) Fibonacci (5P.)

Schreiben Sie eine Funktion int fibonacci_recursive(int n), welche für eine ganze Zahl
n die n-te Fibonacci-Zahl zurückgibt.

Hinweis: Die Fibonacci-Zahlen sind durch die Rekursionsgleichung

fn = fn−1 + fn−2 , f1 = 1, fn = 0 | n ≤ 0

definiert.

(i) Schreiben Sie die Funktion zunächst als Rekursion (ohne Schleifen). (2P. von 5P.)

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 9

(ii) Schreiben Sie die Funktion nun als Iteration (int fibonacci_iterative(int n) ,verwen-
den Sie dazu eine while-Schleife). (3P. von 5P.)

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 10

b) Vektor (7P.)
Gegeben ist folgender Code-Ausschnitt in C, der einen Vektor implementiert. Dieser ist im
Grunde ein dynamisches Array, welches seine Größe mitführt. Sollen Elemente hinzugefügt
oder entfernt werden, passt sich die Größe des Arrays entsprechend an. Das Array data soll
immer nur genau so viel Speicher belegen, wie für die Elemente des Vektors benötigt wird.

Datei vector.h
 
#ifndef VECTOR_H
#define VECTOR_H
#include <stdlib.h>
#include <stdio.h>

typedef struct Vector {


int size;
int *data;
} vector;

void vec_init(vector *v);

int vec_get;

void vec_add(vector *v, int value);

void vec_remove(vector *v, unsigned int index);

#endif // VECTOR_H
 

Datei vector.c
 
#include "vector.h"

void vec_init(vector *v) {


free(v->data);
v->data = NULL;
v->size = 0;
}

int vec_get(vector *v, unsigned int index) {


if (index >= v->size) {
printf("Vector␣access␣out␣of␣bounds.");
}

return v->data[index];
}
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 11

Ihre Aufgabe ist es nun, folgende Funktionen zu implementieren:

(i) void vec_add(vector *v, int value) (3P. von 7P.)


Diese Funktion soll das Element value an das Ende des Vektors anhängen. Dabei muss
entsprechend Speicher allokiert werden. Fangen Sie mögliche Fehler ab.
 
void vec_add(vector *v, int value)
{

}
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 12

(ii) void vec_remove(vector *v, unsigned int index) (4P. von 7P.)
Diese Funktion entfernt das index-te Element aus dem Vektor. Die restlichen Elemen-
te bleiben unverändert, wobei alle Elemente hinter index einen Eintrag nach vorne
rutschen. Dazu muss wieder die Größe des Arrays angepasst werden. Fangen Sie auch
hier mögliche Fehler ab. index = 0 bezeichne das erste Element des Vektors.
 
void vec_remove(vector *v, unsigned int index)
{

}
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 13

c) Dynamische Speicherverwaltung in C (3P.)

Allokieren Sie Speicher für einen Zeiger vom Typ int. Schreiben Sie den Wert “5” in den
allokierten Speicherbereich, und geben Sie den Speicher danach wieder frei.
 
// 1. Speicher allokieren
int * n =

// 2. Wert 5 in den allokierten Speicher schreiben

// 3. Speicher freigeben
 

d) Arrays & Speicherbedarf (2P.)

Gegeben ist folgender Quelltextausschnitt, der eine 2 × 3-Matrix vom Typ int darstellt:
 
int m[6];
 

(i) Initialisieren Sie alle Matrix-Elemente mit 1 in gültiger C-Syntax. (1P. von 2P.)

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 14

(ii) Der Speicherbereich der Matrix m wird nun wie folgt dargestellt: (1P. von 2P.)

m[0] m[1] m[2]


m =
m[3] m[4] m[5]

Nehmen Sie an, dass nun m[i] = 1 für alle i = 0, ..., 5 gilt. Nun wird folgender
Quelltext ausgeführt:
 
m[m[0]] = 2;
m[2 * m[1]] = 5;
m[2] = m[4] - 2;
m[3] = (m[2] + m[4]) / 2;
m[m[4]] = 6;
 
Welche Werte befinden sich nun in der Matrix?
Antwort:

m =

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 15

e) Strings kopieren (3P.)


Schreiben Sie eine Funktion, welche den String src in den String dest kopiert. Gehen Sie
davon aus, dass dest groß genug für src ist. Verwenden Sie dazu die folgende Funktionsde-
klaration:
 
void copyString(char *src, char *dest);
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 16

Aufgabe 4: Programmieren in C/C++ (12 Punkte)


a) Von C zu C++ (2P.)
Nennen Sie stichpunktartig 4 Konzepte in C++, die es in C nicht gibt.

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 17

b) Template-Programmierung (2P.)
Gegeben ist folgender Quelltext, der die Maximum-Funktion für die Datentypen int und
double implementiert:
 
int max(int v1, int v2) {
return v1 > v2 ? v1 : v2;
}

double max(double v1, double v2) {


return v1 > v2 ? v1 : v2;
}
 

(i) Schreiben Sie eine Template-Funktion max.

(ii) Wie wird Ihre Template-Funktion für den Typ float aufgerufen? Geben Sie ein Beispiel.

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 18

c) Vererbung (4P.)

Gegeben ist folgende Klassenhierarchie:


 
class Punkt {
public:
Punkt() : x(0.0), y(0.0) {
}
~Punkt() {
printf("Punkt␣wird␣freigegeben\n");
}

// weitere Klassenfunktionen...

virtual void reset() {


printf("Punkt␣wird␣auf␣(0,␣0)␣gesetzt\n");
x = 0;
y = 0;
}

protected:
double x;
double y;
};

class RgbPunkt : public Punkt {


public:
RgbPunkt() : Punkt(), r(0.0), g(0.0), b(0.0) {
}
~RgbPunkt() {
printf("RgbPunkt␣wird␣freigegeben\n");
}

// weitere Klassenfunktionen...

virtual void reset() {


printf("RgbPunkt␣wird␣auf␣(0,␣0,␣0)␣gesetzt\n");
r = 0;
g = 0;
b = 0;
}

private:
float r;
float g;
float b;
};
 

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 19

Nun wird folgender Quelltext ausgeführt:


 
1 int main(int argc, char * argv[])
2 {
3 Punkt * p = new RgbPunkt();
4 p->reset();
5 delete p;
6
7 return 0;
8 }
 

(i) Welche Ausgabe bewirkt die Ausführung von p->reset(); in Zeile 4? Begründen Sie
kurz. (1P. von 4P.)

(ii) Welche Ausgabe bewirkt die Ausführung von delete p; in Zeile 5? Begründen Sie
ausführlich. (3P. von 4P.)

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 20

d) Überladen einer Funktion (4P.)

Gegeben ist folgende Klasse:


 
1 // Ausschnitt aus der Header-Datei
2 class Punkt {
3 public:
4 Punkt();
5 ~Punkt();
6
7 protected:
8 double x;
9 double y;
10 };
 
 
1 // Ausschnitt aus der .cpp-Datei
2 Punkt::Punkt() : x(0.0), y(0.0)
3 {
4 }
5
6 ~Punkt()
7 {
8 }
 

Implementieren Sie eine Funktion void setPunkt(double x, double y);, die die beiden
Klassenvariablen x und y auf die übergebenen Werte setzt. Überladen Sie weiterhin die
Funktion setPunkt, sodass die Überladung nur einen Parameter vom Typ const Punkt & p
akzeptiert. Machen Sie deutlich, in welchen Zeilen Ihre Erweiterungen in der Header-Datei
bzw. in der .cpp-Datei hinzugefügt werden.

Programmierung in der Automatisierungstechnik (C/C++)


Klausuraufgaben Matrikelnummer: . . . . . . . . . . . . . . . . . . Seite 21

Zusätzliches Lösungsblatt:

Programmierung in der Automatisierungstechnik (C/C++)

Das könnte Ihnen auch gefallen