diff --git a/ws2019/ipi/uebungen/ipi10.pdf b/ws2019/ipi/uebungen/ipi10.pdf new file mode 100644 index 0000000..e73482f Binary files /dev/null and b/ws2019/ipi/uebungen/ipi10.pdf differ diff --git a/ws2019/ipi/uebungen/ipi10.tex b/ws2019/ipi/uebungen/ipi10.tex new file mode 100644 index 0000000..77ad7e3 --- /dev/null +++ b/ws2019/ipi/uebungen/ipi10.tex @@ -0,0 +1,110 @@ +\documentclass[uebung]{../../../lecture} + +\title{IPI: Übungsblatt 10} +\author{Samuel Weidemaier, Christian Merten} + +\usepackage[]{listings} + +\usepackage{xcolor} + +\lstdefinestyle{mystyle}{ + commentstyle=\color{gray}, + language=C++, + keywordstyle=\color{blue}, + numberstyle=\tiny\color{gray}, + stringstyle=\color{black}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + +\begin{document} + +\begin{aufgabe} + siehe \textit{readfiles.cpp} +\end{aufgabe} + +\begin{aufgabe} + \begin{lstlisting}[language=C++, title=Fehlersuche, captionpos=b] +#include +class A +{ + public: + int ap; + void X(); + private: + int aq; + void aX(); +}; + +class B : public A +{ + public: + int bp; + void Y(); + private: + int bq; + void bY(); +}; + +class C : public B +{ + public: + int cp; + void Z(); + private: + int cq; + void cZ(); +}; + +void A::X() { }; +void A::aX() { }; +void B::bY() { }; +void C::Z() { }; + +void B::Y() +{ + bq = bp; + aq = ap; // Fehler: A::aq ist privat, also in B nicht sichtbar + bY(); +} + +void C::cZ() +{ + ap = 1; + bp = 2; + cq = 3; + X(); + Y(); + aX(); // Fehler: A::aX() ist privat, also in C nicht sichtbar +} + +int main() +{ + A a; B b; C c; + + a.X(); + b.bY(); // Fehler: B::bY() ist privat, also hier nicht sichtbar + c.cp = 4; + c.bp = 1; + c.ap = 2; + c.aq = 5; // Fehler: A::aq ist privat, in C nicht sichtbar und erst recht nicht hier + + b.ap = c.ap; + + return 0; +} + \end{lstlisting} +\end{aufgabe} + +\end{document} diff --git a/ws2019/ipi/uebungen/readfiles.cpp b/ws2019/ipi/uebungen/readfiles.cpp new file mode 100644 index 0000000..a3a3be1 --- /dev/null +++ b/ws2019/ipi/uebungen/readfiles.cpp @@ -0,0 +1,39 @@ +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + // check if correct argument count + if (argc < 2) { + printf("Dateiname erwartet\n"); + return 1; + } + + // get filename from argument list + string filename = argv[1]; + // open input file + ifstream fileIn; + fileIn.open(filename + ".txt"); + // open output file + ofstream fileOut; + fileOut.open(filename + "-a.txt"); + // check if we could open the files + if (!fileIn.good() || !fileOut.good()) { + // could not open files + cout << "Konnte Datei " + filename + ".txt nicht lesen" << endl; + return 1; + } + string input; // variable containing line + int lineNo = 1; // count lines + while(getline(fileIn, input)) { // while there is still a line left + // write out line with prepended line number to output file + fileOut << to_string(lineNo) + ": " + input << endl; + // increment line counter + lineNo += 1; + } + // close files + fileIn.close(); + fileOut.close(); +} diff --git a/ws2019/ipi/uebungen/virtuals.cpp b/ws2019/ipi/uebungen/virtuals.cpp new file mode 100644 index 0000000..ca2d8c4 --- /dev/null +++ b/ws2019/ipi/uebungen/virtuals.cpp @@ -0,0 +1,57 @@ +class A { + public: + void a() { }; + virtual void va() = 0; + virtual void a(int n); + private: + void c() { }; +}; + +class B : public A { + public: + void b() { }; + virtual void vb(); + void a(double d) { }; + void a(int i) { }; + virtual void va(); +}; + +class C : public B { + public: + virtual void c(); + void a(float) { }; + virtual void a(); + virtual void va(); +}; + +int main() { + // A a; A abstrakte Klasse + B b; + C c; + A* pa=&b; + B* pb=&c; + float x = 1.2; + pa->a(); + pa->va(); + pa->a(1); + // pa->c(); A::c() private, hier nicht sichtbar + // pa->b(); pa ist vom Typ A* und kennt deswegen b() nicht + // pa->vb(); pa ist vom Typ A* und kennt deswegen vb() nicht + pa->a(x); + // pb->a(); pb ist vom Typ B*, hier ist A::a() überladen durch + // entweder B::a(double) bzw. B::a(int) nicht durch B::a() + pb->va(); + pb->a(1); + // pb->c(); A::c() private, deswegen hier nicht sichtbar + pb->b(); + pb->vb(); + pb->a(x); + pa = &c; + pa->a(); + pa->va(); + pa->a(1); + // pa->c(); A::c() private, hier nicht sichtbar + // pa->b(); pa ist vom Typ A*, kennt deswegen b() nicht + // pa->vb(); pa ist vom Typ A*, kennt deswegen vb() nicht + pa->a(x); +}