联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-23:00
  • 微信:codinghelp

您当前位置:首页 >> CS作业CS作业

日期:2021-03-31 11:40

Grundlagen der Programmierung

& Datenverarbeitung

WS 2019/20

25. September 2020

Hinweise: Bitte lesen!

? Diese Klausur umfasst 8 Aufgaben und 32 Seiten. überprüfen Sie Ihre Klausur bitte auf Vollst?ndigkeit!

Die Heftklammer der Klausur darf nicht entfernt werden.

? Schreiben Sie bitte zuerst Ihren Namen auf jedes Blatt dieser Klausur und ggf. auf weitere von

Ihnen benutzte Zusatzbl?tter!

? Es sind keine Hilfsmittel au?er Fremdsprachenw?rterbucher erlaubt.

? Alle elektronischen Ger?te (Handy, Smartphone, PDA, Smartwatches,. . . ) sind auszuschalten. Eingeschaltete

Ger?te werden als T?uschungsversuch gewertet.

? Nehmen Sie sich Zeit, die Klausuraufgaben vollst?ndig durchzulesen. Sie k?nnen insgesamt 120

Punkte erreichen; mit 60 Punkten haben Sie auf jeden Fall bestanden. Die Bearbeitungszeit betr?gt

120 Minuten.

? Sollten Sie mehr als eine L?sung für eine Aufgabe anfertigen, kennzeichnen Sie die L?sung, die

bewertet werden soll. Aufgaben mit zwei L?sungen werden nicht gewertet!

? Verwenden Sie keine Bleistifte, keine Rotstifte, keine Korrekturflüssigkeiten (z. B. Tipp-Ex) und

keine Korrekturroller.

Viel Erfolg bei der Bearbeitung der Aufgaben!

A1 A2 A3 A4 A5 A6 A7 A8 P

15 15 15 15 15 15 15 15 120

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 1 – Zusicherungen & Typkonvertierung (7 + 8 = 15 Punkte)

a) Das folgende Programm fragt den Benutzer nach der Eingabe einer ganzen Zahl und gibt entsprechend

dieser Zahl eine oder mehrere Ausgaben aus. Tragen sie in die Tabelle ein, für welche Werte von

i die jeweilige Ausgabe erzeugt wird.

Hinweis: Zur Angabe des Wertebereichs sind sowohl mathematische als auch sprachliche Beschreibungen

zul?ssig. Es muss immer der komplette Wertebereich angegeben werden! Sie k?nnen davon ausgehen,

dass die eingegebene Zahl immer ganzzahlig ist.

1 cout << "Bitte eine ganze Zahl eingeben: ";

2 int i;

3 cin >> i;

4 if ( i<42 ) {

5 cout << "A" << endl;

6 if( (i%2) == 0 ){

7 cout << "B" << endl;

8 }

9 }

10 else if( (i%2) == 0 ) {

11 cout << "C" << endl;

12 }

13 if( i>11 ) {

14 cout << "D" << endl;

15 if( i>22 && i<=25 ) {

16 cout << "E" << endl;

17 }

18 else if( i<32 || i==7 ) {

19 cout << "F" << endl;

20 }

21 } else {

22 cout << "G" << endl;

23 if( i==9 ) {

24 cout << "H" << endl;

25 }

26 }

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

Name, Vorname: Matrikelnummer:

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

b) Bestimmen Sie den Typ der folgenden beiden Ausdrücke, indem Sie den dazu geh?rigen Syntaxbaum

angeben. Zeichnen Sie dazu so, wie aus der Vorlesung bekannt, den Baum für den entsprechenden

Ausdruck und schreiben Sie an jeden Knoten den entsprechenden Datentyp. Schreiben Sie auch an die

Bl?tter des Baums den Datentyp. Das Ergebnis des Ausdrucks braucht nicht berechnet und aufgeschrieben

werden.

float f = 2.5f;

short s = 1000;

int i = 12;

double d = 0.0;

1.) d * 2.0f + (float)42

2.) i > f || s*(int)’E’

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

Name, Vorname: Matrikelnummer:

(Zus?tzlicher Platz zur L?sung von Aufgabe 1b)

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 2 – Schleifen & Programmsimulation (5 + 5 + 5 = 15 Punkte)

a) Programmieren Sie eine for-Schleife welche die Zahlen x = zahl1, . . . , zahl2 ausgibt. Für eine

Zahl die ohne Rest durch 7 teilbar ist, soll an Stelle der Zahl ein “nein“ ausgegeben werden. Die Variablen

zahl1 und zahl2 speichern zwei Zahlen, die vom Benutzer eingeben werden. Die Ausgabe des

Programm für zahl1 = 7 und zahl2 = 15 sieht also wie folgt aus:

Programmierausgabe

Zahl1 ? 7

Zahl2 ? 15

nein 8 9 10 11 12 13 nein 15

Vervollst?ndigen Sie das nachfolgende Programm:

i n t z a hl 1 , z a h l 2 ;

c o ut << " Z a hl 1 ? " ; c i n >> z a h l 1 ;

c o ut << " Z a hl 2 ? " ; c i n >> z a h l 2 ;

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

Name, Vorname: Matrikelnummer:

b) Das folgende Programm berechnet die Quersumme einer Zahl. Formen Sie das angegebene Programmfragment

so um, dass statt der for-Schleife eine while-Schleife verwendet wird. Die Funktionalit?t,

die einzelnen Berechnungsschritte mit der Variablen zahl und die Ausgabe des modifizierten

Programms sollen identisch zum ursprünglichen Programm sein.

i n t z a h l = 3 6 5;

i n t q u e r = 0 ;

f o r ( i n t i = z a h l ; i > 0; i = i / 1 0 ) {

q u e r = q u e r + i %10;

}

c o ut << " Die Quersumme i s t "<< q u e r ;

Programmierausgabe:

Die Quersumme ist 14

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

c) Schreiben Sie ein Programm für das Trinkspiel B?se7. Dabei wird der Reihe nach in ganzen Schritten

hochgez?hlt. Jedes Mal wenn

? die Zahl eine Sieben als Ziffer enth?lt,

? die Zahl durch Sieben teilbar ist,

? oder die Quersumme der Zahl durch Sieben teilbar ist

muss nein gesagt werden.

Erweitern Sie das unten angegebene Programm so, dass das Programm von 1 bis zu dem vom Benutzer

eingegebenen Maximum hochz?hlt und jede Zahl ausgibt. Für jede Zahl, auf welche die oben genannte

Regel der B?sen7 zutrifft, soll anstelle der Zahl ein "nein" ausgegeben werden.

Programmierausgabe

Bitte Maximum bis zu dem gespielt werden soll eingeben: 23

1 2 3 4 5 6 nein 8 9 10 11 12 13 nein 15 nein nein 18 19 20 nein 22 23

TIPP: Bilden Sie eine ?u?ere Schleife für das Hochz?hlen der Zahlen und eine innere Schleife um die

Quersumme zu ermitteln und zu prüfen ob eine 7 in der Zahl vorkommt.

Vervollst?ndigen sie das Nachfolgende Programm:

i n t maximum ;

c o ut << " B i t t e Maximum b i s zu dem g e s p i e l t we rden s o l l ei n g e b e n : " ;

c i n >> maximum ;

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

Name, Vorname: Matrikelnummer:

Aufgabe 3 – Zeiger (8 + 7 = 15 Punkte)

a) Dieses Programm soll die Reihenfolge der Werte in einem gegebenen Integer-Array arr spiegeln.

Initial k?nnte das Array die folgenden Zahlen enthalten:

{ 4 2 , 1 3 3 7 , 6 9 , 0 , 2 4 , 2 5 , 1 0 1 , 1 2 3 4 5 , 1 3 , 13}

Nach Ablauf des Programms stehen die Zahlen dann in der nachfolgenden (gespiegelten) Reihenfolge

im Array:

{ 1 3 , 1 3 , 1 2 3 4 5 , 1 0 1 , 2 5 , 2 4 , 0 , 6 9 , 1 3 3 7 , 42}

Implementieren Sie ausschlie?lich mithilfe der vorgegebenen Variablen und Zeigern eine L?sung, die

für eine beliebige Arrayl?nge gr??er Null und beliebige Integer-Werte im Array funktioniert. Vermeiden

Sie die Nutzung von eckigen Klammern, verwenden Sie stattdessen Zeigerarithmetik.

Tipp: ‘Durchlaufen’ Sie das Array mit den beiden Zeigern von unterschiedlichen Seiten aus bis hin zur

Mitte und tauschen Sie dabei die Werte unter Zuhilfenahme von save.

//Arrayl?nge: Alle Werte gr??er gleich 1 sind m?glich

int len = 10;

//Array mit Beispielwerten

int arr[len] = {42, 1337, 69, 0, 24, 25, 101, 12345, 13, 13};

int save;

int* pl = NULL;

int* pr = NULL;

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

b) In dem folgenden Programm werden einige Berechnungen unter Verwendung von Zeigern durchgeführt.

Vollziehen Sie den Verlauf des Programms nach und füllen Sie für jeden Besuch einer markierten

Stelle einen Eintrag in der Programmsimulationstabelle aus.

? Wenn die Variable zu dem Zeitpunkt nicht lebt, tragen Sie einen Strich ein ‘—’.

? Wenn die Variable lebt, aber der Wert unbekannt ist (weil die Variable noch nicht initialisiert

wurde), tragen Sie ein ‘?’ ein.

? Wenn die Variable lebt und man den Wert der Variable direkt angeben kann, tragen Sie ihn ein.

? Wenn die Variable lebt, es sich bei dem Typ der Variable um einen Zeiger handelt und der Wert

bekannt ist, dann zeichnen Sie einen Pfeil von dem K?stchen der Variable zu dem K?stchen der

referenzierten Variable.

? Es sind nicht für alle Variablen K?stchen vorhanden (Variable i). Für Variablen ohne K?stchen

brauchen Sie keine Eintragung vorzunehmen.

? Nicht ben?tigte Bl?cke k?nnen durchgestrichen werden. Es werden nicht alle abgedruckten Bl?cke

ben?tigt.

int numbers[4];

for(int i=1; i<4; i++){

numbers[i] = i + 1;

} // STELLE 1

int *pta = numbers;

int *ptb = pta + 3; // STELLE 2

*pta = *ptb + 7;

pta = pta + *(numbers + 2); // STELLE 3

if(pta > ptb){

*(numbers + 1) = numbers[1];

numbers[2] = *(numbers + 1);

numbers[1] = numbers[2];

} else if (pta == ptb){

pta = pta - 2;

*ptb = *pta + numbers[0];

ptb = &numbers[2];

} else {

pta=&(*ptb);

pta--;

numbers[2] = *pta + 2;

} // STELLE 4

pta[2] = *pta + 46; // STELLE 5

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

Name, Vorname: Matrikelnummer: STELLE

numbers[0]

pta numbers[1]

ptb numbers[2]

numbers[3] STELLE

numbers[0]

------------------------------------------ pta numbers[1]

ptb numbers[2]

STELLE numbers[3]

numbers[0]

pta numbers[1] ------------------------------------------

ptb numbers[2]

numbers[3] STELLE

numbers[0]

------------------------------------------ pta numbers[1]

ptb numbers[2]

STELLE numbers[3]

numbers[0]

pta numbers[1] ------------------------------------------

ptb numbers[2]

numbers[3] STELLE

numbers[0]

pta numbers[1]

ptb numbers[2]

numbers[3] http://www.hni.uni-paderborn.de/alg/lehre/ 11 / 32

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur STELLE

numbers[0]

pta numbers[1]

ptb numbers[2]

numbers[3] STELLE

numbers[0]

------------------------------------------ pta numbers[1]

ptb numbers[2]

STELLE numbers[3]

numbers[0]

pta numbers[1] ------------------------------------------

ptb numbers[2]

numbers[3] STELLE

numbers[0]

------------------------------------------ pta numbers[1]

ptb numbers[2]

STELLE numbers[3]

numbers[0]

pta numbers[1] ------------------------------------------

ptb numbers[2]

numbers[3] STELLE

numbers[0]

pta numbers[1]

ptb numbers[2]

numbers[3] http://www.hni.uni-paderborn.de/alg/lehre/ 12 / 32

Name, Vorname: Matrikelnummer:

(Diese Seite ist frei, kann aber als zus?tzlicher Platz zur L?sung von anderen Aufgaben genutzt werden)

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 4 – Funktionen (15 Punkte)

In dieser Aufgabe soll ein Programm erstellt werden, welches eine positive komplexe Zahl der Form

z = a + i · b in die Polardarstellung der Form z = r · e

iφ umwandelt, wobei r der Betrag und φ das

Argument der komplexen Zahl im Bogenma? ist. Anschlie?end soll die Polardarstellung auf der Konsole

ausgegeben werden.

Wir ben?tigen zun?chst eine Funktion um eine Zahl einzulesen. Definieren Sie dazu im folgenden Kasten

eine Funktion eingabe, die keine Parameter besitzt. Die Funktion liest einen float-Wert vom

Benutzer ein und gibt das Ergebnis als Funktionswert an die aufrufende Stelle zurück.

Definieren Sie im folgenden Kasten eine Funktion berechne_betrag, die zwei Call-by-Value Parameter

a und b vom Typ float besitzt.

komplexen Zahl z = a + i · b und gibt das Ergebnis als Funktionswert an die aufrufende Stelle zurück.

Um die Wurzel einer Zahl x zu ziehen, verwenden Sie kommentarlos die Library-Funktion sqrt(x).

Definieren Sie im folgenden Kasten eine Funktion berechne_argument, die zwei Call-by-Reference

Parameter a und b vom Typ float besitzt und keinen Funktionswert zurück liefert. Die Funktion

berechnet den Parameter φ = arctan ( b

a

) der komplexen Zahl z = a + i · b und schreibt den Wert des

Parameters φ in die Call-by-Reference Parameter Variable a. Um den arctan einer Zahl x zu berechnen

verwenden Sie kommentarlos die Library-Funktion atan(x).

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

Name, Vorname: Matrikelnummer:

Definieren Sie im folgenden Kasten eine Funktion ausgabe, die zwei Call-by-Value Parameter r und

phi besitzt und keinen Funktionswert zurück liefert. Die Funktion gibt die komplexe Zahl in Polardarstellung

auf der Konsole aus.

Beispiel: Für r=1.5 und phi=2.5 sieht die Ausgabe wie folgt aus: 1.5 ? exp(i ? 2.5)

Schreiben Sie im folgenden Kasten das Hauptprogramm (main-Funktion), dass die zu Beginn dieser

Aufgabe beschriebene Funktionalit?t besitzt. Verwenden Sie dazu die oben definierten Funktionen!

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 5 – Klassen (10 + 5 = 15 Punkte)

a) Gegeben ist die nachfolgende Implementierung einer Datenstruktur: Die Datenstruktur erlaubt das

Speichern von Matrikelnummer und Name von Studierenden. Zur Verwaltung und Speicherung der Daten

dient die Struktur studiTyp. Die Speicherung der Daten erfolgt mit der Funktion einfuegen(..).

Es k?nnen auch alle gespeicherten Daten mit Hilfe der Funktion alleAusgeben(..) ausgegeben werden.

Die Datenstruktur wurde mit Hilfe einer Struktur und geeigneten Funktionen implementiert.

const int maxStudis = 100;

struct studiTyp {

string* name;

int* matrNr;

int anzahlStudis;

};

studiTyp* initDatenstruktur() {

studiTyp* studis = new studiTyp;

studis->name = new string[maxStudis];

studis->matrNr = new int[maxStudis];

studis->anzahlStudis = 0;

return studis;

}

void einfuegen(studiTyp* studis, string name, int matrNr) {

if (studis->anzahlStudis < maxStudis) {

studis->name[studis->anzahlStudis] = name;

studis->matrNr[studis->anzahlStudis] = matrNr;

studis->anzahlStudis = studis->anzahlStudis + 1;

}

}

void alleAusgeben(studiTyp* studis) {

for(int i=0; i<studis->anzahlStudis; i++)

cout << studis->name[i] << ", " << studis->matrNr[i] << endl;

}

void removeDatenstruktur(studiTyp* studis) {

delete studis->name;

delete studis->matrNr;

delete studis;

}

Aufgabe: Implementieren Sie dieselbe Datenstruktur mit Hilfe einer Klasse Studi, die dieselbe Funktionalit?t

bietet. D.h. die Klasse Studi soll einerseits entsprechende Methoden einfuegen(..) und

alleAusgeben(..) bieten und andererseits auch einen geeigneten Konstruktor und einen geeigneten

Destruktor bieten.

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

Name, Vorname: Matrikelnummer:

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

b) Wenden Sie Ihre Klasse Studi nun an um Datens?tze abzuspeichern und anschlie?end auszugeben:

Zuerst erzeugen Sie ein Objekt der Klasse. Anschlie?end speichern Sie die drei Datens?tze ("Mueller",

11111), ("Meyer", 22222) und ("Schulze", 33333) mit Hilfe der Klassenmethode einfuegen(..) in

dem Objekt der Klasse. Nach dem Abspeichern sollen die drei Datens?tze mittels der Klassenmethode

alleAusgeben(..) ausgeben werden.

Hinweis: Es ist nicht n?tig Name und Matrikelnummer mittels cin vom Benutzer abzufragen. Sie sollen

diese Werte direkt beim dem entsprechenden Methodenaufruf als Parameter angeben.

int main() {

}

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

Name, Vorname: Matrikelnummer:

(Diese Seite ist frei, kann aber als zus?tzlicher Platz zur L?sung von anderen Aufgaben genutzt werden)

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 6 – Vererbung (13 + 2 = 15 Punkte)

a) Gegeben ist die Klasse Form2d mit den Methoden flaeche und anzeigen. Implementieren Sie

die Klassen Rechteck und Kreis, sodass das gegebene Hauptprogramm die gegebene Ausgabe liefert.

Sowohl die Klasse Rechteck als auch die Klasse Kreis sollen von der Klasse Form2d erben. Zus?tzliche

Attribute der beiden Klassen Rechteck und Kreis sollen als private markiert sein.

Hinweis: Der Fl?cheninhalt eines Rechtecks berechnet sich aus dem Produkt seiner beiden Seiten. Der

Fl?cheninhalt eines Kreises ist gleich πr2

, wobei r der Radius des Kreises ist. Für die Konstante π

k?nnen Sie die gegebene Konstante PI verwenden.

const double PI = 3.14159265358979323846;

class Form2d {

public:

Form2d() {}

virtual ~Form2d() {};

float flaeche(){

return -1.0f;

}

virtual void anzeigen() {

cout << "Eine Form" << endl;

}

};

Hauptprogramm:

int main()

{

Form2d* f = new Form2d();

Rechteck* r = new Rechteck(3,4);

Kreis* k = new Kreis(3);

f->anzeigen();

r->anzeigen();

k->anzeigen();

cout << "Flaeche f = " << f->flaeche() << endl;

cout << "Flaeche r = " << r->flaeche() << endl;

cout << "Flaeche k = " << k->flaeche() << endl;

}

Ausgabe:

Eine Form

Ein Rechteck

Ein Kreis

Flaeche f = -1

Flaeche r = 12

Flaeche k = 28.2743

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

Name, Vorname: Matrikelnummer:

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

b) Geben Sie die Ausgabe des folgenden Hauptprogramms an unter der Annahme, dass s?mtliche

Klassen und Methoden aus Teil a) korrekt implementiert wurden.

int main()

{

Form2d* f = new Form2d();

Rechteck* r = new Rechteck(3,4);

Kreis* k = new Kreis(3);

Form2d* formen[2];

formen[0] = r;

formen[1] = k;

formen[0]->anzeigen();

cout << "Flaeche = " << formen[1]->flaeche() << endl;

}

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

Name, Vorname: Matrikelnummer:

(Diese Seite ist frei, kann aber als zus?tzlicher Platz zur L?sung von anderen Aufgaben genutzt werden)

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 7 – Datenstruktur Schlange (7 + 8 = 15 Punkte)

In dieser Aufgabe wird die Version der Datenstruktur Schlange verwendet, die mit Klassen und Methoden

implementiert wurde. Die Methoden verhalten sich so, wie aus der Vorlesung und den übungen

bekannt.

class Node {

public:

int value;

Node *next;

Node(int x) : value(x), next(NULL) {}

};

class Schlange {

private:

Node *first, *last;

public:

Schlange() : first(NULL), last(NULL) {}

~Schlange();

bool empty();

void enque(int x);

void deque();

int head();

int size(); // In Aufgabenteil a) zu entwickeln

};

a) (Entwicklersicht)

Erweitern Sie die Klasse Schlange um die Methode size(), welche die Kapazit?t, sprich, die Anzahl

der Elemente, die sich in der Schlange befinden, berechnet und an die aufrufende Stelle zurückgibt.

Dabei sollen keine weiteren private (oder ?ffentliche) Attribute der Klasse definiert werden, d.h. arbeiten

Sie lediglich mit den vorhandenen Variablen *first, *last, *next, sowie mit ggfs. weiteren lokalen

Variablen, welche Sie beliebig innerhalb von size() definieren k?nnen.

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

Name, Vorname: Matrikelnummer:

b) (Anwendersicht)

Gegeben sind zwei Schlangen q1 und q2, welche ganze Zahlen (int) enthalten. Schreiben Sie ein Programm,

welches aus der Schlange mit h?herer Kapazit?t solange Elemente entfernt, bis die Kapazit?t

beider Schlangen dieselbe ist. Anschlie?end soll die Summe der Zahlen, welche entfernt wurden auf der

Konsole ausgegeben werden. Verwenden Sie dazu nur die Methoden der Datenstruktur, d.h. ein Zugriff

auf die Elemente der Schlange über die Variablen *first, *last und *next ist in diesem Aufgabenteil

NICHT ZUL?SSIG! Sie dürfen die Methode size() aus Aufgabenteil a) kommentarlos verwenden.

Schlange* q1 = new Schlange();

Schlange* q2 = new Schlange();

// Beispielhafte Belegung der beiden Schlangen:

q1->enque(3); q1->enque(4); q1->enque(2); q1->enque(8); q1->enque(23);

q2->enque(2); q2->enque(14);

// Die Ausgabe w?re in diesem Fall: "Summe: 9"

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Aufgabe 8 – Template & STL (8 + 7 = 15 Punkte)

a) Hier sollen gew?hnliche Funktionen und Klassen auf die Verwendung von Templates umgestellt

werden: Die Funktion differenzArray berechnet für zwei Arrays mit int Zahlen die Summe der

paarweisen absolute Differenz. Die Klasse Diff berechnet für zwei int Zahlen die absolute Differenz.

Sowohl die Funktion differenzArray als auch die Klasse Diff arbeiten mit dem Datentyp int. Das

Hauptprogramm main() erzeugt die folgende Beispielausgabe:

Differenzen: 6

Differenzen: 6

int differenzArray(int *arr1, int *arr2, int anzahl) {

int summe = 0;

int differenz;

for(int i=0; i<anzahl; i++) {

differenz = arr1[i]-arr2[i];

if (differenz < 0) summe = summe - differenz;

else summe = summe + differenz;

}

return summe;

}

class Diff {

private:

int a, b;

public:

Diff(int a, int b) : a(a), b(b) {}

int getAbsDiff() {

if(a > b) return a-b;

else return b-a;

}

};

int main() {

int werte1[] = {4,1,3};

int werte2[] = {2,1,7};

Diff paar1(werte1[0], werte2[0]);

Diff paar2(werte1[1], werte2[1]);

Diff paar3(werte1[2], werte2[2]);

cout << "Differenzen: " << differenzArray(werte1, werte2, 3) << endl;

cout << "Differenzen: " << paar1.getAbsDiff() + paar2.getAbsDiff() +

paar3.getAbsDiff() << endl;

}

Aufgabe:

? Bauen Sie die Funktion differenzArray zu einem Funktions-Template um, sodass die zwei Arrays

von einem anderen Zahlen-Typ (z.B. float, double, usw.) sein k?nnen.

? Bauen Sie die Klasse Diff zu einem Klassen-Template um, sodass die gespeicherten Werte a, b

von einem anderen Zahlen-Typ (z.B. float, double, usw.) sein k?nnen.

? Das neue Hauptprogramm main() nach dem Kasten zeigt die Verwendung der Templates mit dem

Datentyp float und muss nicht ver?ndert werden.

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

Name, Vorname: Matrikelnummer:

? Es erzeugt die folgende Beispielausgabe:

Differenzen: 6.2

Differenzen: 6.2

int main() {

float werte1[] = {4.2, 1.0, 3.1};

float werte2[] = {2.1, 1.0, 7.2};

Diff<float> paar1(werte1[0], werte2[0]);

Diff<float> paar2(werte1[1], werte2[1]);

Diff<float> paar3(werte1[2], werte2[2]);

cout << "Differenzen: " <<

differenzArray<float>(werte1, werte2, 3) << endl;

cout << "Differenzen: " <<

paar1.getAbsDiff()+ paar2.getAbsDiff() + paar3.getAbsDiff() << endl;

}

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

b) Schreiben Sie ein Programm, dass folgende Schritte nacheinander durchführt:

? Definieren Sie einen vector der STL der L?nge 2. Der Name des Vektors soll zahlen hei?en.

? Speichern Sie die Werte 3 und 5 in den beiden Elementen des Vektors.

? Setzen Sie die Gr??e des Vektors auf 5.

? H?ngen Sie hinten an den Vektor zwei weitere Werte 7 und 9. Dadurch erh?ht sich die Gr??e des

Vektors um 2.

? Setzen Sie die Kapazit?t des Vektors auf 20.

? Geben Sie alle Zahlen des Vektors mit Hilfe zu definierender Iteratoren und einer entsprechenden

Schleife auf der Konsole aus.

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

Name, Vorname: Matrikelnummer:

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur L?sung einer Aufgabe verwenden, kennzeichnen Sie dieses

auch direkt an der Aufgabe und streichen Sie nicht zu bewertende L?sungen!

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur L?sung einer Aufgabe verwenden, kennzeichnen Sie dieses

auch direkt an der Aufgabe und streichen Sie nicht zu bewertende L?sungen!

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

Name, Vorname: Matrikelnummer:

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur L?sung einer Aufgabe verwenden, kennzeichnen Sie dieses

auch direkt an der Aufgabe und streichen Sie nicht zu bewertende L?sungen!

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

Grundlagen der Programmierung & Datenverarbeitung WS 2019/20, 2. Klausur

Zusatzblatt. Wichtig: Falls Sie dieses Blatt zur L?sung einer Aufgabe verwenden, kennzeichnen Sie dieses

auch direkt an der Aufgabe und streichen Sie nicht zu bewertende L?sungen!

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


相关文章

【上一篇】:到头了
【下一篇】:没有了

版权所有:编程辅导网 2018 All Rights Reserved 联系方式:QQ:99515681 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。