Lösungsvorschlag zum Übungsblatt 4 zur Vorlesung Informatik II / WS2001/02 Prof. Dr.-Ing. Holger Vogelsang (FH-Karlsruhe) Dipl.-Inform. (FH) Gudrun Keller (FH-Karlsruhe) Dipl.-Inform. Mathias Supp (.riess applications gmbh) Aufgabe 1 a) #include "Matrix.h" #include "Vector.h" int main() { #ifndef _INC_MATRIX #define _INC_MATRIX Main.cpp Matrix.h double** newmatrix(int rowcount, int columncount); void deletematrix(double** matrix, int rowcount); double** matrixmult( double** matrix1, int rowcount1, int columncount1, double** matrix2, int rowcount2, int columncount2 ); double* matrixvectormult( double** matrix, int rowcount, int columncount, double* vector, int elementcount ); void printmatrix( double** matrix, int rowcount, int columncount ); 22. Oktober 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 1/10
b) #include "Matrix.h" #include "Vector.h" #ifndef _INC_VECTOR #define _INC_VECTOR Matrix.cpp Vector.h double* newvector(int elementcount); void deletevector(double* vector); void printvector(double* vector, int elementcount); #include "Vector.h" Vector.cpp Vector.h #ifndef _INC_VECTOR #define _INC_VECTOR double getscalarproduct( double* vector1, double* vector2, int elementcount ); Vector.cpp double getscalarproduct( double* vector1, double* vector2, int elementcount ) { double result = 0.0; for( i = 0; i < elementcount; i++ ) { result += vector1[i] * vector2[i]; return result; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 2/10
Aufgabe 2 #ifndef _INC_EXAMPLE #define _INC_EXAMPLE ClassExample.h a) b) c) d) #include "ClassExample.h" ClassExample.cpp ClassExample::ClassExample() { cout << "Constructing" << endl; this->value = 0; ClassExample::ClassExample(int value) { cout << "Constructing " << value << endl; this->value = value; ClassExample::ClassExample(const ClassExample& source) { cout << "Copying " << source.value << endl; this->value = source.value; ClassExample::~ClassExample() { cout << "Destructing " << this->value << endl; this->value = -1; ClassExample& ClassExample::operator =(const ClassExample& source) { if( &source!= this ) { cout << "Assigning " << source.value << " to " << this->value << endl; this->value = source.value; else { cout << "Assigning " << this->value << " to itself." << endl; return(*this); 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 3/10
e) #include "ClassExample.h" void test(classexample c) { cout << "test" << endl; int main() { Main.cpp ClassExample c1; // Constructing (c1) ClassExample c2(2); // Constructing 2 (c2) ClassExample c3(17); // Constructing 17 (c3) test(c1); // Copying 0 (c) test Destructing 0 (c) test(c2); // Copying 2 (c) test Destructing 2 (c) test(c3); // Copying 17 (c) test Destructing 17 (c) c2 = c3; // Assigning 17 to 2 (c2) return 0; // Destructing 17 (c3) // Destructing 17 (c2) // Destructing 0 (c1) 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 4/10
Aufgabe 3 #ifndef MATRIX_H #define MATRIX_H #include "Vector.h" #ifndef VECTOR_H #define VECTOR_H #include "Matrix.h" Matrix.h Vector.h Matrix.cpp / Konstruktor + Includes Matrix::Matrix(int rowcount, int columncount) { int j; this->rowcount = rowcount; this->columncount = columncount; elements = new double*[rowcount]; for( i = 0; i < rowcount; i++ ) { elements[i] = new double[columncount]; for( j = 0; j < columncount; j++ ) { elements[i][j] = 0; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 5/10
Matrix.cpp / Kopierkonstruktor Matrix::Matrix(const Matrix& source) { int j; this->rowcount = source.rowcount; this->columncount = source.columncount; elements = new double*[rowcount]; for( i = 0; i < rowcount; i++ ) { elements[i] = new double[columncount]; for( j = 0; j < columncount; j++ ) { elements[i][j] = source.elements[i][j]; Matrix.cpp / Zuweisungsoperator Matrix& Matrix::operator =(const Matrix& source) { if( this!= &source) { this->~matrix(); this->matrix::matrix(source); return *this; Matrix::~Matrix() { Matrix.cpp / Destruktor for( i = 0; i < rowcount; i++ ) { delete[] elements[i]; delete[] elements; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 6/10
Matrix.cpp / Zugriffsmethoden // access methods for setting element values void Matrix::setElementAt(int row, int column, double element) { elements[row][column] = element; // access methods for reading element values double Matrix::getElementAt(int row, int column) const { return elements[row][column]; int Matrix::getRowCount() const { return rowcount; int Matrix::getColumnCount() const { return columncount; Matrix.cpp / Matrix-Matrix-Multiplikation Matrix Matrix::mult(const Matrix& matrix) const { int colmatrix1; int colmatrix2; int row; Matrix result(this->rowcount, matrix.columncount); for( row = 0; row < this->rowcount; row++ ) { for( colmatrix2 = 0; colmatrix2 < matrix.columncount; colmatrix2++ ) { for( colmatrix1 = 0; colmatrix1 < this->columncount; colmatrix1++ ) { result.elements[row][colmatrix2] += elements[row][colmatrix1] * matrix.elements[colmatrix1][colmatrix2]; return result; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 7/10
Matrix.cpp / Matrix-Vektor-Multiplikation Vector Matrix::mult(const Vector& vector) const { int colmatrix1; int row; Vector result(rowcount); for( row = 0; row < rowcount; row++ ) { { for( colmatrix1 = 0; colmatrix1 < columncount; colmatrix1++ ) result.elements[row] += elements[row][colmatrix1] * vector.getelementat(colmatrix1); return result; void Matrix::toStdOut() { int row; int col; Matrix.cpp / Anzeigemethode for( row = 0; row < rowcount; row++ ) { for( col = 0; col < columncount; col++ ) { cout << elements[row][col] << " "; cout << endl; cout << endl; #include "Vector.h" Vector.cpp / Konstruktor + Includes // constructors Vector::Vector(int elementcount) { this->elementcount = elementcount; elements = new double[elementcount]; for( i = 0; i < elementcount; i++ ) { elements[i] = 0; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 8/10
Vector.cpp / Kopierkonstruktor // copy constructor Vector::Vector(const Vector& source) { this->elementcount = source.elementcount; elements = new double[elementcount]; for( i = 0; i < elementcount; i++ ) { elements[i] = source.elements[i]; Vector.cpp / Zuweisungsoperator Vector& Vector::operator =(const Vector& source) { if( this!= &source ) { this->~vector(); this->vector::vector(source); return *this; Vector::~Vector() { delete[] elements; Vector.cpp / Destruktor Vector.cpp / Zugriffsmethoden // access methods for setting element values void Vector::setElementAt(int index, double element) { elements[index] = element; // access methods for reading element values double Vector::getElementAt(int index) const { return elements[index]; int Vector::getElementCount() const { return elementcount; Vector.cpp / Vektor-Vektor-Multiplikation double Vector::mult(const Vector& vector) const { double result = 0.0; for( i = 0; i < elementcount; i++ ) { result += elements[i] * vector.elements[i]; return result; 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 9/10
Vector.cpp / Anzeigemethode void Vector::toStdOut() const { for( i = 0; i < elementcount; i++ ) { cout << elements[i] << endl; cout << endl; Die Aufgaben werden am 25. Oktober 2001 besprochen. Der Webzugriff auf Übungsblatt 4 über http://www.riess.de/supp/ws01_02/infoii/uebungsblatt4 12. November 2001 Übungsblatt 4 zur Vorlesung Informatik II Seite 10/10