Está en la página 1de 28

Name, Vorname:

Matrikelnummer:

1. Klausur zur Lehrveranstaltung


Grundlagen der Programmierung
fr Ingenieure II
WS 2015/16
23. Februar 2016
Hinweise:

Bitte lesen!

Diese Klausur umfasst 10 Aufgaben und 28 Seiten. berprfen Sie Ihre Klausur bitte auf Vollstndigkeit!
Schreiben Sie bitte zuerst Ihren Namen auf jedes Blatt dieser Klausur und ggf. auf weitere von
Ihnen benutzte Zusatzbltter!
Es sind keine Hilfsmittel erlaubt.
Alle elektronischen Gerte (Handy, Smartphone, PDA, Smartwatches, ...) sind auszuschalten. Eingeschaltete Gerte werden als Tuschungsversuch gewertet.
Nehmen Sie sich Zeit, die Klausuraufgaben vollstndig durchzulesen. Sie knnen insgesamt 180
Punkte erreichen; mit 90 Punkten haben Sie auf jeden Fall bestanden. Die Bearbeitungszeit betrgt 150 Minuten.
Sollten Sie mehr als eine Lsung fr eine Aufgabe anfertigen, kennzeichnen Sie die Lsung, die
bewertet werden soll. Aufgaben mit zwei Lsungen werden nicht gewertet!
Verwenden Sie keine Bleistifte, keine Rotstifte, keine Korrekturflssigkeiten (z. B. Tipp-Ex) und
keine Korrekturroller.

Viel Erfolg bei der Bearbeitung der Aufgaben!

A1
20

A2
10

A3
16

A4
20

http://www.hni.uni-paderborn.de/alg/lehre/

A5
14

A6
20

1 / 28

A7
20

A8
20

A9
18

A10
22

P
180

(Fassung vom 19. Februar 2016, 8:07)

Aufgabe 1 Zeiger

(10 + 10 = 20 Punkte)

a) Vervollstndigen Sie das angegebene Programm um folgende Funktionalitt, jedoch ohne dabei den
[]-Operator fr den Zugriff auf Array-Elemente zu verwenden. Verwenden Sie stattdessen die Mglichkeiten der Zeigerarithmetik.
Funktionalitt: Vom Benutzer wird zunchst ein Integer (ganze Zahl) namens anzahl eingelesen und
danach dynamisch ein int-Array fr anzahl viele Elemente angelegt. Danach werden vom Benutzer
anzahl viele Integer Werte abgefragt und in dem Array gespeichert. Anschlieend werden alle Integer
Werte in gleicher Reihenfolge wie die Eingabe, durch Komma getrennt, auf der Konsole ausgegeben und
anschlieend das Array gelscht.
Beispielausgabe: Eine Ausgabe des Programms bei Arraygre 3 knnte wie folgt aussehen:
Wie v i e l e Z a h l e n ? 3
Geben S i e 3 Z a h l e n e i n !
Wert ? 12
Wert ? 24
Wert ? 43
12 ,24 ,43 ,

Programm:
1
2
3
4
5
6
7
8
9
10

#include <iostream>
using namespace std;
int main() {
cout << "Wie viele Zahlen? ";
int anzahl;
cin >> anzahl;
if (anzahl <= 0) {
return 0;
}
cout << "Geben Sie " << anzahl << " Zahlen ein!" << endl;

http://www.hni.uni-paderborn.de/alg/lehre/

2 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

return 0;

11
12

Matrikelnummer:

http://www.hni.uni-paderborn.de/alg/lehre/

3 / 28

(Fassung vom 19. Februar 2016, 8:07)

b) Vervollstndigen Sie das nachfolgende Programmfragment indem Sie dynamisch zur Laufzeit Strukturen vom Typ DatTyp erzeugen, so dass die folgende Speichersituation entsteht:

An Variablen bzw. Zeiger drfen Sie ausschlielich dat1 und dat2 verwenden und keine weiteren Variablen bzw. Zeiger anlegen. Sobald die oben angegebene Speichersituation erreicht wird, markieren
Sie dieses durch einen Kommentar // Speichersituation erreicht. Geben Sie anschlieend den
verwendeten Speicher wieder frei.
1
2
3
4
5
6
7

int main() {
struct DatTyp{
int zahl;
DatTyp* zgr;
};
DatTyp* dat1;
DatTyp* dat2;

return 0;

8
9

http://www.hni.uni-paderborn.de/alg/lehre/

4 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

Aufgabe 2 Sichtbarkeit

(10 Punkte)

Heben Sie im folgenden Programm die Sichtbarkeit aller Variablen, Konstanten und formalen Parametern durch Linien neben dem Programmcode hervor wie aus der Vorlesung und den bungen bekannt.
Wenn Variablen verdeckt sind, dann soll dies in den entsprechenden Bereichen durch eine gestrichelte
Linie markiert werden.
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double c;
double h;
double berechneSeite(const double& a, const double& b) {
return sqrt(a*a + b*b);
}
double berechneHoehe(const double& a, const double& c1) {
return sqrt(a*a-c1*c1);
}
int main()
{
double c1;
{
double a = 20.;
double b = 30.;
c = berechneSeite(a, b);
c1 = (c*c+a*a-b*b)/(2*c);
h = berechneHoehe(a, c1);
}
for(int i=0; i<(int)c; i++)
{
cout << setw(2) << (i+1) << ": ";
int h;
if(i<=(int)(c1))
h = (int)(::h/c1*i);
else
h = (int)(::h-::h/(::c-c1)*(i-(int)(c1)));
for(int i=0; i<h; i++)
cout << #;
cout << endl;
}
return 0;
}

http://www.hni.uni-paderborn.de/alg/lehre/

5 / 28

(Fassung vom 19. Februar 2016, 8:07)

Aufgabe 3 Schleifen

(10 + 6 = 16 Punkte)

a) Implementieren Sie die Funktion sucheKleinstePositiveZahl, welche in einem Array unsortierter


ganzer Zahlen die kleinste positive Zahl bestimmt und zurck gibt. Hierbei nehmen wir an, dass 0 keine
positive Zahl ist. Falls das Array keine positiven Zahlen beinhaltet, dann soll die Funktion 0 zurck
geben.
Die Ausgabe des folgenden Programms soll sein:
K l e i n s t e p o s i t i v e Zahl 8
K l e i n s t e p o s i t i v e Zahl 9
Keine p o s i t i v e Zahl d a b e i

Programm:
1
2
3

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#include <iostream>
using namespace std;
int sucheKleinstePositiveZahl(int *arr, int len) {

}
void print(int *arr, int len) {
int erg = sucheKleinstePositiveZahl(arr, len)
if (erg == 0)
cout << "Keine positive Zahl dabei" << endl;
else
cout << "Kleinste positive Zahl " << erg << endl;
}
int main() {
int zahlen1[10] = {13, -12, 17, -20, 8, 24, -14, 27, 0, 99};
int zahlen2[7] = {-12, 17, -20, 9, 24, -14, 27};
int zahlen3[3] = {-12, -20, -14};
print(zahlen1, 10);
print(zahlen2, 7);
print(zahlen3, 3);
return 0;
}

http://www.hni.uni-paderborn.de/alg/lehre/

6 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

b) Verwenden Sie das im Folgenden angegebene Programm Programmvariante A als Vorlage um die
quivalente Funktionalitt in Programmvariante B zu implementieren. Hierbei soll Programmvariante B
weder for noch do-while Schleifen verwenden, sondern ausschlielich while Schleifen benutzen.
Programmvariante A:
1
2

#include <iostream>
using namespace std;

3
4
5
6

int main() {
int arr1[10] = {12, 24, 23, 7, 19, 45, 18, 15, 2, 29};
int arr2[5];

for(int i=0; i<10; i=i+2)


arr2[i/2] = arr1[i];

8
9
10

int i=0;
do {
cout << arr2[i] << " ";
i++;
} while (i<5);
return 0;

11
12
13
14
15
16
17

Programmvariante B:
1
2

#include <iostream>
using namespace std;

3
4
5
6

int main() {
int arr1[10] = {12, 24, 23, 7, 19, 45, 18, 15, 2, 29};
int arr2[5];

return 0;

7
8

http://www.hni.uni-paderborn.de/alg/lehre/

7 / 28

(Fassung vom 19. Februar 2016, 8:07)

Aufgabe 4 STL

(10 + 10 = 20 Punkte)

Im Folgenden finden Sie Programmfragmente, in welchen Container aus der STL verwendet werden.
Ergnzen Sie diese Programmfragmente um die jeweils gesuchte Funktionalitt.
a) Schreiben Sie ein Programmfragment, welches unter Verwendung von Iteratoren alle geraden Zahlen
aus dem gegebenen Vektor zahlenVec ausgibt.
Die Ausgabe soll sein: 2 8 20.
1
2
3

#include <iostream>
#include <vector>
using namespace std;

4
5
6
7
8
9
10
11

int main()
{
int zahlen[] = { 1, 3, 37, 3, 5, 17, 2, 8, 20, 15 };
vector<int> zahlenVec;
for (int i = 0; i < 10; ++i) {
zahlenVec.push_back(zahlen[i]);
}

return 0;

12
13

http://www.hni.uni-paderborn.de/alg/lehre/

8 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

b) Ergnzen Sie das Programmfragment zu einem vollstndigen Programm, welches unter Verwendung
von count_if(begin, end, function) die Anzahl der ungeraden Zahlen in der angegebenen Liste
zahlenList berechnet und ausgibt.
Die Ausgabe soll sein: 7.
1
2
3
4

5
6
7
8
9
10
11

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
int zahlen[] = { 1, 3, 37, 3, 5, 17, 2, 8, 20, 15 };
list<int> zahlenList;
for (int i = 0; i < 10; ++i) {
zahlenList.push_back(zahlen[i]);
}

return 0;

12
13

http://www.hni.uni-paderborn.de/alg/lehre/

9 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

Die Ausfhrung des angegebenen Programms fhrt auf der Konsole zu folgender Ausgabe:
The Wall
Someone l i k e You
Titanium

Implementieren Sie die Datenstruktur mit gleichwertiger Funktionalitt in Form einer Klasse: Fr die
Struktur SammlungTyp ist eine Klasse Sammlung zu programmieren. Die Klasse Sammlung enthlt die
Methoden cdHinzufuegen und cdAlleAusgeben. Implementieren Sie einen geeigneten Konstruktor
und Destruktor fr die Funktionen initSammlung und removeSammlung.

1
2
3
4
5
6
7
8

int main() {
Sammlung meineCDs(10);
meineCDs.cdHinzufuegen("The Wall");
meineCDs.cdHinzufuegen("Someone like You");
meineCDs.cdHinzufuegen("Titanium ");
meineCDs.cdAlleAusgeben();
return 0;
}

http://www.hni.uni-paderborn.de/alg/lehre/

11 / 28

(Fassung vom 19. Februar 2016, 8:07)

Aufgabe 6 Polymorphismus

(6 + 6 + 8 = 20 Punkte)

Gegeben ist folgendes Programmfragment, bestehend aus mehreren Klassen:


1
2
3

#include <iostream>
using namespace std;
const double PI = 3;

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

class Geo {
public:
Geo() {
cout << "Geo erzeugt" << endl;
}
virtual ~Geo(){
cout << "Geo entfernt" << endl;
}
virtual double flaeche() = 0;
};
class Kreis : public Geo
{
double m_radius;
public:
Kreis(double radius)
: m_radius(radius) { }
virtual ~Kreis(){}
virtual double flaeche() {
return m_radius*m_radius*PI;
}
};
class Rechteck : public Geo
{
double m_a, m_b;
public:
Rechteck(double a, double b)
: m_a(a), m_b(b) {}
virtual ~Rechteck(){}
virtual double flaeche() {
return m_a * m_b;
}
double breite() { return m_a;}
double hoehe() { return m_b;}
};

a) Vervollstndigen Sie die folgende main-Funktion, so dass zunchst smtliche Flcheninhalte der Objekte, jeweils getrennt durch Zeilenumbrche, ausgegeben werden. Anschlieend soll nacheinander der
Speicher aller im Array forms gespeicherten Objekte freigegeben werden.

http://www.hni.uni-paderborn.de/alg/lehre/

12 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:
1
2
3
4
5

int main() {
Geo *forms[3];
forms[0] = new Kreis(3);
forms[1] = new Rechteck(1,2);
forms[2] = new Rechteck(1,3);

return 0;

6
7

Matrikelnummer:

b) Das von Ihnen vervollstndigte Programm erzeugt bei Aufruf der main-Funktion an mehreren Stellen
Ausgaben. Geben Sie diese Ausgabe an:

Ausgabe (Ein Feld pro ausgegebener Zeile)

http://www.hni.uni-paderborn.de/alg/lehre/

13 / 28

(Fassung vom 19. Februar 2016, 8:07)

c) Schreiben Sie eine Klasse namens Quadrat, die von der vorgegebenen Klasse Rechteck erbt. Die
Klasse soll folgende Eigenschaften haben:
Die Klasse soll keine Attribute besitzen.
Die Methode double Quadrat::flaeche() soll den korrekten Flcheninhalt zurckgeben.
Die Klasse soll eine zustzliche Methode double Quadrat::umfang() haben, welche den Umfang des Quadrats zurckgibt.
Hinweis: Sie knnen annehmen, dass die Klasse in der gleichen Datei wie der zuvor in dieser Aufgabe
verwendete Programmcode steht.

http://www.hni.uni-paderborn.de/alg/lehre/

14 / 28

(Fassung vom 19. Februar 2016, 8:07)

Programm:
1
2
3
4

#include <iostream>
#include <string>
#include "Schlange.h"
using namespace std;

5
6
7
8

int main() {
Schlange* SchlangeLinks = new Schlange();
Schlange* SchlangeRechts = new Schlange();

SchlangeLinks->enque("PB-MH-911");
SchlangeLinks->enque("PB-MF-777");
SchlangeLinks->enque("PB-CL-001");
SchlangeRechts->enque("PB-AB-123");
SchlangeRechts->enque("PB-CD-456");

10
11
12
13
14

delete SchlangeLinks;
delete SchlangeRechts;

15
16
17

return 0;

18
19

http://www.hni.uni-paderborn.de/alg/lehre/

16 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

b) Vervollstndigen Sie die Methode Schlange::enque(string x, int index) der Klasse Schlange, mit der ein Element hinter der angegebenen Indexposition eingereiht wird. Hierbei entspricht die
0-te Indexposition der Position vor dem ersten Schlangenelement. (Mit dem ersten Schlangenelement
bezeichnen wir das Element, welches beim Aufruf von head() zurckgegeben wird.) Entsprechend soll
bei Index i das neue Element nach der Einfgeoperation das (i + 1)-te Element der Liste sein. Wenn
der angegebene Index grer als die Anzahl der Elemente ist, dann soll das Element hinter dem letzten
Listenelement angehngt werden. Sie knnen davon ausgehen, dass der Indexwert nicht-negativ ist. Das
folgende Programmfragment behandelt bereits die Flle, wenn die Schlange leer ist oder das Element an
der 0-ten Stelle eingefgt werden soll.

13

void Schlange::enque(string x, int index)


{
Node *ptr = new Node(x);
if (empty()) {
last = ptr;
first = ptr;
return;
}
if (index == 0) {
ptr->next = first;
first = ptr;
return;
}

14

1
2
3
4
5
6
7
8
9
10
11
12

http://www.hni.uni-paderborn.de/alg/lehre/

17 / 28

(Fassung vom 19. Februar 2016, 8:07)

Aufgabe 8 Streams

(10 + 10 = 20 Punkte)

a) Gegeben ist folgendes Programm, welches Daten aus einer Datei einliest und auf der Konsole sowie in
einer zweiten Datei ausgibt. Vollziehen Sie den Ablauf des Programms nach und tragen Sie die Ausgaben
des Programms in die Tabelle ein: Ausgaben in die Datei ausgabe.txt in die linke Spalte und die
Konsolenausgaben in die rechte Spalte; es bleiben Felder leer.
Inhalt der Datei eingabe.txt
0 montag 1 dienstag 3 mittwoch 2 donnerstag 4 freitag
Programm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
void ausgabe(ostream& out, const string& s){
out << s << endl;
}
int main() {
ifstream inFile("eingabe.txt", ios::in);
ofstream outFile("ausgabe.txt", ios::out);
while (!inFile.eof()) {
int i;
string s;
ostringstream sstr;
inFile >> i;
inFile >> s;
switch (i) {
case 0:
ausgabe(outFile, s);
break;
case 1:
ausgabe(cout, s);
break;
case 2:
for (int k = s.size()-1; k>=0; --k){
sstr << s.at(k);
}
ausgabe(outFile, sstr.str());
break;
default:
ausgabe(cout, "quatsch");
break;
}
}
inFile.close();
outFile.close();
return 0;
}

http://www.hni.uni-paderborn.de/alg/lehre/

18 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:
Konsole

ausgabe.txt

Hinweis: Die Tabelle hat mehr Zeilen als bentigt werden.

http://www.hni.uni-paderborn.de/alg/lehre/

19 / 28

(Fassung vom 19. Februar 2016, 8:07)

b) Schreiben Sie ein Programm, welches eine Datei zahlenEingabe.txt zum Lesen ffnet und die
enthaltenen Zahlen liest. Alle geraden Zahlen sollen durch Leerzeichen getrennt in eine Datei namens
geradeZahlen.txt geschrieben werden. Die ungeraden Zahlen sollen durch Leerzeichen getrennt auf
der Konsole ausgegeben werden.
Vergessen Sie nicht, die geffneten Dateien auch wieder zu schlieen!
Beispieldaten:
Inhalt der Datei zahlenEingabe.txt: -500 3 34 7 49 120 4 17
Inhalt der Datei geradeZahlen.txt nach Ausfhrung des Programms: -500 34 120 4
Konsolenausgabe des Programms: 3 7 49 17
1
2
3

#include <fstream>
#include <iostream>
using namespace std;

4
5

int main(){

return 0;

6
7

http://www.hni.uni-paderborn.de/alg/lehre/

20 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

Diese Seite wurde absichtlich leer gelassen.

http://www.hni.uni-paderborn.de/alg/lehre/

21 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

a) Schreiben Sie zwei der mglichen Ausgaben des Programms auf.

b) Beschreiben Sie kurz, warum das Programm unterschiedliche Ausgaben erzeugen kann.

c) Schreiben Sie eine Ausgabe des Programms auf, die nur mglich ist, falls das Programm ohne den
Mutex in Zeilen 12 und 16 ausgefhrt wird.

http://www.hni.uni-paderborn.de/alg/lehre/

23 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

a) Schreiben Sie eine Funktion void print(Stack &stack), welche die Referenz auf einen Stack als
Argument bergeben bekommt und smtliche Elemente des Stacks von oben (Top-Element) nach unten,
durch Leerzeichen getrennt, auf der Konsole ausgibt. Nach Ende des Funktionsaufrufs soll der Stack
exakt den gleichen Inhalt haben, wie vor dem Aufruf der Funktion.
Hinweis: Da es sich bei der zu implementierenden Funktion nicht um eine Methode der Klasse handelt
knnen Zugriffe nur ber die public-Methoden der Klasse erfolgen. Insbesondere ndern diese Methoden
den Stack und es ist daher notwendig die nderungen zwischenzuspeichern, um am Ende wieder den
Ausgangszustand herzustellen.
1

void print(Stack &stack) {

return;

2
3

http://www.hni.uni-paderborn.de/alg/lehre/

25 / 28

(Fassung vom 19. Februar 2016, 8:07)

Name, Vorname:

Matrikelnummer:

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur Lsung einer Aufgabe verwenden, kennzeichnen Sie dieses
auch direkt an der Aufgabe und streichen Sie nicht zu bewertende Lsungen!

http://www.hni.uni-paderborn.de/alg/lehre/

27 / 28

(Fassung vom 19. Februar 2016, 8:07)

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur Lsung einer Aufgabe verwenden, kennzeichnen Sie dieses
auch direkt an der Aufgabe und streichen Sie nicht zu bewertende Lsungen!

http://www.hni.uni-paderborn.de/alg/lehre/

28 / 28

(Fassung vom 19. Februar 2016, 8:07)

También podría gustarte