From 7106f92c5136cacf5a7480d84b0824b11ac4a87a Mon Sep 17 00:00:00 2001 From: flavis Date: Fri, 17 Jan 2020 01:12:43 +0100 Subject: [PATCH 1/2] final vectors --- ws2019/ipi/uebungen/vectors.cc | 139 ++++++++++++++++++++++++++++++--- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/ws2019/ipi/uebungen/vectors.cc b/ws2019/ipi/uebungen/vectors.cc index a53c3b1..7992b64 100644 --- a/ws2019/ipi/uebungen/vectors.cc +++ b/ws2019/ipi/uebungen/vectors.cc @@ -1,25 +1,140 @@ #include #include +#include +#include -template +// a class implementing a mathematical vector +template class Vector { public: - Vector operator+(const Vector& y); // Vektoraddition - //T operator*(const Vector& y); // Skalarprodukt + // constructor, initializes vector with zeroes of length N + Vector() : _vector(N, 0) {} + // initialize by passing vector vec to initialize the vector object with + Vector(std::vector vec) { _vector = vec; } + + // copy constructor, assignment, destructor not needed + // all handled by std::vector + + // reference [] operator, used for assignments + K& operator[](int i) { + return _vector[i]; + } + + // const ref [] operator + K operator[](int i) const { + return _vector[i]; + } + + // return an iterator pointing to the first element of the underlying std::vector + typename std::vector::const_iterator begin() const { + return _vector.begin(); + } + + // return an iterator pointing to the last element of the underlying std::vector + typename std::vector::const_iterator end() const { + return _vector.end(); + } + + // dot product of two vectors of the same length + template + K operator*(const Vector& y) { + std::vector result(N); // new empty std::vector of correct size + // now multiply one element of the first with one of the second vector + std::transform(_vector.begin(), _vector.end(), y.begin(), result.begin(), std::multiplies()); + // and sum up the products + return std::accumulate(result.begin(), result.end(), 0); + } + + // vector addition + template + Vector operator+(const Vector& y) { + std::vector result(N); // new empty std::vector of correct size + // add elements by adding one element of the first to one of the second vector + std::transform(_vector.begin(), _vector.end(), y.begin(), result.begin(), std::plus()); + return Vector(result); + } + + // return the maximum value in the vector + K max() { + return *std::max_element(_vector.begin(), _vector.end()); + } + + // return the minimum value in the vector + K min() { + return *std::min_element(_vector.begin(), _vector.end()); + } + + // return the average value of the vector + K average() { + // sum up all elements + K sum = std::accumulate(_vector.begin(), _vector.end(), 0); + return sum / N; // and divide by length + } + + // run the specified function on each vector element + template + Vector map(F op) const { + std::vector result(N); // initialize new std::vector of correct size + // run op on each element + std::transform(_vector.begin(), _vector.end(), result.begin(), op); + return Vector(result); + } private: - std::vector _vector[N]; + std::vector _vector; // the private std::vector container }; -template -Vector Vector::operator+(const Vector& y) { - //for(int i = 0; i < _vector.last; i++) { - // std::cout << _vector[i] << std::endl; - //} - return y; +// print vector +template +std::ostream& operator<<(std::ostream& os, const Vector& v) { + os << "["; // opening brackets + for (size_t i = 0; i < N; i++) { + os << v[i]; // print element + if(i < N-1) { + os << ", "; // if not the last one, add comma + } + } + os << "]"; // closing brackets + return os; } +// scalar multiplication +template +Vector operator*(const Vector& v, const K2 k) { + // multiply a scalar value using the generic map function + return v.map(std::bind1st(std::multiplies(), k)); +} + +// scalar multiplication for scalar * vector +template +Vector operator*(const K2 k, const Vector& v) { + return v * k; +} + + +// example function +double foo(double val) { + return val*2+3; +} + +// testing out functionalities int main() { Vector a; - Vector b; - b = a+a; + Vector b; + a[0] = 0; + a[1] = 0; + a[2] = 4; + + b[0] = 42; + b[1] = -20; + b[2] = 3; + + std::cout << "Vektor a: " << a << ", Vektor b: " << b << std::endl; + std::cout << "a+b: " << a+b << std::endl; + std::cout << "a*b: " << a*b << std::endl; + std::cout << "42*b: " << 42*b << std::endl; + std::cout << "b*42: " << b*42 << std::endl; + std::cout << "max(a): " << a.max() << std::endl; + std::cout << "min(a): " << a.min() << std::endl; + std::cout << "mean(a): " << a.average() << std::endl; + std::cout << "foo angewendet auf b: " << b.map(foo) << std::endl; } From b4253673043da8f854ffdb131e9fd7b5632bd4b6 Mon Sep 17 00:00:00 2001 From: flavis Date: Fri, 17 Jan 2020 01:56:24 +0100 Subject: [PATCH 2/2] final ipi11 --- ws2019/ipi/uebungen/integration.cc | 35 +++ ws2019/ipi/uebungen/ipi11.pdf | Bin 0 -> 81904 bytes ws2019/ipi/uebungen/ipi11.tex | 331 +++++++++++++++++++++++++++++ ws2019/ipi/uebungen/vectors.cc | 2 +- 4 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 ws2019/ipi/uebungen/integration.cc create mode 100644 ws2019/ipi/uebungen/ipi11.pdf create mode 100644 ws2019/ipi/uebungen/ipi11.tex diff --git a/ws2019/ipi/uebungen/integration.cc b/ws2019/ipi/uebungen/integration.cc new file mode 100644 index 0000000..b72fff2 --- /dev/null +++ b/ws2019/ipi/uebungen/integration.cc @@ -0,0 +1,35 @@ +#include +#include + +// Implementiert die Trapezregel mit der Intervallanzahl n +// der unteren Integrationsgrenze a, der oberen Integrationsgrenze b +// und ueber die Funktion f +template +double trapezregel(int n, double a, double b, Function f) { + double h = (b-a)/n; // berechne intervalllaenge + double accum = 0; + for (int i = 1; i < n; i++) { + accum += f(a + i*h); // fuehre die summe aus + } + return h/2 * (f(a) + 2*accum + f(b)); // wende formel an +} + +// beispiel fuer funktor +class Wurzel { + public: + double operator()(double x) { + return std::sqrt(x); + } +}; + +int main() { + Wurzel f; + // fuehre integration fuer verschiedene Intervallanzahlen n aus + double integ10 = trapezregel(10, 0, 1.5, f); + double integ100 = trapezregel(100, 0, 1.5, f); + double integ1000 = trapezregel(1000, 0, 1.5, f); + std::cout << "Integral ueber sqrt(x) von 0 bis 1.5" << std::endl; + std::cout << "n = 10: " << integ10 << std::endl; + std::cout << "n = 100: " << integ100 << std::endl; + std::cout << "n = 1000: " << integ1000 << std::endl; +} diff --git a/ws2019/ipi/uebungen/ipi11.pdf b/ws2019/ipi/uebungen/ipi11.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d7f00fc43cef560d1b20a34ea841c72839fe22a GIT binary patch literal 81904 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�@5HNqkEX7%}KqdX2wp)7LqiU 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 +#include +#include "simplearray.cc" + +template +class Polynomial: public SimpleArray { + public: + // konstruiere Polynom vom Grad n + Polynomial (int n); + + // Default-Destruktor ist ok + // Default-Copy-Konstruktor ist ok + // Default-Zuweisung ist ok + + // Grad des Polynoms + int degree(); + + // Auswertung + T eval (T x); + + // Addition von Polynomen + Polynomial operator+ (Polynomial q); + + // Multiplikation von Polynomen + Polynomial operator* (Polynomial q); + + // Gleichheit + bool operator== (Polynomial q); + + // drucke Polynom + void print (); +}; + +// Constructor +template +Polynomial::Polynomial(int n) + : SimpleArray::SimpleArray(n+1,0.0) {} + +// Grad auswerten +template +int Polynomial::degree () +{ + return SimpleArray::maxIndex(); +} + +// Addition von Polynomen +template +Polynomial Polynomial::operator+ (Polynomial q) { + int nr=degree(); // mein grad + + if (q.degree()>nr) nr=q.degree(); + + Polynomial r(nr); // Ergebnispolynom + + for (int i=0; i<=nr; i=i+1) + { + if (i<=degree()) + r[i] = r[i]+(*this)[i]; // add me to r + if (i<=q.degree()) + r[i] = r[i]+q[i]; // add q to r + } + + return r; +} + +// Multiplikation von Polynomen +template +Polynomial Polynomial::operator* (Polynomial q) +{ + Polynomial r(degree()+q.degree()); // Ergebnispolynom + + for (int i=0; i<=degree(); i=i+1) + for (int j=0; j<=q.degree(); j=j+1) + r[i+j] = r[i+j] + (*this)[i]*q[j]; + + return r; +} + +// Drucken +template +void Polynomial::print () +{ + if (degree()<0) + std::cout << 0; + else + std::cout << (*this)[0]; + + for (int i=1; i<=SimpleArray::maxIndex(); i=i+1) + std::cout << " + " << (*this)[i] << "*x^" << i; + + std::cout << std::endl; +} + +int main() { + Polynomial p(2); + p[0] = 1.0; + p[1] = 1.0; + p.print(); + + p = p*p; + p.print(); + + Polynomial q(3); + q[0] = 2.0; + q[1] = -1.0; + q[3] = 4.0; + q.print(); +}\end{lstlisting} +\end{aufgabe} + +\begin{aufgabe} + Vektorimplementation + \begin{lstlisting}[language=C++, captionpos=b, title=vectors.cc] +#include +#include +#include +#include + +// a class implementing a mathematical vector +template +class Vector { + public: + // constructor, initializes vector with zeroes of length N + Vector() : _vector(N, 0) {} + // initialize by passing vector vec to initialize the vector object with + Vector(std::vector vec) { _vector = vec; } + + // copy constructor, assignment, destructor not needed + // all handled by std::vector + + // reference [] operator, used for assignments + K& operator[](int i) { + return _vector[i]; + } + + // const ref [] operator + K operator[](int i) const { + return _vector[i]; + } + + // return an iterator pointing to the first element of the underlying std::vector + typename std::vector::const_iterator begin() const { + return _vector.begin(); + } + + // return an iterator pointing to the last element of the underlying std::vector + typename std::vector::const_iterator end() const { + return _vector.end(); + } + + // dot product of two vectors of the same length + template + K operator*(const Vector& y) { + std::vector result(N); // new empty std::vector of correct size + // now multiply one element of the first with one of the second vector + std::transform(_vector.begin(), _vector.end(), y.begin(), result.begin(), std::multiplies()); + // and sum up the products + return std::accumulate(result.begin(), result.end(), 0); + } + + // vector addition + template + Vector operator+(const Vector& y) { + std::vector result(N); // new empty std::vector of correct size + // add elements by adding one element of the first to one of the second vector + std::transform(_vector.begin(), _vector.end(), y.begin(), result.begin(), std::plus()); + return Vector(result); + } + + // return the maximum value in the vector + K max() { + return *std::max_element(_vector.begin(), _vector.end()); + } + + // return the minimum value in the vector + K min() { + return *std::min_element(_vector.begin(), _vector.end()); + } + + // return the average value of the vector + K average() { + // sum up all elements + K sum = std::accumulate(_vector.begin(), _vector.end(), 0); + return sum / N; // and divide by length + } + + // run the specified function on each vector element + template + Vector map(F op) const { + std::vector result(N); // initialize new std::vector of correct size + // run op on each element + std::transform(_vector.begin(), _vector.end(), result.begin(), op); + return Vector(result); + } + private: + std::vector _vector; // the private std::vector container +}; + +// print vector +template +std::ostream& operator<<(std::ostream& os, const Vector& v) { + os << "["; // opening brackets + for (size_t i = 0; i < N; i++) { + os << v[i]; // print element + if(i < N-1) { + os << ", "; // if not the last one, add comma + } + } + os << "]"; // closing brackets + return os; +} + +// scalar multiplication for vector * scalar +template +Vector operator*(const Vector& v, const K2 k) { + // multiply a scalar value using the generic map function + return v.map(std::bind1st(std::multiplies(), k)); +} + +// scalar multiplication for scalar * vector +template +Vector operator*(const K2 k, const Vector& v) { + return v * k; +} + + +// example function +double foo(double val) { + return val*2+3; +} + +// testing out functionalities +int main() { + Vector a; + Vector b; + a[0] = 0; + a[1] = 0; + a[2] = 4; + + b[0] = 42; + b[1] = -20; + b[2] = 3; + + std::cout << "Vektor a: " << a << ", Vektor b: " << b << std::endl; + std::cout << "a+b: " << a+b << std::endl; + std::cout << "a*b: " << a*b << std::endl; + std::cout << "42*b: " << 42*b << std::endl; + std::cout << "b*42: " << b*42 << std::endl; + std::cout << "max(a): " << a.max() << std::endl; + std::cout << "min(a): " << a.min() << std::endl; + std::cout << "mean(a): " << a.average() << std::endl; + std::cout << "foo angewendet auf b: " << b.map(foo) << std::endl; +}\end{lstlisting} +\end{aufgabe} + +\begin{aufgabe}[Funktoren und statischer Polymorphismus] + \begin{enumerate}[(a)] + \item Integration mittels Trapezregel + für $n = 10$, $n = 100$ und $n = 1000$ beispielsweise ausgerechnet. +\begin{lstlisting}[language=C++, captionpos=b, title=integration.cc] +#include +#include + +// Implementiert die Trapezregel mit der Intervallanzahl n +// der unteren Integrationsgrenze a, der oberen Integrationsgrenze b +// und ueber die Funktion f +template +double trapezregel(int n, double a, double b, Function f) { + double h = (b-a)/n; // berechne intervalllaenge + double accum = 0; + for (int i = 1; i < n; i++) { + accum += f(a + i*h); // fuehre die summe aus + } + return h/2 * (f(a) + 2*accum + f(b)); // wende formel an +} + +// beispiel fuer funktor +class Wurzel { + public: + double operator()(double x) { + return std::sqrt(x); + } +}; + +int main() { + Wurzel f; + // fuehre integration fuer verschiedene Intervallanzahlen n aus + double integ10 = trapezregel(10, 0, 1.5, f); + double integ100 = trapezregel(100, 0, 1.5, f); + double integ1000 = trapezregel(1000, 0, 1.5, f); + std::cout << "Integral ueber sqrt(x) von 0 bis 1.5" << std::endl; + std::cout << "n = 10: " << integ10 << std::endl; + std::cout << "n = 100: " << integ100 << std::endl; + std::cout << "n = 1000: " << integ1000 << std::endl; +}\end{lstlisting} + + \item Vorteile der Verwendung von statischem Polymorphismus gegenüber dynamischem Polymorphismus: + \begin{itemize} + \item Auswertung zum Zeitpunkt des Kompilierens führt zu besserer Optimierung und + Fehlererkennung durch den Compiler. + \item Weniger Overhead durch VTABLE's, etc. + \item Deshalb effizienter und schneller + \end{itemize} + Nachteile: + \begin{itemize} + \item Potentiell unübersichtlicher + \item Größe der Programme als kompilierte Binärdatei ist größer + \end{itemize} + + \end{enumerate} +\end{aufgabe} + +\end{document} diff --git a/ws2019/ipi/uebungen/vectors.cc b/ws2019/ipi/uebungen/vectors.cc index 7992b64..bf2f35c 100644 --- a/ws2019/ipi/uebungen/vectors.cc +++ b/ws2019/ipi/uebungen/vectors.cc @@ -97,7 +97,7 @@ std::ostream& operator<<(std::ostream& os, const Vector& v) { return os; } -// scalar multiplication +// scalar multiplication for vector * scalar template Vector operator*(const Vector& v, const K2 k) { // multiply a scalar value using the generic map function