diff --git a/ws2019/ipi/uebungen/polynomial.cc b/ws2019/ipi/uebungen/polynomial.cc new file mode 100644 index 0000000..53c4f7e --- /dev/null +++ b/ws2019/ipi/uebungen/polynomial.cc @@ -0,0 +1,108 @@ +#include +#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(); +} diff --git a/ws2019/ipi/uebungen/simplearray.cc b/ws2019/ipi/uebungen/simplearray.cc new file mode 100644 index 0000000..9039510 --- /dev/null +++ b/ws2019/ipi/uebungen/simplearray.cc @@ -0,0 +1,89 @@ +template +class SimpleArray { + public: + SimpleArray (int s, T f); + SimpleArray (const SimpleArray&); + SimpleArray& operator=(const SimpleArray&); + ~SimpleArray(); + + T& operator[](int i); + int numIndices(); + int minIndex(); + int maxIndex(); + bool isMember(int i); + + private: + int n; // Anzahl Elemente + T *p; // Zeiger auf built-in array +}; + +// Destruktor +template +SimpleArray::~SimpleArray () { + delete[] p; +} + +// Konstruktor +template +SimpleArray::SimpleArray (int s, T v) { + n = s; + p = new T[n]; + for (int i=0; i +SimpleArray::SimpleArray (const SimpleArray& a) { + n = a.n; + p = new T[n]; + for (int i=0; i +SimpleArray& SimpleArray::operator=(const SimpleArray& a) { + if (&a!=this) { + if (n!=a.n) { + delete[] p; + n = a.n; + p = new T[n]; + } + for (int i=0; i +inline T& SimpleArray::operator[] (int i) { + return p[i]; +} + +template +inline int SimpleArray::numIndices () { + return n; +} + +template +inline int SimpleArray::minIndex () { + return 0; +} + +template +inline int SimpleArray::maxIndex () { + return n-1; +} + +template +inline bool SimpleArray::isMember (int i) { + return (i>=0 && i +std::ostream& operator<< (std::ostream& s, SimpleArray& a) { + s << "#( "; + for (int i=a.minIndex(); i<=a.maxIndex(); i=i+1) + s << a[i] << " "; + s << ")" << std::endl; + return s; +}