• Keine Ergebnisse gefunden

Algorithmen und Datenstrukturen (Informatik II)

N/A
N/A
Protected

Academic year: 2022

Aktie "Algorithmen und Datenstrukturen (Informatik II)"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

BERGISCHE UNIVERSIT ¨AT GESAMTHOCHSCHULE WUPPERTAL

GAUSS-STRASSE 20 42097 WUPPERTAL (Korrespondenzanschrift) 42119 WUPPERTAL (Lieferanschrift) TELEX 8 592 262 bughw TELEFAX (0202) 439-2901 TELEFON (0202) 439-1

Fachbereich 7

MATHEMATIK

Prof. Dr. Hans-J ¨urgen Buhl Praktische Informatik / Numerik

e-mail: Juergen.Buhl@math.uni-wuppertal.de

Algorithmen und Datenstrukturen (Informatik II)

SS2001 – ¨ Ubungsblatt 7 Abgabetermin: 18. Juni 2001

Aufgabe 1. Vektoren als Klasse, 4 Punkte Testen Sie das folgende Programm

(http://www.math.uni-wuppertal.de/buhl/teach/exercises/Inf2-SS01/vektor1.cc):

//////////////////////////////////

// Datei: vektor1.cc // Version: 1.0

// Zweck: Vektor als Klasse // Autor: Hans-Juergen Buhl // Datum: 26.01.99

//////////////////////////////////

#include <iostream>

using namespace std;

class vektor{

const int low; // v(low..high) const int high;

double* v; // Startadresse fuer dyn. verwaltetes Exemplar public:

vektor(int h, int l = 1, double d = 0.0);

// v(l..h) = d

vektor(const double x[], int n); // v(1..n) = x[0..n-1]

~vektor(){ delete []v; };

double& operator()(int i);

double operator()(int i) const;

1

(2)

int lo() const { return low; };

int hi() const { return high; };

friend ostream& operator<<(ostream& os, const vektor& v);

};

vektor::vektor(int h, int l, double d) : low(l), high(h) {

int size(h-l+1);

if (size < 1) throw "falsche Vektor-L¨ange in Konstruktor";

v = new double[size];

if (v == 0) throw "kein freier Speicherplatz mehr verf¨ugbar";

for (int j=0; j < size; j++) v[j] = d;

};

vektor::vektor(const double x[], int n) : low(1), high(n) {

if (n < 1) throw "falsche Vektor-L¨ange in Konstruktor";

// ... z u e r g ¨a n z e n };

double& vektor::operator()(int i) {

if ( (i < low) || (i > high)) throw "Indexverletzung bei Komponentenzugriff";

return v[i-low];

};

double vektor::operator()(int i) const {

if ( (i < low) || (i > high)) throw "Indexverletzung bei Komponentenzugriff";

return v[i-low];

};

ostream& operator<<(ostream& os, const vektor& w) {

os << "( ";

os << w(w.lo());

for (int i=w.lo()+1; i <= w.hi(); i++) os << " , " << w(i);

os << " )";

return os;

};

int main() {

vektor y(5, 1, 3.0);

cout << y.lo() << " " << y.hi() << endl;

cout << y << endl;

for (int i=y.lo(); i <= y.hi(); i++)

2

(3)

y(i) = i*2;

cout << y << endl;

vektor x(8, 2);

cout << x.lo() << " " << x.hi() << endl;

cout << x << endl;

for (int k=x.lo(); k <= x.hi(); k++) x(k) = k*2;

cout << x << endl;

double zh[] = { 1.0, 3.0, 2.0, 4.0 };

vektor z(zh, 4);

cout << z.lo() << " " << z.hi() << endl;

for (int j=z.lo(); j <= z.hi(); j++) z(j) *= z(j);

cout << z << endl;

return 0;

}

Erg¨anzen Sie die Implementierung von

vektor::vektor(const double x[], int n)

Testen Sie erneut. Z¨ahlen Sie die Observatoren der Klasse auf. Beschreiben Sie die Testf¨alle in int main(). Wozu dient der Destruktor vektor()?

Aufgabe 2. Vektoren als Klasse, Forts.: Diskussion vektor1.cc, 4 Punkte

Welche verschiedenen Signaturen werden durch die Vereinbarung vektor(int h, int l = 1, double d = 0.0);

dem Benutzer zur Verf¨ugung gestellt? Testen Sie!

Schreiben Sie einen Konstruktor vektor(int h, double d);

und testen Sie.

Schreiben Sie eine Methode double Norm() const;

zur Berechung der euklidischen Norm eines Vektors und testen Sie.

Testen Sie den Zugriff auf eine nicht existierende Komponente eines Vektors.

Warum ist die Vereinbarung

double operator()(int i) const;

notwendig? Entfernen Sie dazu zun¨achst diese Methode und compilie- ren Sie erneut.

Aufgabe 3. Vektoren als Klasse, Forts.: Kopierkonstruktor, 4 Punkte Programmieren Sie den Kopierkonstruktor:

3

(4)

...

vektor(const vektor& w);

...

vektor::vektor(const vektor& w) : low(w.low), high(w.high) {

int size(high-low+1);

// h i e r e r g ¨a n z e n ! };

Aufgabe 4. Vektoren als Klasse, Forts.: Zuweisungsoperator, 4 Punkte Testen Sie

...

int low; // v(low..high) int high;

...

vektor& operator=(const vektor& w);

...

vektor& vektor::operator=(const vektor& w) {

if (this != &w) {

// h i e r e r g ¨a n z e n ! };

return *this;

};

durch geeignete Aufrufe in main.

Begr¨unden sie die Unterschiede zum Kopierkonstruktor.

Aufgabe 5. Vektoren als Klasse, Forts.: Einheitsvektoren, 4 Punkte Schreiben Sie eine Funktion

static vektor ei(int n, int i);

zur R¨uckgabe des Einheitsvektorsei Rn und benutzen Sie diese.

cProf. Dr. Hans-J¨urgen Buhl

4

Referenzen

ÄHNLICHE DOKUMENTE

Sollen Objekte zur Laufzeit von anderen Objekten erzeugt werden, so wird dazu der new-Operator verwendet. Objekte können sowohl in Form von Instanzvariablen oder in Form von

Tabellieren Sie die Werte, die m , n, q und r von Schleifendurchlauf zu Schlei- fendurchlauf annehmen, wenn der ggT von 15333 und 1235 mit Hilfe des euklidischen Algorithmus

” Spezifizieren“ Sie in Form eines Klassendiagramms (vgl. Sparbuch- Spezifikation der Vorlesung) einen Datentyp Bestellung.

Durch Modifikation einer Eigenschaft oder Hinzuf¨ ugen einer neuen Eigen- schaft kann die implizite Spezifikation so ge¨ andert werden, dass nur noch die Funktion CHS diese erf¨

Schreiben Sie ein Programm, das mit Hilfe des in C++ vordefinierten Datentyps string Zeichenketten vom Benutzer anfordert und sodann nach einem Kontrollausdruck der

Schreiben Sie (in C++) eine erste Version des Datentyps Bestellung (Aufgabe 4 / ¨ Ubungsblatt 3) mit Attributen Kundenname, Kundennummer, Lieferadresse, Rechnungsadresse, (zun¨

Vektoren als Klasse, Forts.: operator+ und operator*, 7 Punkte Schreiben Sie analog Methoden vektor operator+(const vektor&amp; w) const.. und (friend-)Funktionen friend

Wie ist es zu ¨ andern, wenn die Matrix nicht — wie oben — spaltenweise, sondern zeilenweise abgespeichert werden soll.. Testen Sie