From ea3ea7d4d8b2c588aeeb51da8e331094f82e0010 Mon Sep 17 00:00:00 2001 From: flavis Date: Sun, 15 Dec 2019 18:57:15 +0100 Subject: [PATCH] add ipi8 --- ws2019/ipi/uebungen/ipi8.pdf | Bin 0 -> 57891 bytes ws2019/ipi/uebungen/ipi8.tex | 285 ++++++++++++++++++++++++++++++ ws2019/ipi/uebungen/listclass.cpp | 210 ++++++++++++++++++++++ 3 files changed, 495 insertions(+) create mode 100644 ws2019/ipi/uebungen/ipi8.pdf create mode 100644 ws2019/ipi/uebungen/ipi8.tex create mode 100644 ws2019/ipi/uebungen/listclass.cpp diff --git a/ws2019/ipi/uebungen/ipi8.pdf b/ws2019/ipi/uebungen/ipi8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f3ba5daf89b0f2626d35bc0fcc98eda6c65711b GIT binary patch literal 57891 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 TUKo4=V16zD1B0xZ9N<3yPs9)0 literal 0 HcmV?d00001 diff --git a/ws2019/ipi/uebungen/ipi8.tex b/ws2019/ipi/uebungen/ipi8.tex new file mode 100644 index 0000000..ed695ca --- /dev/null +++ b/ws2019/ipi/uebungen/ipi8.tex @@ -0,0 +1,285 @@ +\documentclass[uebung]{../../../lecture} + +\title{IPI: Übungsblatt 8} +\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} + +\punkte + +\begin{aufgabe} Konstruktoren + +\begin{tabular}{llllllllllll} + \textbf{37}: & a int-Konstruktor & b int-Konstruktor \\ + \textbf{38}: & c Copy-Konstruktor & d Konstruktor & e Konstruktor \\ + \textbf{39}: & d int-Zuweisung \\ + \textbf{40}: & T Copy-Konstruktor & T Addition & U int-Konstruktor & V Copy-Konstruktor + & U Destruktor \\ + & W Copy-Konstruktor & V Destruktor & d Zuweisung & W Destruktor & T Destruktor\\ + \textbf{41}: & d Addition & T int-Konstruktor & U Copy-Konstruktor & T Destruktor & U Addition \\ + & V int-Konstruktor & W Copy-Konstruktor & V Destruktor & e Zuweisung & W Destruktor\\ + & U Destruktor \\ + \textbf{42}: & e Destruktor & d Destruktor & c Destruktor & b Destruktor & a Destruktor \\ +\end{tabular} + +\end{aufgabe} + +\begin{aufgabe} + \begin{enumerate}[(a)] + \item Der Implementierung liegt weiterhin eine einfach verkettete Liste zu Grunde. Konkret + wird die \lstinline{struct IntListElem} verwendet. + + Es wird ein Zeiger \lstinline{IntListElem* first} auf das erste Listenelement, eine + Variable \lstinline{int count}, die die Länge der Liste speichert und zwei Hilfsmethoden, + \lstinline{IntListElem* getListElement(int position)}, die einen Zeiger auf das interne + Listenelement zurückgibt und \lstinline{void copy(IntList& other)}, die die Listenelemente + von einer anderen Liste kopiert, verwendet. + + Der leere Konstruktor setzt \lstinline{first} und \lstinline{count} auf 0, genauso wie + der Destruktor. Dies führt zur Initialisierung bzw. Leerung der Liste. Der Copy-Konstruktor + bzw. Zuweisungsoperator initialisieren bzw. leeren die Liste ebenfalls zunächst und + kopieren dann mithilfe der \lstinline{copy} Methode, die Elemente einer zweiten Liste. + \item + + \begin{lstlisting}[language=C++, title=listclass.cpp, captionpos=b] +#include + +// a list element +struct IntListElem { + int value; // int value + IntListElem* next; // pointer to the next element +}; + +// A list of integers +// Beware: indexing is done starting from 1 as the excercise sheet requests it +class IntList { +public: + // empty constructor, creates an empty list + IntList(); + + // copy constructor, intializes by copying from 'other' + IntList(IntList& other); + + // assignment operator, removes own elements and copies from 'other' + IntList& operator=(IntList& other); + + // destructor, removes list content + ~IntList(); + + // returns the number of elements in the list + int getCount(); + + // returns if the list is empty + bool isEmpty(); + + // prints the list + void print(); + + // inserts 'element' in the beginning of the list + void insert(int element); + + // inserts 'element' AFTER 'position' + void insert(int element, int position); + + // removes the element AFTER 'position' + void remove(int position); + + // returns the element AT 'position' + int getElement(int position); +private: + // pointer to first element + IntListElem* first; + // element count + int count; + + // returns the IntListElem AT 'position' + IntListElem* getListElement(int position); + + // Kopiert die Liste 'other' + void copy(IntList& other); +}; + +// creates new empty list +IntList::IntList() { + first = 0; + count = 0; +} + +// creates a new list by copying an old one +IntList::IntList(IntList& list) { + copy(list); +} + +// Assignment operator +IntList& IntList::operator=(IntList& other) { + if (this == &other) { // if assigning to the same object + return *this; // do nothing + } + copy(other); // otherwise copy contents + return *this; +} + +// destroys the list +IntList::~IntList() { + first = 0; // remove the connection to the list elements + count = 0; // reset list count +}; + +// private helper that copies from 'other' list +void IntList::copy(IntList& other) { + // clear and copy elements + first = 0; + count = 0; + // copy element by element from 'other' to this new list + for (int i = 1; i <= other.count; i++) { + insert(other.getElement(i), i-1); + } +} + +// private helper that returns the list element struct AT 'position' +IntListElem* IntList::getListElement(int position) { + IntListElem* current = first; + for (int i = 1; i < position; i++) { + // if list is not long enough + if (current->next == 0) { + // return the last element + return current; + } + current = current->next; + } + return current; +} + +// return element AT 'position' +int IntList::getElement(int position) { + if (position < 1 || position > count) { + printf("Error: Index out of Bounds, no element at position %d\n", position); + return -1; + } + return getListElement(position)->value; // return the value of the element +} + +// insert 'element' AFTER 'position' +void IntList::insert(int element, int position) { + if (position < 0 || position > count) { // check for invalid positions + printf("Error: Index out of Bounds, can't insert.\n"); + return; + } + IntListElem* elem = new IntListElem(); // create a new list element + elem->value = element; // with the given value + if (position == 0) { // insert in the very beginning + elem->next = first; // the successor of elem is the old first, now second element + first = elem; // make the new element the new first + } else { + IntListElem* where = getListElement(position); // find the element to insert after + elem->next = where->next; // make the old successor of where now follow elem + where->next = elem; // make elem the new successor of where + } + count += 1; + return; +} + +// insert 'element' in the very beginning of the list +void IntList::insert(int element) { + insert(element, 0); // insert AFTER position 0 +} + +// remove next element AFTER 'position' +void IntList::remove(int position) { + if (position < 0 || position >= count) { // check for invalid positions + printf("Error: Index out of bounds, can't remove after %d\n", position); + return; + } + if (position == 0) { // remove first element + first = first->next; // new first is the new element + } else { + IntListElem* where = getListElement(position); // find the element to remove after + where->next = where->next->next; // remove by skipping the next element of where + } + count -= 1; // reduce element count + return; +} + +// check if list is empty +bool IntList::isEmpty() { + return count == 0; +} + +// returns the list's size +int IntList::getCount() { + return count; +} + +// print a list of integers +void IntList::print() { + printf("["); // opening brackets + IntListElem* current = first; + while (current != 0) { // while not last element + printf("%d", current->value); // print value + if (current->next != 0) { + printf(", "); // if not the last element, append a comma + } + current = current->next; // go to next + } + printf("]\n"); // closing brackets +} + +int main() { + IntList list; + list.insert(30); + list.insert(20); + list.insert(10); + list.print(); + + list.remove(2); + list.print(); + + list.insert(30,2); + list.print(); + + list.insert(40,3); + list.print(); + + IntList copy(list); + copy.print(); + + copy.remove(0); + copy.print(); + list.print(); + + copy = list; + copy.print(); + + return 0; +} + \end{lstlisting} + \end{enumerate} +\end{aufgabe} + +\end{document} diff --git a/ws2019/ipi/uebungen/listclass.cpp b/ws2019/ipi/uebungen/listclass.cpp new file mode 100644 index 0000000..78a7dc8 --- /dev/null +++ b/ws2019/ipi/uebungen/listclass.cpp @@ -0,0 +1,210 @@ +#include + +// a list element +struct IntListElem { + int value; // int value + IntListElem* next; // pointer to the next element +}; + +// A list of integers +// Beware: indexing is done starting from 1 as the excercise sheet requests it +class IntList { +public: + // empty constructor, creates an empty list + IntList(); + + // copy constructor, intializes by copying from 'other' + IntList(IntList& other); + + // assignment operator, removes own elements and copies from 'other' + IntList& operator=(IntList& other); + + // destructor, removes list content + ~IntList(); + + // returns the number of elements in the list + int getCount(); + + // returns if the list is empty + bool isEmpty(); + + // prints the list + void print(); + + // inserts 'element' in the beginning of the list + void insert(int element); + + // inserts 'element' AFTER 'position' + void insert(int element, int position); + + // removes the element AFTER 'position' + void remove(int position); + + // returns the element AT 'position' + int getElement(int position); +private: + // pointer to first element + IntListElem* first; + // element count + int count; + + // returns the IntListElem AT 'position' + IntListElem* getListElement(int position); + + // Kopiert die Liste 'other' + void copy(IntList& other); +}; + +// creates new empty list +IntList::IntList() { + first = 0; + count = 0; +} + +// creates a new list by copying an old one +IntList::IntList(IntList& list) { + copy(list); +} + +// Assignment operator +IntList& IntList::operator=(IntList& other) { + if (this == &other) { // if assigning to the same object + return *this; // do nothing + } + copy(other); // otherwise copy contents + return *this; +} + +// destroys the list +IntList::~IntList() { + first = 0; // remove the connection to the list elements + count = 0; // reset list count +}; + +// private helper that copies from 'other' list +void IntList::copy(IntList& other) { + // clear and copy elements + first = 0; + count = 0; + // copy element by element from 'other' to this new list + for (int i = 1; i <= other.count; i++) { + insert(other.getElement(i), i-1); + } +} + +// private helper that returns the list element struct AT 'position' +IntListElem* IntList::getListElement(int position) { + IntListElem* current = first; + for (int i = 1; i < position; i++) { + // if list is not long enough + if (current->next == 0) { + // return the last element + return current; + } + current = current->next; + } + return current; +} + +// return element AT 'position' +int IntList::getElement(int position) { + if (position < 1 || position > count) { + printf("Error: Index out of Bounds, no element at position %d\n", position); + return -1; + } + return getListElement(position)->value; // return the value of the element +} + +// insert 'element' AFTER 'position' +void IntList::insert(int element, int position) { + if (position < 0 || position > count) { // check for invalid positions + printf("Error: Index out of Bounds, can't insert.\n"); + return; + } + IntListElem* elem = new IntListElem(); // create a new list element + elem->value = element; // with the given value + if (position == 0) { // insert in the very beginning + elem->next = first; // the successor of elem is the old first, now second element + first = elem; // make the new element the new first + } else { + IntListElem* where = getListElement(position); // find the element to insert after + elem->next = where->next; // make the old successor of where now follow elem + where->next = elem; // make elem the new successor of where + } + count += 1; + return; +} + +// insert 'element' in the very beginning of the list +void IntList::insert(int element) { + insert(element, 0); // insert AFTER position 0 +} + +// remove next element AFTER 'position' +void IntList::remove(int position) { + if (position < 0 || position >= count) { // check for invalid positions + printf("Error: Index out of bounds, can't remove after %d\n", position); + return; + } + if (position == 0) { // remove first element + first = first->next; // new first is the new element + } else { + IntListElem* where = getListElement(position); // find the element to remove after + where->next = where->next->next; // remove by skipping the next element of where + } + count -= 1; // reduce element count + return; +} + +// check if list is empty +bool IntList::isEmpty() { + return count == 0; +} + +// returns the list's size +int IntList::getCount() { + return count; +} + +// print a list of integers +void IntList::print() { + printf("["); // opening brackets + IntListElem* current = first; + while (current != 0) { // while not last element + printf("%d", current->value); // print value + if (current->next != 0) { + printf(", "); // if not the last element, append a comma + } + current = current->next; // go to next + } + printf("]\n"); // closing brackets +} + +int main() { + IntList list; + list.insert(30); + list.insert(20); + list.insert(10); + list.print(); + + list.remove(2); + list.print(); + + list.insert(30,2); + list.print(); + + list.insert(40,3); + list.print(); + + IntList copy(list); + copy.print(); + + copy.remove(0); + copy.print(); + list.print(); + + copy = list; + copy.print(); + + return 0; +}