diff --git a/20191010/hello-1.c b/20191010/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20191010/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191010/hello-2.c b/20191010/hello-2.c
deleted file mode 100644
index ddcad51dc1156caa708cda67ad4dbd72605d2235..0000000000000000000000000000000000000000
--- a/20191010/hello-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  "Hello, world!\n";
-  return 0;
-}
diff --git a/20191010/hello-3.c b/20191010/hello-3.c
deleted file mode 100644
index 7d93cfbf2228925cd9d3b11dd229b09b9b54f549..0000000000000000000000000000000000000000
--- a/20191010/hello-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  Hello, world!\n;
-  return 0;
-}
diff --git a/20191010/hello.pas b/20191010/hello.pas
deleted file mode 100644
index 88c15874fa0ff0ba435de5373fa1c04edd31fc19..0000000000000000000000000000000000000000
--- a/20191010/hello.pas
+++ /dev/null
@@ -1,5 +0,0 @@
-program Hello;
-
-begin
-  WriteLn ('Hello, world!')
-end.
diff --git a/20191010/hp-2019ws-p1.pdf b/20191010/hp-2019ws-p1.pdf
deleted file mode 100644
index 93b795a69038d631838e3c726bfe947a32e4be54..0000000000000000000000000000000000000000
Binary files a/20191010/hp-2019ws-p1.pdf and /dev/null differ
diff --git a/20191010/hp-2019ws-p1.tex b/20191010/hp-2019ws-p1.tex
deleted file mode 100644
index fc25c97f6c429d34a6b7a57192936f67845b46b8..0000000000000000000000000000000000000000
--- a/20191010/hp-2019ws-p1.tex
+++ /dev/null
@@ -1,172 +0,0 @@
-% hp-2019ws-p1.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Versuch 1, 17. und 31.10.2019: RSA-Verschlüsselung
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{multicol}
-\usepackage{sfmath}
-
-\sloppy
-\pagestyle{empty}
-\addtolength{\textheight}{1cm}
-\newcommand{\sep}{~$\cdot$~}
-\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
-
-\begin{document}
-
-  \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
-  \par\bigskip\bigskip
-  \begin{center}
-    \Large\textbf{Praktikumsversuch 1: RSA-Verschlüsselung}
-    \par\medskip
-    \normalsize Hardwarenahe Programmierung\sep
-    Wintersemester 2019/20\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Schreiben Sie ein Programm, das
-  die Verschlüsselung nach Rivest, Shamir und Adleman (RSA)
-  sowie die Schwierigkeiten beim Brechen ("`Knacken"') der
-  Verschlüsselung demonstriert.
-
-  \begin{multicols}{2}
-
-    Schreiben Sie ein C-Programm (oder mehrere),
-    das folgendes durchführt:
-
-    \begin{itemize}
-      \item
-        \textbf{Schlüsselerzeugung}
-
-        Bestimmen Sie drei verschiedene Primzahlen $p$, $q$ und $e$, wobei $e$
-        kleiner als $(p-1)\cdot(q-1)$ und teilerfremd zu $(p-1)\cdot(q-1)$ sei.
-        (Dies ist z.\,B.\ der Fall, wenn $e$ größer als $p$ und $q$ ist.)
-
-        Berechnen Sie $N = p \cdot q$
-        sowie eine natürliche Zahl $d$ mit der Eigenschaft:
-        \begin{displaymath}
-          (e \cdot d) \,\%\, \bigl((p-1)\cdot(q-1)\bigr) = 1
-        \end{displaymath}
-        ("`$x \,\%\, y\/$"' wird "`x modulo y"' gesprochen und steht
-        für den Rest, der bei Division von $x$ durch $y$ verbleibt.)
-
-        $N$ und $e$ sind der \newterm{öffentliche Schlüssel}. \\
-        $p$, $q$ und $d$ sind der \newterm{geheime Schlüssel}.
-
-      \item
-        \textbf{Verschlüsselung}
-
-        Wählen Sie eine geheime Botschaft $m$ eine Zahl kleiner als $N$,
-        die Sie verschlüsseln wollen.
-
-        $m$ muß teilerfremd zu $N$ sein.
-        (Dies ist der Fall, wenn $m$ weder durch $p$ noch durch $q$ teilbar ist.)
-
-        Schreiben Sie ein Programm, das aus $m$ die verschlüsselte
-        Nachricht $c$ berechnet:
-        \begin{displaymath}
-          c = m^e ~\%\, N
-        \end{displaymath}
-
-      \strut\vfill\goodbreak
-
-        Hinweis:
-        \begin{displaymath}
-          m^e ~\%\, N
-           = \underbrace{(m \cdot m \cdot \dots \cdot m)}_{\mbox{$e$ Faktoren}} \,\%\, N
-           \hspace*{2cm}
-        \end{displaymath}
-        \vspace*{-\medskipamount}
-        \begin{displaymath}
-           = \underbrace{\Bigl(\dots\bigl((m \cdot m) \,\%\, N \cdot m\bigr) \,\%\, N \cdot \dots \cdot m\Bigr) \,\%\, N}_{\mbox{$e$ Faktoren}}
-        \end{displaymath}
-
-        Dies bedeutet: Multiplizieren Sie die Zahl $m$ $e$-mal mit sich selbst,
-        wobei Sie \emph{nach jeder Multiplikation\/} modulo $N$ rechnen.
-
-%      \vfill\goodbreak
-
-      \item
-        \textbf{Entschlüsselung}
-
-        Rekonstruieren Sie aus der verschlüsselten Botschaft $c$
-        wieder die geheime Botschaft $m$:
-
-        \begin{displaymath}
-          m = c^d ~\%\, N
-        \end{displaymath}
-
-      \item
-        \textbf{Verschlüsselung brechen}
-
-        Rekonstruieren Sie aus der verschlüsselten Botschaft $c$
-        wieder die geheime Botschaft $m$,
-        \emph{ohne\/} den geheimen Schlüssel zu kennen,
-        d.\,h.\ Sie kennen nur $N$ und $e$, nicht jedoch $p$, $q$ und $d$.
-
-        Hinweis:\\
-        Sie können z.\,B.\ versuchen, $N$ in seine Primfaktoren zu zerlegen.
-        Auf diese Weise können Sie zunächst $p$ und $q$ berechnen und danach $d$.
-
-        Vergleichen Sie dann
-        die für das Brechen der Verschlüsselung benötigte Rechenzeit
-        mit der Zeit, die das reguläre Ver- und Entschlüsseln dauert.
-        (Auf diesem Schwierigkeitsunterschied
-        beruht die Sicherheit der RSA-Verschlüsselung.)
-
-%        \vfill
-
-    \end{itemize}
-
-    \bigskip
-
-    \strut\hfill\emph{Viel Erfolg!}
-%    \vspace*{4cm}
-
-  \end{multicols}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 9.\ Oktober 2019
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
-%%    und Beispielprogramme\\
-    herunterladen unter:\\
-    \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-
-  \endgroup
-
-\end{document}
diff --git a/20191010/hp-uebung-20191010.pdf b/20191010/hp-uebung-20191010.pdf
deleted file mode 100644
index b04e864b376e26c2d552147fc56ef757a05457ad..0000000000000000000000000000000000000000
Binary files a/20191010/hp-uebung-20191010.pdf and /dev/null differ
diff --git a/20191010/input-1.c b/20191010/input-1.c
deleted file mode 100644
index 5ca4c8c63cf313591a5a57e18c915329a3c71162..0000000000000000000000000000000000000000
--- a/20191010/input-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%lf", &a);
-  printf ("Ihre Antwort war: %lf\n", a);
-  return 0;
-}
diff --git a/20191010/input-2.c b/20191010/input-2.c
deleted file mode 100644
index 3c8912a1210787f322016cd6b611a3dd1bcaced3..0000000000000000000000000000000000000000
--- a/20191010/input-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%lf", a);
-  printf ("Ihre Antwort war: %lf\n", a);
-  return 0;
-}
diff --git a/20191010/input-3.c b/20191010/input-3.c
deleted file mode 100644
index 72294c6576a5619922f31bbe286cad3bd365329a..0000000000000000000000000000000000000000
--- a/20191010/input-3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &a);
-  a = 2 * a;
-  printf ("Das Doppelte ist: %d\n", a);
-  return 0;
-}
diff --git a/20191010/output-1.c b/20191010/output-1.c
deleted file mode 100644
index ae37ad290203e4e490e3e2fac5a8080f7dfa0364..0000000000000000000000000000000000000000
--- a/20191010/output-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: ");
-  printf (42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191010/output-2.c b/20191010/output-2.c
deleted file mode 100644
index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000
--- a/20191010/output-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: %d\n", 42);
-  return 0;
-}
diff --git a/20191010/output-3.c b/20191010/output-3.c
deleted file mode 100644
index 923847aa9ab7430ce3ddbc9feeaedd6b8df00a11..0000000000000000000000000000000000000000
--- a/20191010/output-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 42;
-  int b;
-  printf ("a = %d\n", a);
-  printf ("b = %d\n", b);
-  return 0;
-}
diff --git a/20191017/aufgabe-4.c b/20191017/aufgabe-4.c
deleted file mode 100644
index b8b3de796fbef94bd4a86f944e1269b97e97982b..0000000000000000000000000000000000000000
--- a/20191017/aufgabe-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int i = 10; i = 0; i - 1)
-    printf ("%d\n", i);
-  return 0;
-}
diff --git a/20191017/comma-1.c b/20191017/comma-1.c
deleted file mode 100644
index 66913f7b328756a5c695d95e2b212b892fa44a52..0000000000000000000000000000000000000000
--- a/20191017/comma-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi;
-  pi = 3,1415;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20191017/comma-2.c b/20191017/comma-2.c
deleted file mode 100644
index 4d4d36fdba847ce8a81f6742a04319546005a2b5..0000000000000000000000000000000000000000
--- a/20191017/comma-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi;
-  pi = (3,1415);
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20191017/comma-3.c b/20191017/comma-3.c
deleted file mode 100644
index 51ff379a73017c25ad6dcaaa18d3f7f1a919b443..0000000000000000000000000000000000000000
--- a/20191017/comma-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int i = 1; i < 10; printf ("%d\n", i), i++);
-  return 0;
-}
diff --git a/20191017/functions-1.c b/20191017/functions-1.c
deleted file mode 100644
index 14cef20b90742d5106caddaf2caa180d8cce9d0a..0000000000000000000000000000000000000000
--- a/20191017/functions-1.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-/*
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-2.c b/20191017/functions-2.c
deleted file mode 100644
index 40a51f27eeae5e86c6b010adf16c6d23c9d81990..0000000000000000000000000000000000000000
--- a/20191017/functions-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-/*
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-3.c b/20191017/functions-3.c
deleted file mode 100644
index a26ba24c3c26f868e19162b9dc0e9f1ae03560a0..0000000000000000000000000000000000000000
--- a/20191017/functions-3.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-/*
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-4.c b/20191017/functions-4.c
deleted file mode 100644
index e960bf15919e7349586ac3a949e2e71eef653f36..0000000000000000000000000000000000000000
--- a/20191017/functions-4.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-/*
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-5.c b/20191017/functions-5.c
deleted file mode 100644
index ed14278f3d966bc9c2b0dfa58d122c693d10bb8e..0000000000000000000000000000000000000000
--- a/20191017/functions-5.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-/*
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-6.c b/20191017/functions-6.c
deleted file mode 100644
index 8e3528726269fb966deb6a9c65b9fc0029f7addf..0000000000000000000000000000000000000000
--- a/20191017/functions-6.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a, b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-/*
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-7.c b/20191017/functions-7.c
deleted file mode 100644
index d2f825707e361ac29410fd00754e13c004ad6a26..0000000000000000000000000000000000000000
--- a/20191017/functions-7.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-/*
-  printf ("main(): a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20191017/functions-8.c b/20191017/functions-8.c
deleted file mode 100644
index 5af42c0b69a60df93d374dfb7078dbe20b29bcec..0000000000000000000000000000000000000000
--- a/20191017/functions-8.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  return 0;
-}
diff --git a/20191017/functions-8.s b/20191017/functions-8.s
deleted file mode 100644
index f83bda8c66d5ee1df24ae07cd1dbcf7f1e931f8c..0000000000000000000000000000000000000000
--- a/20191017/functions-8.s
+++ /dev/null
@@ -1,88 +0,0 @@
-	.file	"functions-8.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"foo(): a = %d, b = %d\n"
-	.text
-	.globl	foo
-	.type	foo, @function
-foo:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	addl	$1, b(%rip)
-	movl	$7, %edx
-	movl	a.2249(%rip), %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	addl	$1, a.2249(%rip)
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	foo, .-foo
-	.section	.rodata.str1.1
-.LC1:
-	.string	"main(): a = %d, b = %d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB12:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	movl	b(%rip), %edx
-	movl	a(%rip), %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	call	foo
-	movl	b(%rip), %edx
-	movl	a(%rip), %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$12, b(%rip)
-	movl	$12, a(%rip)
-	movl	$12, %edx
-	movl	$12, %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	call	foo
-	movl	b(%rip), %edx
-	movl	a(%rip), %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE12:
-	.size	main, .-main
-	.data
-	.align 4
-	.type	a.2249, @object
-	.size	a.2249, 4
-a.2249:
-	.long	5
-	.globl	b
-	.align 4
-	.type	b, @object
-	.size	b, 4
-b:
-	.long	3
-	.globl	a
-	.bss
-	.align 4
-	.type	a, @object
-	.size	a, 4
-a:
-	.zero	4
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191017/gitlab.png b/20191017/gitlab.png
deleted file mode 100644
index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000
Binary files a/20191017/gitlab.png and /dev/null differ
diff --git a/20191017/hello-1.c b/20191017/hello-1.c
deleted file mode 100644
index b939369bd717ef9ddfa9d4aaae94978dfd0abb3c..0000000000000000000000000000000000000000
--- a/20191017/hello-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  "Hello, world!\n";
-  return 0;
-}
diff --git a/20191017/hello-1.s b/20191017/hello-1.s
deleted file mode 100644
index 4df9bd56031433b36cd5529ac285161d26e7fbed..0000000000000000000000000000000000000000
--- a/20191017/hello-1.s
+++ /dev/null
@@ -1,26 +0,0 @@
-	.file	"hello-1.c"
-	.section	.rodata
-.LC0:
-	.string	"Hello, world!"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB0:
-	.cfi_startproc
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register 6
-	leaq	.LC0(%rip), %rdi
-	call	puts@PLT
-	movl	$0, %eax
-	popq	%rbp
-	.cfi_def_cfa 7, 8
-	ret
-	.cfi_endproc
-.LFE0:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191017/hello-2.c b/20191017/hello-2.c
deleted file mode 100644
index 2e558f8f12aef0259fe615cb5dfda8142f387d80..0000000000000000000000000000000000000000
--- a/20191017/hello-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-
-#include <stdio.h>
-
-int main (void)
-{
-  "Hello, world!\n";
-  return 0;
-}
diff --git a/20191017/hello-2.s b/20191017/hello-2.s
deleted file mode 100644
index 91311b6bc5e6f25a96da0577ed77d8e5d0f4bab4..0000000000000000000000000000000000000000
--- a/20191017/hello-2.s
+++ /dev/null
@@ -1,21 +0,0 @@
-	.file	"hello-2.c"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB0:
-	.cfi_startproc
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register 6
-	movl	$0, %eax
-	popq	%rbp
-	.cfi_def_cfa 7, 8
-	ret
-	.cfi_endproc
-.LFE0:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191017/hello-3.c b/20191017/hello-3.c
deleted file mode 100644
index f353794974cfd0f30760867e9b064f2f144da26e..0000000000000000000000000000000000000000
--- a/20191017/hello-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#include <stdio.h>
-
-int main (void)
-{
-  int a = printf ("Hello, world!\n");
-  printf ("%d\n", a);
-  return 0;
-}
diff --git a/20191017/hp-20191017-fig1.pdf b/20191017/hp-20191017-fig1.pdf
deleted file mode 100644
index d4e9c5f6d40d491efa9b49f4e1bcd0c9a0497924..0000000000000000000000000000000000000000
Binary files a/20191017/hp-20191017-fig1.pdf and /dev/null differ
diff --git a/20191017/hp-20191017-fig1.tex b/20191017/hp-20191017-fig1.tex
deleted file mode 100644
index 638a00ac007de5fa087a72f96be8776db32ed75f..0000000000000000000000000000000000000000
--- a/20191017/hp-20191017-fig1.tex
+++ /dev/null
@@ -1,60 +0,0 @@
-\documentclass{article}
-\input tmp.inputs
-\pagestyle{empty}
-\begin{document}
-      \psscalebox{0.8}{%
-        \begin{pspicture}(-5,0)(12,12)
-          \small
-          \psset{unit=0.5cm}
-          \psline[arrows=<->](-1,0)(-1,22)
-          \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}}
-          \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}}
-          \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}}
-          \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}}
-          \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}}
-          \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}}
-          \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}}
-          \rput(-1.3,10){\makebox(0,0)[r]{Assembler}}
-          \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}}
-          \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}}
-          \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}}
-%          \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}}
-          \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}}
-          \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}}
-          \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}}
-          \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}}
-          \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}}
-          \rput(2.1,0.5){\makebox(0,0)[l]{Physik}}
-          \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}}
-          \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}}
-          \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}}
-          \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}}
-          \rput(12.1,21){\makebox(0,0)[l]{Mathematik}}
-          \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000}
-          \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0}
-          \definecolor{RGBblue}{rgb}{0.0,0.0,1.0}
-          \definecolor{RGBred}{rgb}{1.0,0.0,0.0}
-          \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0}
-          \definecolor{RGByellow}{rgb}{1.0,1.0,0.0}
-          \definecolor{RGBorange}{rgb}{1.0,0.7,0.0}
-          \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7}
-          \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)}
-          \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)}
-          \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)}
-          \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)}
-          \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)}
-          \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)}
-          \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)}
-          \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)}
-          \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)}
-          \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)}
-          \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)}
-          \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)}
-          \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)}
-          \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)}
-          \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)}
-          \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)}
-        \end{pspicture}
-      }
-    
-\end{document}
diff --git a/20191017/hp-20191017.pdf b/20191017/hp-20191017.pdf
deleted file mode 100644
index e570627bf939372e9e085e07439c4ea3cb0510e3..0000000000000000000000000000000000000000
Binary files a/20191017/hp-20191017.pdf and /dev/null differ
diff --git a/20191017/hp-20191017.tex b/20191017/hp-20191017.tex
deleted file mode 100644
index 9843c6e01950d67b61d00feb17ebfd5038ce169e..0000000000000000000000000000000000000000
--- a/20191017/hp-20191017.tex
+++ /dev/null
@@ -1,1193 +0,0 @@
-% hp-20191017.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Einführung in C: Seiteneffekte, Funktionen
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{17.\ Oktober 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-      \begin{itemize}
-        \color{medgreen}
-        \item[1.1] Was ist hardwarenahe Programmierung?
-        \item[1.2] Programmierung in C
-        \item[1.3] Zu dieser Lehrveranstaltung
-      \end{itemize}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \color{medgreen}
-        \item[2.1] Hello, world!
-        \item[2.2] Programme compilieren und ausführen
-        \item[2.3] Elementare Aus- und Eingabe
-        \item[2.4] Elementares Rechnen
-        \color{orange}
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \color{red}
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-%        \item[2.12] Strukturen
-        \item[\dots]
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \vspace{-0.6cm}
-  \begin{center}
-    \begin{pdfpic}
-      \psscalebox{0.8}{%
-        \begin{pspicture}(-5,0)(12,12)
-          \small
-          \psset{unit=0.5cm}
-          \psline[arrows=<->](-1,0)(-1,22)
-          \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}}
-          \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}}
-          \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}}
-          \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}}
-          \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}}
-          \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}}
-          \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}}
-          \rput(-1.3,10){\makebox(0,0)[r]{Assembler}}
-          \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}}
-          \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}}
-          \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}}
-%          \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}}
-          \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}}
-          \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}}
-          \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}}
-          \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}}
-          \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}}
-          \rput(2.1,0.5){\makebox(0,0)[l]{Physik}}
-          \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}}
-          \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}}
-          \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}}
-          \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}}
-          \rput(12.1,21){\makebox(0,0)[l]{Mathematik}}
-          \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000}
-          \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0}
-          \definecolor{RGBblue}{rgb}{0.0,0.0,1.0}
-          \definecolor{RGBred}{rgb}{1.0,0.0,0.0}
-          \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0}
-          \definecolor{RGByellow}{rgb}{1.0,1.0,0.0}
-          \definecolor{RGBorange}{rgb}{1.0,0.7,0.0}
-          \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7}
-          \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)}
-          \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)}
-          \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)}
-          \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)}
-          \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)}
-          \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)}
-          \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)}
-          \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)}
-          \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)}
-          \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)}
-          \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)}
-          \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)}
-          \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)}
-          \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)}
-          \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)}
-          \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)}
-        \end{pspicture}
-      }
-    \end{pdfpic}
-  \end{center}
-
-\end{frame}
-
-\section{Einführung}
-\subsection{Was ist hardwarenahe Programmierung?}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  Man kann Computer \hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.55]{hp-20191017-fig1.pdf}}\\
-  vollständig beherrschen.
-
-%  \begin{onlyenv}<1>
-%
-%    \vspace*{2cm}
-%
-%    {\Large\color{structure}\textbf{Rechnertechnik}}
-%
-%    \bigskip
-%
-%    Man kann vollständig verstehen, wie Computer funktionieren.
-%
-%    \vspace*{-3cm}
-%
-%  \end{onlyenv}
-
-%  \pause
-
-  \vspace{0cm plus 1filll}
-
-  \subsection{Programmierung in C}
-  \showsubsection
-
-  \vspace{-\medskipamount}
-
-  \begin{itemize}
-%    \item
-%      kleinster gemeinsamer Nenner für viele Plattformen\\
-%      \pause
-%      \begin{picture}(0,1)
-%        \color{red}
-%        \put(7.2,0.6){\vector(0,1){0.4}}
-%        \put(7.2,0.5){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}}
-%      \end{picture}
-%    \pause
-%    \medskip
-    \item
-      Hardware direkt ansprechen\\
-      und effizient einsetzen
-    \medskip
-    \item
-      \dots\ bis hin zu komplexen\\
-      Software-Projekten
-    \medskip
-    \item
-      Programmierkenntnisse werden nicht vorausgesetzt,\\
-      aber schnelles Tempo
-  \end{itemize}
-
-\end{frame}
-
-\subsectionnonumber{Programmierung in C}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  Etabliertes Profi-Werkzeug
-  \begin{itemize}
-    \item
-      kleinster gemeinsamer Nenner für viele Plattformen
-%      \pause
-      \begin{picture}(0,0)
-        \color{red}
-        \put(-1.0,-0.8){\vector(0,1){0.7}}
-        \put(-1.0,-0.9){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}}
-      \end{picture}
-%    \pause
-    \item
-      leistungsfähig, aber gefährlich
-  \end{itemize}
-
-%  \pause
-  \medskip
-  "`High-Level-Assembler"'
-  \begin{itemize}
-%    \pause
-    \item
-      kein "`Fallschirm"'
-%    \pause
-    \item
-      kompakte Schreibweise
-  \end{itemize}
-
-%  \pause
-  \medskip
-  Unix-Hintergrund
-  \begin{itemize}
-%    \pause
-    \item
-      Baukastenprinzip
-%    \pause
-    \item
-      konsequente Regeln
-%    \pause
-    \item
-      kein "`Fallschirm"'
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Zu dieser Lehrveranstaltung}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \textbf{Lehrmaterialien:}%
-      \hfill\makebox(0,0)[r]{\includegraphics[width=3.5cm]{gitlab.png}}\\
-      \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-    \item
-      \textbf{Klausur:}
-
-      Zeit: 150 Minuten
-
-      Zulässige Hilfsmittel: 
-      \begin{itemize}
-        \item Schreibgerät
-        \item beliebige Unterlagen in Papierform und/oder auf Datenträgern
-        \item elektronische Rechner (Notebook, Taschenrechner o.\,ä.)
-        \item \emph{kein\/} Internet-Zugang
-      \end{itemize}
-    \item
-      \textbf{Übungen}\\
-      finden bereits diese Woche statt.
-    \item
-      \textbf{Praktikumstermine:}
-      \begin{itemize}
-        \item Versuch 1: 17.\,10.\ und 24.\,10.\,2018
-        \item Versuch 2 bis 4: Termine werden noch bekanntgegeben.
-      \end{itemize}
-  \end{itemize}
-
-\end{frame}
-
-\section{Einführung in C}
-\subsection{Hello, world!}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Text ausgeben
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Hello, world!\n");
-      return 0;
-    }
-  \end{lstlisting}
-%  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.0,1.5){\makebox(0,0)[bl]{printf = "`print formatted"'}}
-%    \pause
-    \put(4.0,0.4){\makebox(0,0)[br]{\tikz{\draw[-latex](0.0,0.0)--(-0.3,0.7);}}}
-    \put(4.0,0.3){\makebox(0,0)[t]{\textbackslash n: Zeilenschaltung}}
-  \end{picture}
-
-\end{frame}
-
-\subsection{Programme compilieren und ausführen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{onlyenv}<1-3>
-    \begin{lstlisting}[style=terminal,gobble=6]
-      $ ¡gcc hello-1.c -o hello-1¿
-      $ ¡./hello-1¿
-      Hello, world!
-      $
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<4->
-    \begin{lstlisting}[style=terminal,gobble=6]
-      $ ¡gcc -Wall -O hello-1.c -o hello-1¿
-      $ ¡./hello-1¿
-      Hello, world!
-      $
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<2>
-    \bigskip
-    Hier: Kommandozeilen-Interface (CLI)
-    \begin{itemize}
-      \item
-        Der C-Compiler (hier: \lstinline[style=cmd]{gcc})
-        muß installiert sein und sich im \lstinline[style=terminal]{PATH} befinden.
-      \item
-        Der Quelltext (hier: \file{hello.c})
-        muß sich im aktuellen Verzeichnis befinden.
-      \item
-        aktuelles Verzeichnis herausfinden: \lstinline[style=cmd]{pwd}
-      \item
-        aktuelles Verzeichnis wechseln: \lstinline[style=cmd]{cd foobar}, \lstinline[style=cmd]{cd ..}
-      \item
-        Inhalt des aktuellen Verzeichnisses ausgeben: \lstinline[style=cmd]{ls}, \lstinline[style=cmd]{ls -l}
-      \item
-        Ausführen des Programms (\file{hello-1}) im aktuellen Verzeichnis (\file{.}):\\
-        \lstinline[style=cmd]{./hello-1}
-    \end{itemize}
-
-    Alternative: Integrierte Entwicklungsumgebung (IDE)\\
-    mit graphischer Benutzeroberfläche (GUI)
-    \begin{itemize}
-      \item
-        Das können Sie bereits.
-    \end{itemize}
-  \end{onlyenv}
-  \begin{onlyenv}<3>
-    \bigskip
-    GNU Compiler Collection (GCC) für verschiedene Plattformen: 
-    \begin{itemize}
-      \item
-        GNU/Linux: \file{gcc}
-      \item
-        Apple Mac OS: \file{Xcode}
-      \item
-        Microsoft Windows: \file{Cygwin}\\
-        oder \file{MinGW} mit \file{MSYS}
-      \medskip
-      \item
-        außerdem: Texteditor\\
-        \file{vi}(\file{m}), \file{nano},
-        \file{Emacs}, \file{Notepad++}, \dots\\
-        (Microsoft Notepad ist \emph{nicht} geeignet!)
-    \end{itemize}
-  \end{onlyenv}
-  \begin{onlyenv}<1>
-    \begin{picture}(0,0)
-      \color{red}
-      \put(4.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-2.0,1.0);}}
-      \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{8cm}
-                      \begin{tabular}{ll}
-                        \lstinline[style=cmd]{-o hello-1}
-                          & Name für Ausgabe-Datei ("`output"') \\
-                          & unter Unix: ohne Endung \\
-                          & unter MS-Windows: Endung \lstinline[style=cmd]{.exe}
-                      \end{tabular}
-                    \end{minipage}}}
-    \end{picture}
-  \end{onlyenv}
-  \begin{onlyenv}<4->
-    \begin{picture}(0,0)
-      \color{red}
-      \put(3.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-3.0,1.0);}}
-      \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{6cm}
-                      \begin{tabular}{ll}
-                        \lstinline[style=cmd]{-Wall} & alle Warnungen einschalten\\
-                        \lstinline[style=cmd]{-O} & optimieren\\
-                        \lstinline[style=cmd]{-O3} & maximal optimieren\\
-                        \lstinline[style=cmd]{-Os} & Codegröße optimieren\\[\smallskipamount]
-                        \dots & gcc hat \emph{sehr viele\/} Optionen.
-                      \end{tabular}
-                    \end{minipage}}}
-    \end{picture}
-  \end{onlyenv}
-
-\end{frame}
-
-\subsection{Elementare Aus- und Eingabe}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Wert ausgeben
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Die Antwort lautet: ");
-      printf (42);
-      printf ("\n");
-      return 0;
-    }
-  \end{lstlisting}
-%  \pause
-  \medskip
-  \textarrow\ Absturz
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Wert ausgeben
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Die Antwort lautet: %d\n", 42);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,0.65){\tikz{\draw[-latex](0.0,0.0)--(-0.5,0.5);}}
-    \put(5.9,0.35){\begin{minipage}[t]{6.5cm}
-                     Formatspezifikation "`d"': "`dezimal"'%\pause
-                     \\[\smallskipamount]
-                     Weitere Formatspezifikationen:\\
-                     siehe Dokumentation (z.\,B.\ man 3 printf),\\
-                     Internet-Recherche oder Literatur
-                   \end{minipage}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Wert einlesen
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      double a;
-      printf ("Bitte eine Zahl eingeben: ");
-      scanf ("%lf", &a);
-      printf ("Ihre Antwort war: %lf\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(3.4,1.8){\tikz{\draw[-latex](0.0,0.0)--(-3.5,0);}}
-    \put(7.0,1.9){\begin{minipage}[t]{5cm}
-                     Formatspezifikation "`lf"':\\
-                     "`long floating-point"'\\[\smallskipamount]
-                     Das "`\&"' nicht vergessen!
-                   \end{minipage}}
-  \end{picture}
-
-\end{frame}
-
-\subsection{Elementares Rechnen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Wert an Variable zuweisen
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a;
-      printf ("Bitte eine Zahl eingeben: ");
-      scanf ("%d", &a);
-      a = 2 * a;
-      printf ("Das Doppelte ist: %d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable bei Deklaration initialisieren
-
-  \bigskip
-
-  \begin{lstlisting}
-    int a = 42;
-    a = 137;
-  \end{lstlisting}
-
-  \bigskip
-
-  \textbf{Achtung:} Initialisierung $\ne$ Zuweisung
-
-  \smallskip
-  
-  Die beiden Gleichzeitszeichen haben\\
-  \emph{subtil unterschiedliche\/} Bedeutungen!
-
-\end{frame}
-
-\subsection{Verzweigungen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    \lstinline{if}-Verzweigung
-
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      if (b != 0)
-        printf ("%d\n", a / b);
-    \end{lstlisting}
-  \end{minipage}\pause
-  \begin{minipage}[t]{6cm}
-    \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount]
-    0 steht für \emph{falsch (false)},\\
-    $\ne 0$ steht für \emph{wahr (true)}.
-
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      if (b)
-        printf ("%d\n", a / b);
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Schleifen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    \lstinline{while}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      a = 1;
-      while (a <= 10)
-        {
-          printf ("%d\n", a);
-          a = a + 1;
-        }
-    \end{lstlisting}
-  \end{minipage}\pause
-  \begin{minipage}[t]{6cm}
-    \lstinline{for}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      for (a = 1; a <= 10; a = a + 1)
-        printf ("%d\n", a);
-    \end{lstlisting}
-    \vspace{1.5cm}
-    \pause
-    \lstinline{do}-\lstinline{while}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      a = 1;
-      do
-        {
-          printf ("%d\n", a);
-          a = a + 1;
-        }
-      while (a <= 10);
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Strukturierte Programmierung}
-
-\begin{frame}[fragile]
-
-  \visible<4->{\showsubsection}
-
-  \begin{minipage}[t]{6cm}
-    \begin{onlyenv}<2->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        while (1)
-          {
-            if (i >= 10)
-              break;
-            printf ("%d\n", i++);
-          }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \strut
-    \bigskip
-    \begin{onlyenv}<3->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        loop:
-        if (i >= 10)
-          goto endloop;
-        printf ("%d\n", i++);
-        goto loop;
-        endloop:¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}
-  \begin{minipage}[t]{6cm}
-    \vspace{-\bigskipamount}
-    \begin{lstlisting}
-      ¡int i;
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        {
-          printf ("%d\n", i);
-          i++;
-        }¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; i++)
-        printf ("%d\n", i);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        printf ("%d\n", i++);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; printf ("%d\n", i++));¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{onlyenv}<5->
-    \begin{picture}(0,0)
-      \put(-1.9,-3.0){\mbox{\color{medgreen}gut}}
-      \put(-1.9,-5.2){\begin{minipage}{5cm}
-                        \color{orange}
-                        nur, wenn\\
-                        Sie wissen,\\
-                        was Sie tun
-                      \end{minipage}}
-                    
-      \put(-10,-0.5){\mbox{\color{red}fragwürdig}}
-      \put(-9.3,-4.2){\begin{minipage}[t]{5cm}
-                        \color{red}
-                        sehr fragwürdig\\[\smallskipamount]
-                        \footnotesize(siehe z.\,B.:\\
-                        http://xkcd.com/292/)
-                      \end{minipage}}
-    \end{picture}
-  \end{onlyenv}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \color{medgreen}
-        \item[2.1] Hello, world!
-        \item[2.2] Programme compilieren und ausführen
-        \item[2.3] Elementare Aus- und Eingabe
-        \item[2.4] Elementares Rechnen
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \color{red}
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-        \item[\dots]
-%        \item[2.12] Strukturen
-%        \item[\dots]
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Seiteneffekte}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Hello, world!\n");
-      "Hello, world!\n";
-      return 0;
-    }
-  \end{lstlisting}
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}}
-    \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}}
-    \pause
-    \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a = printf ("Hello, world!\n");
-      printf ("%d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-  \pause
-  \bigskip
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿
-    $ ¡./side-effects-1¿
-    Hello, world!
-    14
-    $
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a = printf ("Hello, world!\n");
-      printf ("%d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{itemize}
-    \item
-      \lstinline{printf()} ist eine Funktion.
-    \pause
-    \item
-      "`Haupteffekt"': Wert zurückliefern\\
-      (hier: Anzahl der ausgegebenen Zeichen)
-    \pause
-    \item
-      \newterm{Seiteneffekt\/}: Ausgabe
-  \end{itemize}
-
-\end{frame}
-
-\addtocounter{subsection}{-1}
-\subsection{Seiteneffekte \protect\color{gray}bei Operatoren}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    Unäre Operatoren:
-    \begin{itemize}
-      \item
-        Negation: \lstinline{-foo}
-      \item
-        {\only<2->{\color{red}}Funktionsaufruf}: \lstinline{foo ()}
-      \item
-        {\only<2->{\color{red}}Post-Inkrement}: \lstinline{foo++}
-      \item
-        {\only<2->{\color{red}}Post-Dekrement}: \lstinline{foo--}
-      \item
-        {\only<2->{\color{red}}Prä-Inkrement}: \lstinline{++foo}
-      \item
-        {\only<2->{\color{red}}Prä-Dekrement}: \lstinline{--foo}
-    \end{itemize}
-    \medskip
-    Binäre Operatoren:
-    \begin{itemize}
-      \item
-        Rechnen: \lstinline{+ - * / %}
-      \item
-        Vergleich: \lstinline{== != < > <= >=}
-      \item
-        {\only<2->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=}
-      \item
-        Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b}
-    \end{itemize}
-    \pause
-    \medskip
-    {\color{red}rot = mit Seiteneffekt}
-  \end{minipage}
-  \pause
-  \begin{minipage}[t]{6cm}
-    \vspace{-\bigskipamount}
-    \begin{lstlisting}
-      ¡int i;¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        {
-          printf ("%d\n", i);
-          i++;
-        }¿
-    \end{lstlisting}
-    \bigskip
-    \pause
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; i++)
-        printf ("%d\n", i);¿
-    \end{lstlisting}
-    \bigskip
-    \pause
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        printf ("%d\n", i++);¿
-    \end{lstlisting}
-    \bigskip
-    \pause
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; printf ("%d\n", i++));¿
-    \end{lstlisting}
-  \end{minipage}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\addtocounter{subsection}{-2}
-\subsection{Strukturierte Programmierung}
-
-\begin{frame}[fragile]
-
-  \visible<4->{\showsubsection}
-
-  \begin{minipage}[t]{6cm}
-    \begin{onlyenv}<2->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        while (1)
-          {
-            if (i >= 10)
-              break;
-            printf ("%d\n", i++);
-          }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \strut
-    \bigskip
-    \begin{onlyenv}<3->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        loop:
-        if (i >= 10)
-          goto endloop;
-        printf ("%d\n", i++);
-        goto loop;
-        endloop:¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}
-  \begin{minipage}[t]{6cm}
-    \vspace{-\bigskipamount}
-    \begin{lstlisting}
-      ¡int i;
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        {
-          printf ("%d\n", i);
-          i++;
-        }¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; i++)
-        printf ("%d\n", i);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        printf ("%d\n", i++);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; printf ("%d\n", i++));¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{onlyenv}<5->
-    \begin{picture}(0,0)
-      \put(-1.9,-3.0){\mbox{\color{medgreen}gut}}
-      \put(-1.9,-5.2){\begin{minipage}{5cm}
-                        \color{orange}
-                        nur, wenn\\
-                        Sie wissen,\\
-                        was Sie tun
-                      \end{minipage}}
-                    
-      \put(-10,-0.5){\mbox{\color{red}fragwürdig}}
-      \put(-9.3,-4.2){\begin{minipage}[t]{5cm}
-                        \color{red}
-                        sehr fragwürdig\\[\smallskipamount]
-                        \footnotesize(siehe z.\,B.:\\
-                        http://xkcd.com/292/)
-                      \end{minipage}}
-    \end{picture}
-  \end{onlyenv}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\addtocounter{subsection}{1}
-\subsection{Funktionen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6.5cm}
-    \vspace{-\medskipamount}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      int answer (void)
-      {
-        return 42;
-      }
-
-      void foo (void)
-      {
-        printf ("%d\n", answer ());
-      }
-
-      int main (void)
-      {
-        foo ();
-        return 0;
-      }¿
-    \end{lstlisting}
-    \vspace*{-1cm}
-  \end{minipage}%
-  \begin{minipage}[t]{6cm}
-    \begin{itemize}
-      \pause
-      \item
-        Funktionsdeklaration:\\[\smallskipamount]
-        Typ Name ( Parameterliste )\\
-        \{\\
-        \quad Anweisungen\\
-        \}
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6.5cm}
-    \vspace{-\medskipamount}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      void add_verbose (int a, int b)
-      {
-        printf ("%d + %d = %d\n", a, b, a + b);
-      }
-
-      int main (void)
-      {
-        add_verbose (3, 7);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{6cm}
-    \begin{itemize}
-      \item
-        Funktionsdeklaration:\\[\smallskipamount]
-        Typ Name ( Parameterliste )\\
-        \{\\
-        \quad Anweisungen\\
-        \}
-      \pause
-      \bigskip
-      \item
-        Der Datentyp \lstinline{void}\\
-        steht für "`nichts"'\\
-        und \alt<3->{muß}{kann} ignoriert werden.
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      int a, b = 3;
-
-      void foo (void)
-      {
-        b++;
-        static int a = 5;
-        int b = 7;
-        printf ("foo(): "
-               "a = %d, b = %d\n",
-               a, b);
-        a++;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}{6cm}
-    \vspace{-1cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        foo ();
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        a = b = 12;
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        foo ();
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \item[2.1] Hello, world!
-        \item[2.2] Programme compilieren und ausführen
-        \item[2.3] Elementare Aus- und Eingabe
-        \item[2.4] Elementares Rechnen
-        \color{medgreen}
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \color{red}
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[\dots]
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\end{document}
diff --git a/20191017/hp-musterloesung-20191017.pdf b/20191017/hp-musterloesung-20191017.pdf
deleted file mode 100644
index 38060c39b7bf1fd78f53a2173883e32c7aeb5b09..0000000000000000000000000000000000000000
Binary files a/20191017/hp-musterloesung-20191017.pdf and /dev/null differ
diff --git a/20191017/hp-musterloesung-20191017.tex b/20191017/hp-musterloesung-20191017.tex
deleted file mode 100644
index dceca2f3abeb745cd10938ca5d27d6e43c028dcd..0000000000000000000000000000000000000000
--- a/20191017/hp-musterloesung-20191017.tex
+++ /dev/null
@@ -1,326 +0,0 @@
-% hp-musterloesung-20191017.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 17.\ Oktober 2019}
-
-  \exercise{Schaltjahr ermitteln}
-
-  Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt
-  und ausgibt, ob es sich um ein Schaltjahr handelt.
-  \begin{itemize}
-    \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr.
-    \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr.
-    \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\
-          ist das Jahr doch wieder ein Schaltjahr.
-  \end{itemize}
-
-  \solution
-
-  Am einfachsten ist es, die Aufgabenstellung in geschachtelte
-  \lstinline{if}-Verzweigungen zu übersetzen.
-  Im folgenden finden Sie eine Funktion \lstinline{is_leap_year()},
-  der man das Jahr übergibt und die für Schaltjahre \lstinline{1}
-  zurückgibt und für Nicht-Schaltjahre \lstinline{0}.
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int is_leap_year (int year)
-    {
-      int leap_year = 0;
-      if (year % 4 == 0)
-        {
-          leap_year = 1;
-          if (year % 100 == 0)
-            {
-              leap_year = 0;
-              if (year % 400 == 0)
-                leap_year = 1;
-            }
-        }
-      return leap_year;
-    }
-  \end{lstlisting}
-  (In C steht \lstinline{0} für den Wahrheitswert "`falsch"'
-  und jeder Wert ungleich \lstinline{0} für den Wahrheitswert "`wahr'";
-  die Zeile \lstinline{leap_year = 0} steht daher wörtlich und
-  selbsterklärend für "`ist kein Schaltjahr"'.)
-
-  Unter Verwendung von \lstinline{else} läßt sich dies verkürzen zu:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int is_leap_year (int year)
-    {
-      if (year % 4 == 0)
-        {
-          if (year % 100 == 0)
-            {
-              if (year % 400 == 0)
-                return 1;
-              else
-                return 0;
-            }
-          else
-            return 1;
-        }
-      else
-        return 0;
-    }
-  \end{lstlisting}
-
-  Eine andere Möglichkeit ist es, die Schaltjahr-Bedingung in eine
-  Kette von "`und"'- und "`oder"'-Verknüpfungen
-  (C-Operatoren \lstinline{&&} und \lstinline{||}) zu übersetzen:
-  \begin{lstlisting}
-    int is_leap_year (int year)
-    {
-      if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
-        return 1;
-      else
-        return 0;
-    }
-  \end{lstlisting}
-  Dies ist zwar kürzer, aber nicht unbedingt übersichtlicher.
-  Der erzeugte Code ist übrigens \emph{nicht\/} kürzer und/oder
-  effizienter als bei der Verwendung mehrerer
-  \lstinline{if}-Verzweigungen.
-  Wir empfehlen, daß Sie immer so programmieren,
-  daß Sie selbst den maximalen Überblick über Ihr Programm behalten.
-
-  \goodbreak
-
-  Ein Hauptprogramm, das die o.\,a.\ Funktion aufruft,
-  könnte dann wie folgt aussehen:
-  \begin{lstlisting}
-    int main (void)
-    {
-      int year;
-      printf ("Bitte geben Sie eine Jahreszahl ein: ");
-      scanf ("%d", &year);
-      if (is_leap_year (year))
-        printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-      else
-        printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-      return 0;
-    }
-  \end{lstlisting}
-  In den Dateien \gitfile{hp}{20191017}{loesung-1-1.c} bis \gitfile{hp}{20191017}{loesung-1-3.c}
-  finden Sie lauffähige Programme, die die o.\,a.\ Funktionen aufrufen.
-  Beachten Sie, daß die Funktion \emph{vor\/} dem Hauptprogramm
-  deklariert werden muß, damit das Hauptprogramm sie kennt.
-  (Es gibt Tricks, mit denen es auch anders geht,
-  aber was hätten wir in diesem Zusammenhang davon?)
-
-  In \gitfile{hp}{20191017}{loesung-1-4.c} und \gitfile{hp}{20191017}{loesung-1-5.c}
-  findet die Schaltjahr-Prüfung direkt im Hauptprogramm statt.
-  Dies ist ebenfalls eine richtige Lösung der Aufgabe,
-  schränkt aber die Wiederverwertbarkeit des Codes ein.
-
-  Die Datei \gitfile{hp}{20191017}{loesung-1-4.c} enthält darüberhinaus Codeverdopplungen,
-  nämlich mehrere identische \lstinline{printf()}-Auf"-rufe
-  an unterschiedlichen Stellen.
-  Dies ist schlechter Programmierstil ("`Cut-and-paste-Programmierung"').
-
-  Die besten Lösungen sind \gitfile{hp}{20191017}{loesung-1-2.c}
-  und \gitfile{hp}{20191017}{loesung-1-3.c}.
-
-  \goodbreak
-
-  Zum Testen:\vspace*{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item 1900 ist kein Schaltjahr.
-    \item 1902 ist kein Schaltjahr.
-    \item 1904 ist ein Schaltjahr.
-    \item 1996 ist ein Schaltjahr.
-    \item 1998 ist kein Schaltjahr.
-    \item 2000 ist ein Schaltjahr.
-    \item 2002 ist kein Schaltjahr.
-    \item 2004 ist ein Schaltjahr.
-    \item 2016 ist ein Schaltjahr.
-    \item 2017 ist kein Schaltjahr.
-    \item 2018 ist kein Schaltjahr.
-    \item 2019 ist kein Schaltjahr.
-  \end{itemize}
-
-  \goodbreak
-
-  Hier noch ein Hinweis für Unix-Shell-Experten:
-  \begin{lstlisting}[style=cmd]
-    for y in 1 2 3 4 5; do
-      clear
-      for x in 1900 1902 1904 1996 1998 2000 2002 2004 2016 2017 2018 2019; do
-        echo $x | ./loesung-1-$y
-      done
-      sleep 2s
-    done
-  \end{lstlisting}
-
-  \exercise{Multiplikationstabelle}
-
-  Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\
-  Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen:
-  \begin{lstlisting}[style=terminal]
-     1 * 7 =  7
-     2 * 7 = 14
-     ...
-    10 * 7 = 70
-  \end{lstlisting}
-  Hinweis: Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\
-  (siehe dazu die Dokumentation zu \lstinline{printf()},
-  z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,)
-
-  \solution
-
-  Drei verschiedene richtige Lösungen finden Sie in den Dateien
-  \gitfile{hp}{20191017}{loesung-2-1.c}, \gitfile{hp}{20191017}{loesung-2-2.c} und \gitfile{hp}{20191017}{loesung-2-3.c}.
-  (Zum Compilieren von \gitfile{hp}{20191017}{loesung-2-2.c} und \gitfile{hp}{20191017}{loesung-2-3.c}
-  ist mindestens der C99-Standard erforderlich; bitte nötigenfalls
-  in \file{gcc} die Option \lstinline[style=cmd]{-std=c99} mit angeben.)
-
-  Die Lösung in \gitfile{hp}{20191017}{loesung-2-3.c} ist zwar richtig,
-  aber unnötig kompliziert und daher nicht empfohlen.
-
-  Eine \textbf{falsche} Lösung finden Sie in der Datei \gitfile{hp}{20191017}{loesung-2-f4.c}:
-  In der Ausgabe dieses Programms stehen die Faktoren und Ergebnisse
-  nicht rechtsbündig untereinander.
-
-  \exercise{Fibonacci-Zahlen}
-
-  Die Folge der Fibonacci-Zahlen ist definiert durch:
-  \begin{quote}
-    1.\ Zahl: 0\\
-    2.\ Zahl: 1\\
-    nächste Zahl = Summe der beiden vorherigen
-  \end{quote}
-  Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt.
-
-  Falls Ihnen dabei irgendwelche Besonderheiten auffallen
-  und/oder Sie irgendwelche besondere Maßnahmen treffen,
-  dokumentieren Sie diese.
-
-  (Wem dies zu einfach ist, kann auch gerne
-  die ersten 100 Fibonacci-Zahlen ausgeben.)
-
-  \solution
-
-  Zwei verschiedene richtige Lösungen finden Sie in den Dateien
-  \gitfile{hp}{20191017}{loesung-3-1.c} und \gitfile{hp}{20191017}{loesung-3-2.c}.
-
-  Die Lösung in \gitfile{hp}{20191017}{loesung-3-2.c}
-  speichert alle berechneten Zahlen in einem Array,
-  die in \gitfile{hp}{20191017}{loesung-3-1.c} hingegen
-  speichert immer nur maximal drei Zahlen gleichzeitig.
-  Sofern nicht alle berechneten Zahlen später noch benötigt werden,
-  ist daher \gitfile{hp}{20191017}{loesung-3-1.c} zu bevorzugen.
-
-  Wichtig in \gitfile{hp}{20191017}{loesung-3-1.c} ist, daß \lstinline{f0 + f1} berechnet wird,
-  \emph{bevor\/} \lstinline{f0} oder \lstinline{f1} ein neuer Wert zugewiesen wird.
-  Dies ist nur möglich, weil das Programm
-  eine zusätzliche Variable (hier: \lstinline{f2}) verwendet.
-
-  \emph{(Fortsetzung folgt.)}
-
-  \exercise{Fehlerhaftes Programm}
-
-  \begin{minipage}[t]{0.65\textwidth}
-    Wir betrachten das nebenstehende C-Programm
-    (Datei: \gitfile{hp}{20191017}{aufgabe-4.c}).
-    \begin{itemize}
-      \item[(a)]
-        Was bewirkt dieses Programm? Begründen Sie Ihre Antwort.
-
-        Schreiben Sie Ihre Begründung so auf,
-        daß man sie auch dann versteht,
-        wenn man gerade nicht die Möglichkeit hat,
-        bei Ihnen persönlich nachzufragen
-        (z.\,B.\ weil man gerade eine Klausur korrigiert).
-
-        Die Schwierigkeit dieser Aufgabe besteht
-        nicht allein darin, die Problematik zu verstehen,
-        sondern auch darin, dieses Verständnis für andere aufzuschreiben.
-      \item[(b)]
-        Ändern Sie das Programm so um,
-        daß es einen "`Countdown"' von 10 bis 0 ausgibt.
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        for (int i = 10; i = 0; i - 1)
-          printf ("%d\n", i);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Was bewirkt dieses Programm und warum?}
-
-      Dieses Programm bewirkt nichts.
-      Die \lstinline{for}-Schleife wird nicht ausgeführt.
-
-      Begründung: Die \lstinline{for}-Bedingung ist eine Zuweisung
-      des Werts \lstinline{0} an die Variable \lstinline{i}.
-      Neben dem Seiteneffekt der Zuweisung liefert der Ausdruck
-      einen Wert zurück, nämlich den zugewiesenen Wert
-      \lstinline{0}. Dieser wird von \lstinline{for} als eine
-      Bedingung mit dem konstanten Wert "`falsch"' interpretiert.
-
-      (Hinweis: Ohne diese Begründung ist die Aufgabe nur zu einem
-      kleinen Teil gelöst.)
-
-      Darüberhinaus ist die Zähl-Anwendung unwirksam: Sie berechnet
-      den Wert \lstinline{i - 1} und vergißt ihn wieder, ohne ihn
-      einer Variablen (z.\,B.\ \lstinline{i}) zuzuweisen.
-
-    \item[(b)]
-      \textbf{Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.}
-
-      Datei \gitfile{hp}{20191017}{loesung-4.c}:
-      \begin{lstlisting}[gobble=8]
-        #include <stdio.h>
-
-        int main (void)
-        {
-          for (int i = 10; i >= 0; i--)
-            printf ("%d\n", i);
-          return 0;
-        }
-      \end{lstlisting}
-  \end{itemize}
-
-\end{document}
diff --git a/20191017/hp-uebung-20191017.pdf b/20191017/hp-uebung-20191017.pdf
deleted file mode 100644
index 26d5339547f1095b2bf8fc337d16fb2c0cbf2add..0000000000000000000000000000000000000000
Binary files a/20191017/hp-uebung-20191017.pdf and /dev/null differ
diff --git a/20191017/hp-uebung-20191017.tex b/20191017/hp-uebung-20191017.tex
deleted file mode 100644
index b12e97398c2c2375420c5512f318e903596b7071..0000000000000000000000000000000000000000
--- a/20191017/hp-uebung-20191017.tex
+++ /dev/null
@@ -1,114 +0,0 @@
-% hp-uebung-20191017.pdf - Exercises on Low-Level Programming / Applied Computer Sciences
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 17.\ Oktober 2019}
-
-  \exercise{Schaltjahr ermitteln}
-
-  Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt
-  und ausgibt, ob es sich um ein Schaltjahr handelt.
-  \begin{itemize}
-    \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr.
-    \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr.
-    \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\
-          ist das Jahr doch wieder ein Schaltjahr.
-  \end{itemize}
-
-  \exercise{Multiplikationstabelle}
-
-  Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\
-  Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen:
-  \begin{lstlisting}[style=terminal]
-     1 * 7 =  7
-     2 * 7 = 14
-     ...
-    10 * 7 = 70
-  \end{lstlisting}
-  \textbf{Hinweis:} Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\
-  (siehe dazu die Dokumentation zu \lstinline{printf()},
-  z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,)
-
-  \exercise{Fibonacci-Zahlen}
-
-  Die Folge der Fibonacci-Zahlen ist definiert durch:
-  \begin{quote}
-    1.\ Zahl: 0\\
-    2.\ Zahl: 1\\
-    nächste Zahl = Summe der beiden vorherigen
-  \end{quote}
-  Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt.
-
-  Falls Ihnen dabei irgendwelche Besonderheiten auffallen
-  und/oder Sie irgendwelche besondere Maßnahmen treffen,
-  dokumentieren Sie diese.
-
-  (Wem dies zu einfach ist, kann auch gerne
-  die ersten 100 Fibonacci-Zahlen ausgeben.)
-
-  \exercise{Fehlerhaftes Programm}
-
-  \begin{minipage}[t]{0.65\textwidth}
-    Wir betrachten das nebenstehende C-Programm
-    (Datei: \gitfile{hp}{20191017}{aufgabe-4.c}).
-    \begin{itemize}
-      \item[(a)]
-        Was bewirkt dieses Programm? Begründen Sie Ihre Antwort.
-
-        Schreiben Sie Ihre Begründung so auf,
-        daß man sie auch dann versteht,
-        wenn man gerade nicht die Möglichkeit hat,
-        bei Ihnen persönlich nachzufragen
-        (z.\,B.\ weil man gerade eine Klausur korrigiert).
-
-        Die Schwierigkeit dieser Aufgabe besteht
-        nicht allein darin, die Problematik zu verstehen,
-        sondern auch darin, dieses Verständnis für andere aufzuschreiben.
-      \item[(b)]
-        Ändern Sie das Programm so um,
-        daß es einen "`Countdown"' von 10 bis 0 ausgibt.
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        for (int i = 10; i = 0; i - 1)
-          printf ("%d\n", i);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-\end{document}
diff --git a/20191017/if-1.c b/20191017/if-1.c
deleted file mode 100644
index d66ba2f3922c028788fd22c3545f45b49373fb78..0000000000000000000000000000000000000000
--- a/20191017/if-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 12;
-  if (b)
-    printf ("100 / b = %d\n", 100 / b);
-  else
-    printf ("Bitte nicht durch 0 dividieren!\n");
-  return 0;
-}
diff --git a/20191017/if-10.c b/20191017/if-10.c
deleted file mode 100644
index 117f381f99eb713c5e0c25901b4e577320124eaa..0000000000000000000000000000000000000000
--- a/20191017/if-10.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 7;
-  int b;
-  if ((b += a) == 0)
-    printf ("Bitte nicht durch 0 teilen!\n");
-  else
-    printf ("100 / a = %d\n", 100 / a);
-  return 0;
-}
diff --git a/20191017/if-11.c b/20191017/if-11.c
deleted file mode 100644
index 60c9564a9c82a28f61cbf26014696b582d2093b6..0000000000000000000000000000000000000000
--- a/20191017/if-11.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 7;
-  int b = 0;
-  if ((b += a) == 0)
-    printf ("Bitte nicht durch 0 teilen!\n");
-  else
-    printf ("100 / a = %d\n", 100 / a);
-  return 0;
-}
diff --git a/20191017/if-2.c b/20191017/if-2.c
deleted file mode 100644
index 91044d08f6e5f35180e44c132e7ff86958f9d3e9..0000000000000000000000000000000000000000
--- a/20191017/if-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 12;
-  if (b)
-    printf ("100 / b = %d\n", 100 / b);
-    printf ("100 % b = %d\n", 100 % b);
-  else
-    printf ("Bitte nicht durch 0 dividieren!\n");
-  return 0;
-}
diff --git a/20191017/if-3.c b/20191017/if-3.c
deleted file mode 100644
index 81b51401bdf86223877fd8de20ab1bb5a16ff7cf..0000000000000000000000000000000000000000
--- a/20191017/if-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 12;
-  if (b)
-    printf ("100 / b = %d\n", 100 / b);
-    printf ("100 % b = %d\n", 100 % b);
-  return 0;
-}
diff --git a/20191017/if-4.c b/20191017/if-4.c
deleted file mode 100644
index 3e07ac43391a233713be13ef4e3ad46b4e2c19f1..0000000000000000000000000000000000000000
--- a/20191017/if-4.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 0;
-  if (b)
-    printf ("100 / b = %d\n", 100 / b);
-    printf ("100 % b = %d\n", 100 % b);
-  return 0;
-}
diff --git a/20191017/if-5.c b/20191017/if-5.c
deleted file mode 100644
index 315ba8609e75d9450b61087788f3a46076d15b95..0000000000000000000000000000000000000000
--- a/20191017/if-5.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 0;
-  if (b)
-    {
-      printf ("100 / b = %d\n", 100 / b);
-      printf ("100 %% b = %d\n", 100 % b);
-    }
-  return 0;
-}
diff --git a/20191017/if-6.c b/20191017/if-6.c
deleted file mode 100644
index 4d956db0960af55d40857bb2495233d197ef1d15..0000000000000000000000000000000000000000
--- a/20191017/if-6.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 0;
-  if (b)
-    {
-      printf ("100 / b = %d\n", 100 / b);
-      printf ("100 %% b = %d\n", 100 % b);
-    }
-  else
-    printf ("Bitte nicht durch 0 dividieren!\n");
-  return 0;
-}
diff --git a/20191017/if-7.c b/20191017/if-7.c
deleted file mode 100644
index 51d2a558c55a0c2e121f53f021212a0a10cbf1e3..0000000000000000000000000000000000000000
--- a/20191017/if-7.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b = 7;
-  if (b)
-    {
-      printf ("100 / b = %d\n", 100 / b);
-      printf ("100 %% b = %d\n", 100 % b);
-    }
-  else
-    printf ("Bitte nicht durch 0 dividieren!\n");
-  return 0;
-}
diff --git a/20191017/if-8.c b/20191017/if-8.c
deleted file mode 100644
index 1cc4ddec7b5e180e01fe899ea385852ca6a1201e..0000000000000000000000000000000000000000
--- a/20191017/if-8.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 7;
-  if (a = 0)
-    printf ("Bitte nicht durch 0 teilen!\n");
-  else
-    printf ("100 / a = %d\n", 100 / a);
-  return 0;
-}
diff --git a/20191017/if-9.c b/20191017/if-9.c
deleted file mode 100644
index 5a26c3be15f0870e8f520545f0bcc9c3114c63c3..0000000000000000000000000000000000000000
--- a/20191017/if-9.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 7;
-  int b;
-  if ((b = a) == 0)
-    printf ("Bitte nicht durch 0 teilen!\n");
-  else
-    printf ("100 / a = %d\n", 100 / a);
-  return 0;
-}
diff --git a/20191017/loesung-1-1.c b/20191017/loesung-1-1.c
deleted file mode 100644
index ea41b8ea35bf871389c8be15779a58c293c81049..0000000000000000000000000000000000000000
--- a/20191017/loesung-1-1.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-
-int is_leap_year (int year)
-{
-  int leap_year = 0;
-  if (year % 4 == 0)
-    {
-      leap_year = 1;
-      if (year % 100 == 0)
-        {
-          leap_year = 0;
-          if (year % 400 == 0)
-            leap_year = 1;
-        }
-    }
-  return leap_year;
-}
-
-int main (void)
-{
-  int year;
-  printf ("Bitte geben Sie eine Jahreszahl ein: ");
-  scanf ("%d", &year);
-  if (is_leap_year (year))
-    printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-  else
-    printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-  return 0;
-}
diff --git a/20191017/loesung-1-2.c b/20191017/loesung-1-2.c
deleted file mode 100644
index d9e4df8a36238875e0b46398b21f93e7f4f98792..0000000000000000000000000000000000000000
--- a/20191017/loesung-1-2.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-int is_leap_year (int year)
-{
-  if (year % 4 == 0)
-    {
-      if (year % 100 == 0)
-        {
-          if (year % 400 == 0)
-            return 1;
-          else
-            return 0;
-        }
-      else
-        return 1;
-    }
-  else
-    return 0;
-}
-
-int main (void)
-{
-  int year;
-  printf ("Bitte geben Sie eine Jahreszahl ein: ");
-  scanf ("%d", &year);
-  if (is_leap_year (year))
-    printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-  else
-    printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-  return 0;
-}
diff --git a/20191017/loesung-1-3.c b/20191017/loesung-1-3.c
deleted file mode 100644
index 97051b3bb5e6620ff771d6b3f5949687130abea8..0000000000000000000000000000000000000000
--- a/20191017/loesung-1-3.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-int is_leap_year (int year)
-{
-  if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
-    return 1;
-  else
-    return 0;
-}
-
-int main (void)
-{
-  int year;
-  printf ("Bitte geben Sie eine Jahreszahl ein: ");
-  scanf ("%d", &year);
-  if (is_leap_year (year))
-    printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-  else
-    printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-  return 0;
-}
diff --git a/20191017/loesung-1-4.c b/20191017/loesung-1-4.c
deleted file mode 100644
index 3a0d218e6c03f326ad73bad55ad3e29ea882eb2d..0000000000000000000000000000000000000000
--- a/20191017/loesung-1-4.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int year;
-  printf ("Bitte geben Sie eine Jahreszahl ein: ");
-  scanf ("%d", &year);
-  if (year % 4 == 0)
-    {
-      if (year % 100 == 0)
-        {
-          if (year % 400 == 0)
-            printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-          else
-            printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-        }
-      else
-        printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-    }
-  else
-    printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-  return 0;
-}
diff --git a/20191017/loesung-1-5.c b/20191017/loesung-1-5.c
deleted file mode 100644
index 999d9f2030e29f1c961b12d647d2e82592b637bf..0000000000000000000000000000000000000000
--- a/20191017/loesung-1-5.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int year;
-  printf ("Bitte geben Sie eine Jahreszahl ein: ");
-  scanf ("%d", &year);
-  if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
-    printf ("Das Jahr %d ist ein Schaltjahr.\n", year);
-  else
-    printf ("Das Jahr %d ist kein Schaltjahr.\n", year);
-  return 0;
-}
diff --git a/20191017/loesung-2-1.c b/20191017/loesung-2-1.c
deleted file mode 100644
index 5ec9dd3caf6639d22bf770ef4b6bb779a3d7c714..0000000000000000000000000000000000000000
--- a/20191017/loesung-2-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 1;
-  int b = 7;
-  while (a <= 10)
-    {
-      printf ("%2d * %d = %2d\n", a, b, a * b);
-      a++;
-    }
-  return 0;
-}
diff --git a/20191017/loesung-2-2.c b/20191017/loesung-2-2.c
deleted file mode 100644
index 8f9319ee596a52f38531a2cefb376b54e7ec3ec0..0000000000000000000000000000000000000000
--- a/20191017/loesung-2-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int x = 7;
-  for (int i = 1; i <= 10; i++)
-    printf ("%2d *%2d =%3d\n", i, x, i * x);
-  return 0;
-}
diff --git a/20191017/loesung-2-3.c b/20191017/loesung-2-3.c
deleted file mode 100644
index 71fca2538b991397ac5f046a33ff0f9130b2980f..0000000000000000000000000000000000000000
--- a/20191017/loesung-2-3.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int x = 7;
-  for (int i = 1; i <= 10; i++)
-    {
-      if (i >= 10)
-        printf ("%d", i);
-      else
-        printf (" %d", i);
-      printf (" * %d = ", x);
-      int y = i * x;
-      if (y >= 10)
-        printf ("%d", y);
-      else
-        printf (" %d", y);
-      printf ("\n");
-    }
-  return 0;
-}
diff --git a/20191017/loesung-2-f4.c b/20191017/loesung-2-f4.c
deleted file mode 100644
index 8520d438f654856a74c22ffd01b9c5815741efbc..0000000000000000000000000000000000000000
--- a/20191017/loesung-2-f4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int x = 7;
-  for (int i = 1; i <= 10; i++)
-    printf ("%d * %d = %d\n", i, x, i * x);
-  return 0;
-}
diff --git a/20191017/loesung-3-1.c b/20191017/loesung-3-1.c
deleted file mode 100644
index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000
--- a/20191017/loesung-3-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int f0 = 0;
-  int f1 = 1;
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %d\n", i, f0);
-      int f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20191017/loesung-3-2.c b/20191017/loesung-3-2.c
deleted file mode 100644
index 7043f66e6b73894be9547a5562de8cad43cf0e71..0000000000000000000000000000000000000000
--- a/20191017/loesung-3-2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int f[50];
-  f[0] = 0;
-  f[1] = 1;
-  for (int i = 2; i < 50; i++)
-    f[i] = f[i - 2] + f[i - 1];
-  for (int i = 0; i < 50; i++)
-    printf ("f[%d] = %d\n", i, f[i]);
-  return 0;
-}
diff --git a/20191017/loesung-4.c b/20191017/loesung-4.c
deleted file mode 100644
index f8481e994c02ac8e581244713756c9e9be7c7fd6..0000000000000000000000000000000000000000
--- a/20191017/loesung-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int i = 10; i >= 0; i--)
-    printf ("%d\n", i);
-  return 0;
-}
diff --git a/20191017/logo-hochschule-bochum-cvh-text-v2.pdf b/20191017/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191017/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191017/logo-hochschule-bochum.pdf b/20191017/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191017/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191017/main-1.c b/20191017/main-1.c
deleted file mode 100644
index a1155c6c8fb9c41211b91f3c9b3965d573ca6b2d..0000000000000000000000000000000000000000
--- a/20191017/main-1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <stdio.h>
-
-void main ()
-{
-  printf ("Hello, world!\n");
-}
diff --git a/20191017/pgscript.sty b/20191017/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191017/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191017/pgslides.sty b/20191017/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191017/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191017/side-effects-1.c b/20191017/side-effects-1.c
deleted file mode 100644
index c7221c5298f06ed2b489774819f1a6bc0650a610..0000000000000000000000000000000000000000
--- a/20191017/side-effects-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = printf ("Hello, world!\n");
-  printf ("%d\n", a);
-  return 0;
-}
diff --git a/20191017/while-1.c b/20191017/while-1.c
deleted file mode 100644
index 958d7425562d6cfdbd23e8e1981fd85c3895d2bd..0000000000000000000000000000000000000000
--- a/20191017/while-1.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#include <stdio.h>
-
-int main (void) { while (0) printf ("Hello, world!\n"); return 0; }
diff --git a/20191017/while-2.c b/20191017/while-2.c
deleted file mode 100644
index f832def74e748da1d7523695d37af683cabd5152..0000000000000000000000000000000000000000
--- a/20191017/while-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  while (0)
-    printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191017/while-3.c b/20191017/while-3.c
deleted file mode 100644
index 2cfd1e9419969b7e164e2d3f2ee7cec7db4ad244..0000000000000000000000000000000000000000
--- a/20191017/while-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  while (1)
-    printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191017/while-4.c b/20191017/while-4.c
deleted file mode 100644
index e5c2c2ed45d135cbe95c7e2bd05726782e8ec74e..0000000000000000000000000000000000000000
--- a/20191017/while-4.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  while (1)
-    {
-      printf ("Hello, world!\n");
-    }
-  return 0;
-}
diff --git a/20191017/while-5.c b/20191017/while-5.c
deleted file mode 100644
index 69c9f0217d75c87339cc2c333f70c498932cc64f..0000000000000000000000000000000000000000
--- a/20191017/while-5.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void) {
-    while (1) {
-        printf ("Hello, world!\n");
-    }
-  return 0;
-}
diff --git a/20191017/while-6.c b/20191017/while-6.c
deleted file mode 100644
index 3094e5be21acc1066218f221b4ec8e1833c6e2d4..0000000000000000000000000000000000000000
--- a/20191017/while-6.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int
-main (void)
-{
-  while (1)
-    {
-      printf ("Hello, world!\n");
-    }
-  return 0;
-}
diff --git a/20191024/arrays-1.c b/20191024/arrays-1.c
deleted file mode 100644
index 35cf856c63942234116544ac721ff0a47d797b09..0000000000000000000000000000000000000000
--- a/20191024/arrays-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  for (int i = 0; i < 5; i++)
-    printf ("%d\n", *(p + i));
-  return 0;
-}
diff --git a/20191024/arrays-2.c b/20191024/arrays-2.c
deleted file mode 100644
index fb0a55881e2907aad77a409808016ee3b586bd80..0000000000000000000000000000000000000000
--- a/20191024/arrays-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  for (int i = 0; i < 5; i++)
-    printf ("%d\n", *(p - i));
-  return 0;
-}
diff --git a/20191024/arrays-3.c b/20191024/arrays-3.c
deleted file mode 100644
index 03e07cf7c3217dc62dfa33b5ed629e82c5530799..0000000000000000000000000000000000000000
--- a/20191024/arrays-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  for (int i = 0; i < 5000000; i++)
-    printf ("%d\n", *(p - i));
-  return 0;
-}
diff --git a/20191024/arrays-4.c b/20191024/arrays-4.c
deleted file mode 100644
index 2015ffc6cd5057daaa755294ab4af602559eefa4..0000000000000000000000000000000000000000
--- a/20191024/arrays-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  for (int *p = prime; p < prime + 5; p++)
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20191024/arrays-4.s b/20191024/arrays-4.s
deleted file mode 100644
index f2fa9124f2c742ba94f134f302148f72473c1638..0000000000000000000000000000000000000000
--- a/20191024/arrays-4.s
+++ /dev/null
@@ -1,46 +0,0 @@
-	.file	"arrays-4.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	pushq	%rbx
-	.cfi_def_cfa_offset 24
-	.cfi_offset 3, -24
-	subq	$40, %rsp
-	.cfi_def_cfa_offset 64
-	movl	$2, (%rsp)
-	movl	$3, 4(%rsp)
-	movl	$5, 8(%rsp)
-	movl	$7, 12(%rsp)
-	movl	$11, 16(%rsp)
-	movq	%rsp, %rbx
-	leaq	20(%rsp), %rbp
-.L2:
-	movl	(%rbx), %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	addq	$4, %rbx
-	cmpq	%rbp, %rbx
-	jne	.L2
-	movl	$0, %eax
-	addq	$40, %rsp
-	.cfi_def_cfa_offset 24
-	popq	%rbx
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191024/arrays-5.c b/20191024/arrays-5.c
deleted file mode 100644
index d206e6c3296fe7f7e48febd10893a5be65fca67a..0000000000000000000000000000000000000000
--- a/20191024/arrays-5.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  for (int i = 0; i < 5; i++)
-    printf ("%d\n", p[i]);
-  return 0;
-}
diff --git a/20191024/arrays-5.s b/20191024/arrays-5.s
deleted file mode 100644
index 23714c0e917afcfe5f2f6f5178aeffdb45a78b82..0000000000000000000000000000000000000000
--- a/20191024/arrays-5.s
+++ /dev/null
@@ -1,52 +0,0 @@
-	.file	"arrays-5.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	pushq	%r12
-	.cfi_def_cfa_offset 16
-	.cfi_offset 12, -16
-	pushq	%rbp
-	.cfi_def_cfa_offset 24
-	.cfi_offset 6, -24
-	pushq	%rbx
-	.cfi_def_cfa_offset 32
-	.cfi_offset 3, -32
-	subq	$32, %rsp
-	.cfi_def_cfa_offset 64
-	movl	$2, (%rsp)
-	movl	$3, 4(%rsp)
-	movl	$5, 8(%rsp)
-	movl	$7, 12(%rsp)
-	movl	$11, 16(%rsp)
-	movq	%rsp, %rbx
-	leaq	20(%rsp), %r12
-	leaq	.LC0(%rip), %rbp
-.L2:
-	movl	(%rbx), %esi
-	movq	%rbp, %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	addq	$4, %rbx
-	cmpq	%r12, %rbx
-	jne	.L2
-	movl	$0, %eax
-	addq	$32, %rsp
-	.cfi_def_cfa_offset 32
-	popq	%rbx
-	.cfi_def_cfa_offset 24
-	popq	%rbp
-	.cfi_def_cfa_offset 16
-	popq	%r12
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191024/arrays-6.c b/20191024/arrays-6.c
deleted file mode 100644
index e4982169bf60d94437539e94f9362840db466486..0000000000000000000000000000000000000000
--- a/20191024/arrays-6.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a[3] = { 2, 3, 5 };
-  int b = 7;
-  int c = 42;
-  for (int i = 0; i < 5; i++)
-    a[i] = 0;
-  printf ("b = %d, c = %d\n", b, c);
-  return 0;
-}
diff --git a/20191024/aufgabe-2.c b/20191024/aufgabe-2.c
deleted file mode 100644
index 52e4f0af52b66fb03cd652d621f5044685cfa47e..0000000000000000000000000000000000000000
--- a/20191024/aufgabe-2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-  year = ORIGINYEAR;  /* = 1980 */
-
-  while (days > 365)
-    {
-      if (IsLeapYear (year))
-        {
-          if (days > 366)
-            {
-              days -= 366;
-              year += 1;
-            }
-        }
-      else
-        {
-          days -= 365;
-          year += 1;
-        }
-    }
diff --git a/20191024/gitlab.png b/20191024/gitlab.png
deleted file mode 100644
index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000
Binary files a/20191024/gitlab.png and /dev/null differ
diff --git a/20191024/hp-20191024.pdf b/20191024/hp-20191024.pdf
deleted file mode 100644
index b3a14504dc44817d5d1ad2eabd30a752a05e50d3..0000000000000000000000000000000000000000
Binary files a/20191024/hp-20191024.pdf and /dev/null differ
diff --git a/20191024/hp-20191024.tex b/20191024/hp-20191024.tex
deleted file mode 100644
index 67c4afd0da011710b95d240e08997c5654559f2a..0000000000000000000000000000000000000000
--- a/20191024/hp-20191024.tex
+++ /dev/null
@@ -1,1139 +0,0 @@
-% hp-20191024.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Einführung in C: Zeiger, Arrays und Strings
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{24.\ Oktober 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \item[2.1] Hello, world!
-        \item[2.2] Programme compilieren und ausführen
-        \item[2.3] Elementare Aus- und Eingabe
-        \item[2.4] Elementares Rechnen
-        \color{medgreen}
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \color{red}
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-        \color{black}
-        \item[2.12] Strukturen
-        \item[\dots]
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{1}
-\section{Einführung in C}
-\setcounter{subsection}{4}
-\subsection{Verzweigungen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    \lstinline{if}-Verzweigung
-
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      if (b != 0)
-        printf ("%d\n", a / b);
-    \end{lstlisting}
-  \end{minipage}%\pause
-  \begin{minipage}[t]{6cm}
-    \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount]
-    0 steht für \emph{falsch (false)},\\
-    $\ne 0$ steht für \emph{wahr (true)}.
-
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      if (b)
-        printf ("%d\n", a / b);
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Schleifen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    \lstinline{while}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      a = 1;
-      while (a <= 10)
-        {
-          printf ("%d\n", a);
-          a = a + 1;
-        }
-    \end{lstlisting}
-  \end{minipage}%\pause
-  \begin{minipage}[t]{6cm}
-    \lstinline{for}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      for (a = 1; a <= 10; a = a + 1)
-        printf ("%d\n", a);
-    \end{lstlisting}
-    \vspace{1.5cm}
-%    \pause
-    \lstinline{do}-\lstinline{while}-Schleife
-    \bigskip
-    \begin{lstlisting}[gobble=6]
-      a = 1;
-      do
-        {
-          printf ("%d\n", a);
-          a = a + 1;
-        }
-      while (a <= 10);
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\addtocounter{subsection}{1}
-\subsection{Seiteneffekte}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Hello, world!\n");
-      "Hello, world!\n";
-      return 0;
-    }
-  \end{lstlisting}
-%  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}}
-    \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}}
-    \pause
-    \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a = printf ("Hello, world!\n");
-      printf ("%d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-%  \pause
-  \bigskip
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿
-    $ ¡./side-effects-1¿
-    Hello, world!
-    14
-    $
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a = printf ("Hello, world!\n");
-      printf ("%d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{itemize}
-    \item
-      \lstinline{printf()} ist eine Funktion.
-%    \pause
-    \item
-      "`Haupteffekt"': Wert zurückliefern\\
-      (hier: Anzahl der ausgegebenen Zeichen)
-%    \pause
-    \item
-      \newterm{Seiteneffekt\/}: Ausgabe
-  \end{itemize}
-
-\end{frame}
-
-\addtocounter{subsection}{-1}
-\subsection{Seiteneffekte \protect\color{gray}bei Operatoren}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6cm}
-    Unäre Operatoren:
-    \begin{itemize}
-      \item
-        Negation: \lstinline{-foo}
-      \item
-        {\only<1->{\color{red}}Funktionsaufruf}: \lstinline{foo ()}
-      \item
-        {\only<1->{\color{red}}Post-Inkrement}: \lstinline{foo++}
-      \item
-        {\only<1->{\color{red}}Post-Dekrement}: \lstinline{foo--}
-      \item
-        {\only<1->{\color{red}}Prä-Inkrement}: \lstinline{++foo}
-      \item
-        {\only<1->{\color{red}}Prä-Dekrement}: \lstinline{--foo}
-    \end{itemize}
-    \medskip
-    Binäre Operatoren:
-    \begin{itemize}
-      \item
-        Rechnen: \lstinline{+ - * / %}
-      \item
-        Vergleich: \lstinline{== != < > <= >=}
-      \item
-        {\only<2->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=}
-      \item
-        Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b}
-    \end{itemize}
-%    \pause
-    \medskip
-    {\color{red}rot = mit Seiteneffekt}
-  \end{minipage}
-  \pause
-  \begin{minipage}[t]{6cm}
-    \vspace{-\bigskipamount}
-    \begin{lstlisting}
-      ¡int i;¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        {
-          printf ("%d\n", i);
-          i++;
-        }¿
-    \end{lstlisting}
-    \bigskip
-%    \pause
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; i++)
-        printf ("%d\n", i);¿
-    \end{lstlisting}
-    \bigskip
-%    \pause
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        printf ("%d\n", i++);¿
-    \end{lstlisting}
-    \bigskip
-%    \pause
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; printf ("%d\n", i++));¿
-    \end{lstlisting}
-  \end{minipage}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\addtocounter{subsection}{-2}
-\subsection{Strukturierte Programmierung}
-
-\begin{frame}[fragile]
-
-  \visible<1->{\showsubsection}
-
-  \begin{minipage}[t]{6cm}
-    \begin{onlyenv}<1->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        while (1)
-          {
-            if (i >= 10)
-              break;
-            printf ("%d\n", i++);
-          }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \strut
-    \bigskip
-    \begin{onlyenv}<1->
-      \begin{lstlisting}[gobble=8]
-        ¡i = 0;
-        loop:
-        if (i >= 10)
-          goto endloop;
-        printf ("%d\n", i++);
-        goto loop;
-        endloop:¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}
-  \begin{minipage}[t]{6cm}
-    \vspace{-\bigskipamount}
-    \begin{lstlisting}
-      ¡int i;
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        {
-          printf ("%d\n", i);
-          i++;
-        }¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; i++)
-        printf ("%d\n", i);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡i = 0;
-      while (i < 10)
-        printf ("%d\n", i++);¿
-    \end{lstlisting}
-    \bigskip
-    \begin{lstlisting}
-      ¡for (i = 0; i < 10; printf ("%d\n", i++));¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{onlyenv}<1->
-    \begin{picture}(0,0)
-      \put(-1.9,-3.0){\mbox{\color{medgreen}gut}}
-      \put(-1.9,-5.2){\begin{minipage}{5cm}
-                        \color{orange}
-                        nur, wenn\\
-                        Sie wissen,\\
-                        was Sie tun
-                      \end{minipage}}
-                    
-      \put(-10,-0.5){\mbox{\color{red}fragwürdig}}
-      \put(-9.3,-4.2){\begin{minipage}[t]{5cm}
-                        \color{red}
-                        sehr fragwürdig\\[\smallskipamount]
-                        \footnotesize(siehe z.\,B.:\\
-                        http://xkcd.com/292/)
-                      \end{minipage}}
-    \end{picture}
-  \end{onlyenv}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\addtocounter{subsection}{1}
-\subsection{Funktionen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6.5cm}
-    \vspace{-\medskipamount}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      int answer (void)
-      {
-        return 42;
-      }
-
-      void foo (void)
-      {
-        printf ("%d\n", answer ());
-      }
-
-      int main (void)
-      {
-        foo ();
-        return 0;
-      }¿
-    \end{lstlisting}
-    \vspace*{-1cm}
-  \end{minipage}%
-  \begin{minipage}[t]{6cm}
-    \begin{itemize}
-%      \pause
-      \item
-        Funktionsdeklaration:\\[\smallskipamount]
-        Typ Name ( Parameterliste )\\
-        \{\\
-        \quad Anweisungen\\
-        \}
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}[t]{6.5cm}
-    \vspace{-\medskipamount}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      void add_verbose (int a, int b)
-      {
-        printf ("%d + %d = %d\n", a, b, a + b);
-      }
-
-      int main (void)
-      {
-        add_verbose (3, 7);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{6cm}
-    \begin{itemize}
-      \item
-        Funktionsdeklaration:\\[\smallskipamount]
-        Typ Name ( Parameterliste )\\
-        \{\\
-        \quad Anweisungen\\
-        \}
-%      \pause
-      \bigskip
-      \item
-        Der Datentyp \lstinline{void}\\
-        steht für "`nichts"'\\
-        und \alt<2->{muß}{kann} ignoriert werden.
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{minipage}{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      int a, b = 3;
-
-      void foo (void)
-      {
-        b++;
-        static int a = 5;
-        int b = 7;
-        printf ("foo(): "
-               "a = %d, b = %d\n",
-               a, b);
-        a++;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}{6cm}
-    \vspace{-1cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        foo ();
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        a = b = 12;
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        foo ();
-        printf ("main(): "
-               "a = %d, b = %d\n",
-               a, b);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \item[2.1] Hello, world!
-        \item[2.2] Programme compilieren und ausführen
-        \item[2.3] Elementare Aus- und Eingabe
-        \item[2.4] Elementares Rechnen
-        \color{medgreen}
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \color{red}
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[\dots]
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Zeiger}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void calc_answer (int *a)
-    {
-      *a = 42;
-    }
-
-    int main (void)
-    {
-      int answer;
-      calc_answer (&answer);
-      printf ("The answer is %d.\n", answer);
-      return 0;
-    }
-  \end{lstlisting}
-
-  \pause
-  \vspace{-5cm}\hspace{5cm}%
-  \begin{minipage}{7cm}
-    \begin{itemize}
-      \item
-        \lstinline{*a} ist eine \lstinline{int}.
-      \pause
-      \item
-        unärer Operator \lstinline{*}:\\
-        Pointer-Dererefenzierung
-      \pause
-      \arrowitem
-        \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}.
-      \pause
-      \bigskip
-      \item
-        unärer Operator \lstinline{&}: Adresse
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-\subsection{Arrays und Strings}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}.
-
-  \bigskip
-  \pause
-  \pause
-
-  \begin{onlyenv}<1-8>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", *(p + i));
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<9>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", p[i]);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<10>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", prime[i]);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<11>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int *p = prime;
-             p < prime + 5; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<12>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[6] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<13->
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-
-  \pause
-  \vspace{-3.05cm}\hspace{5.5cm}%
-  \begin{minipage}{6.5cm}
-    \begin{itemize}
-      \item
-        \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen.
-      \pause
-      \pause
-      \item
-        \only<6-9>{\begin{picture}(0,0)
-          \color{red}
-          \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}}
-        \end{picture}}%
-        \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}.
-      \pause
-      \item
-        \lstinline{p + i} ist ein Zeiger\\
-        auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}.
-      \pause
-      \item
-        \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}.
-      \pause
-      \item
-        Andere Schreibweise:\\
-        \lstinline{p[i]} statt \lstinline{*(p + i)}
-      \pause
-      \pause
-      \item
-        Zeiger-Arithmetik:\\
-        \lstinline{p++} rückt den Zeiger \lstinline{p}\\
-        um eine \lstinline{int} weiter.
-      \pause
-      \pause
-      \item
-        Array ohne \only<14->{explizite }Längenangabe:\\
-        Compiler zählt selbst
-        \vspace*{-1cm}
-        \pause
-        \begin{picture}(0,0)
-          \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}}
-        \end{picture}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i] != 0)
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i])
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       char *p = hello_world;
-%       while (*p)
-%         printf ("%c", *p++);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{onlyenv}<1-6>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%d", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<7>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%c", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-%  \begin{onlyenv}<8>
-%    \begin{lstlisting}[gobble=6]
-%      #include <stdio.h>
-%
-%      int main (void)
-%      {
-%        char hello[] = "Hello, world!\n";
-%        printf ("%s", hello);
-%        return 0;
-%      }
-%      ¡ ¿
-%    \end{lstlisting}
-%  \end{onlyenv}
-%  \begin{onlyenv}<9>
-%    \begin{lstlisting}[gobble=6]
-%      #include <stdio.h>
-%
-%      int main (void)
-%      {
-%        char *hello = "Hello, world!\n";
-%        printf ("%s", hello);
-%        return 0;
-%      }
-%      ¡ ¿
-%    \end{lstlisting}
-%  \end{onlyenv}
-%  \begin{onlyenv}<10>
-%    \begin{lstlisting}[gobble=6]
-%      #include <stdio.h>
-%
-%      int main (void)
-%      {
-%        char *hello = "Hello, world!\n";
-%        while (*hello)
-%          printf ("%c", *hello++);
-%        return 0;
-%      }
-%    \end{lstlisting}
-%  \end{onlyenv}
-
-  \vspace{-1.7cm}\hfill
-  \begin{minipage}{6.8cm}
-    \begin{itemize}
-      \pause[2]
-      \item
-        Ein \lstinline{char} ist eine kleinere \lstinline{int}.
-      \pause
-      \item
-        Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\
-        also ein Zeiger auf \lstinline{char}s}\only<5->{\\
-        also ein Zeiger auf (kleinere) Integer}.
-      \pause
-      \pause
-      \pause
-      \item
-        Der letzte \lstinline{char} muß 0 sein.\\
-        Er kennzeichnet das Ende des Strings.
-      \pause
-      \item
-        Die Formatspezifikation\\
-        entscheidet über die Ausgabe:\\[\smallskipamount]
-        \begin{tabular}{ll}
-          \lstinline|%d|\hspace*{0.5em}dezimal
-            & \lstinline|%c|\hspace*{0.5em}Zeichen\\
-          \lstinline|%x|\hspace*{0.5em}hexadezimal
-%            \pause
-%            & \lstinline|%s|\hspace*{0.5em}String
-        \end{tabular}
-        \vspace*{-1cm}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-\iffalse
-
-\addtocounter{subsection}{-1}
-\subsection{Arrays und Strings \protect\color{gray}und Zeichen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr.
-
-  \medskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{r}
-      \lstinline|"Hello"|\\
-      \lstinline|'H'|\\
-      \lstinline|'a' + 4|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-    \begin{tabular}{c}
-      ist nur eine andere\\
-      Schreibweise für
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{l}
-      \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\
-      \lstinline|72|\\
-      \lstinline|'e'|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-  \end{center}
-
-  \begin{itemize}
-    \item
-      Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        printf ("%d\n", '*');
-      \end{lstlisting}
-
-      \smallskip
-
-      (normalerweise: ASCII)
-    \medskip
-    \item
-      Ist \lstinline{char ch} ein Großbuchstabe?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        if (ch >= 'A' && ch <= 'Z')
-          ...
-      \end{lstlisting}
-    \medskip
-    \item
-      Groß- in Kleinbuchstaben umwandeln
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        ch += 'a' - 'A';
-      \end{lstlisting}
-  \end{itemize}
-\end{frame}
-
-\subsection{Strukturen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    int main (void)
-    {
-      date today = { 24, 10, 2019 };
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        (*d).day = 24;
-        (*d).month = 10;
-        (*d).year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        d->day = 24;
-        d->month = 10;
-        d->year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \hspace*{-1cm}%
-    \lstinline{foo->bar}
-    ist Abkürzung für
-    \lstinline{(*foo).bar}
-
-    \bigskip
-
-    \visible<2->{%
-      \hspace*{-1cm}%
-      Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\
-      \hspace*{-1cm}%
-      kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.}
-
-    \bigskip
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\fi
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \color{medgreen}
-        \item[2.10] Zeiger
-        \color{orange}
-        \item[2.11] Arrays und Strings
-        \color{red}
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20191024/hp-musterloesung-20191024.pdf b/20191024/hp-musterloesung-20191024.pdf
deleted file mode 100644
index 9382ec40169efc257f442edd6a33d03ea91a578b..0000000000000000000000000000000000000000
Binary files a/20191024/hp-musterloesung-20191024.pdf and /dev/null differ
diff --git a/20191024/hp-musterloesung-20191024.tex b/20191024/hp-musterloesung-20191024.tex
deleted file mode 100644
index 59697dcb198e528d775b86c501285feb29944543..0000000000000000000000000000000000000000
--- a/20191024/hp-musterloesung-20191024.tex
+++ /dev/null
@@ -1,281 +0,0 @@
-% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Seltsame Programme, Kalender-Berechnung
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 24.\ Oktober 2019}
-
-  \exercise{Seltsame Programme}
-
-  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024}
-  finden Sie (unter anderem)\\
-  die Programme \gitfile{hp}{20191024}{test-1.c},
-  \gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}.
-
-  Was bewirken diese Programme, und warum verhalten sie sich so?
-
-  \solution
-
-  \begin{itemize}
-    \item
-      \gitfile{hp}{20191024}{test-1.c}
-
-      Hinter \lstinline{return} steht ein Ausdruck mit dem
-      Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma
-      berechnet und ignoriert und danach der Wert nach dem Komma
-      zurückgegeben wird.
-
-      In diesem Fall wird vor dem Komma der Wert des
-      \lstinline{printf()}-Aufrufs berechnet und ignoriert.
-      Als Seiteneffekt gibt das Programm die Zeile
-      \lstinline[style=terminal]{Hello, world!} aus.
-      Anschließend wird der Wert \lstinline{0} an \lstinline{return}
-      übergeben und daher \lstinline{return 0} ausgeführt.
-
-    \item
-      \gitfile{hp}{20191024}{test-2.c}
-
-      Das Programm gibt die Zeile
-      \lstinline[style=terminal]{Die Antwort lautet: 42} aus.
-
-      Die \lstinline{if}-Bedingung ist eine Zuweisung \lstinline{b = 42},
-      die den zugewiesenen Wert \lstinline{42} zurückgibt.
-      Weil dieser Wert ungleich Null ist, interpretiert
-      \lstinline{if} ihn als Wahrheitswert "`wahr"', führt also den
-      \lstinline{if}-Zweig aus und überspringt den
-      \lstinline{else}-Zweig.
-
-    \item
-      \gitfile{hp}{20191024}{test-3.c}
-
-      Das Programm stürzt mit einer Fehlermeldung
-      "`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab.
-
-      Der Funktionsaufruf \lstinline{printf (42)} übergibt den
-      Zahlenwert \lstinline{42} als String, also als einen Zeiger
-      auf \lstinline{char}-Variable, an die Funktion
-      \lstinline{printf()}. Diese versucht, auf den Speicher ab
-      Adresse 42 zuzugreifen, wofür aber das Programm keine
-      Zugriffsrechte hat. Das Betriebssystem beendet daraufhin das
-      Programm mit der o.\,a.\ Fehlermeldung.
-
-      Der String \lstinline{"Die Antwort lautet: "} wird nicht
-      ausgegeben, weil Schreiboperationen aus Effizienzgründen
-      erst nach einer abgeschlossenen Zeile (\lstinline{"\n"})
-      durchgeführt werden.
-  \end{itemize}
-
-  \clearpage
-
-  \exercise{Kalender-Berechnung}
-
-  Am 3.\,1.\,2009 meldete \emph{heise online\/}:
-  \begin{quote}
-    Kunden des ersten mobilen Media-Players von Microsoft
-    erlebten zum Jahresende eine böse Überraschung:
-    Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus.
-    Ursache war ein interner Fehler bei der Handhabung von Schaltjahren.
-
-    \strut\hfill\url{http://heise.de/-193332}, 
-  \end{quote}
-  Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20191024}{aufgabe-2.c}),
-  das für einen gegebenen Wert \lstinline{days}
-  das Jahr und den Tag innerhalb des Jahres
-  für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll:
-  \begin{lstlisting}
-     year = ORIGINYEAR;  /* = 1980 */
-
-     while (days > 365)
-       {
-         if (IsLeapYear (year))
-           {
-             if (days > 366)
-               {
-                 days -= 366;
-                 year += 1;
-               }
-           }
-         else
-           {
-             days -= 365;
-             year += 1;
-           }
-       }
-  \end{lstlisting}
-  Dieses Quelltextfragment enthält schlechten Programmierstil,
-  nämlich mehrere Code-Verdopplungen:
-  \begin{itemize}
-    \item
-      Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf.
-    \item
-      Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\
-      eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung.
-    \item
-      Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert;
-      stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet.
-  \end{itemize}
-  Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife.
-
-  Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR}
-  anstelle der Zahl 1980
-  sowie die Kapselung der Berechnung der Schaltjahr-Bedingung
-  in einer Funktion \lstinline{IsLeapYear()}.
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie das Zustandekommen der Endlosschleife.
-    \item[(b)]
-      Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme
-      nicht mehr enthält.
-  \end{itemize}
-
-  \textbf{Hinweis 1:} Verwenden Sie Ihre eigene Funktion \lstinline{IsLeapYear()}.
-
-  \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}.
-
-  \clearpage
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Erklären Sie das Zustandekommen der Endlosschleife.}
-
-      Das Programm startet mit demjenigen Wert für \lstinline{days},
-      der der Anzahl der Tage vom 1.\,1.\,1980 bis zum
-      31.\,12.\,2008 entspricht. Die \lstinline{while}-Schleife
-      läuft zunächst solange korrekt durch, bis \lstinline{year} den
-      Wert \lstinline{2008} und \lstinline{days} den Wert
-      \lstinline{366} hat. (Der 31.\,12.\ des Schaltjahres 2008 ist
-      der 366.\ Tag seines Jahres.)
-
-      Die Bedingung der \lstinline{while}-Schleife ist damit
-      weiterhin erfüllt; das Programm läuft weiter.
-
-      Da 2008 ein Schaltjahr ist, ist auch die Bedingung der äußeren
-      \lstinline{if}-Anweisung erfüllt.
-
-      Da \lstinline{days} den Wert 366 hat und dieser nicht größer
-      als 366 ist, ist die innere \lstinline{if}-Bedingung nicht
-      erfüllt. Somit wird innerhalb der \lstinline{while}-Schleife
-      kein weiterer Code ausgeführt, die \lstinline{while}-Bedingung
-      bleibt erfüllt, und das Programm führt eine Endlosschleife
-      aus.
-
-    \item[(b)]
-      \textbf{Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme
-      nicht mehr enthält.}
-
-      Um das Programm zu testen, genügt es, das Datum auf den
-      31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert
-      366 zu setzen. Darüberhinaus muß man die Funktion
-      \lstinline{IsLeapYear()} bereitstellen (vgl.\ Aufgabe 1 vom 17.\,10.\,2019).
-
-      Der Quelltext \gitfile{hp}{20191024}{loesung-2-f1.c} ist eine lauffähige
-      Version des Programms, die den Fehler (Endlosschleife)
-      reproduziert.
-
-      \breath
-
-      Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung
-      zu korrigieren, so daß diese Schaltjahre berücksichtigt. Der
-      Quelltext \gitfile{hp}{20191024}{loesung-2-f2.c} behebt den Fehler auf diese
-      Weise mit Hilfe von Und- (\lstinline{&&}) und
-      Oder-Verknüpfungen (\lstinline{||}) in der
-      \lstinline{while}-Bedingung.
-
-      Der Quelltext \gitfile{hp}{20191024}{loesung-2-f3.c} vermeidet die umständliche
-      Formulierung mit \lstinline{&&} und \lstinline{||} durch
-      Verwendung des ternären Operators \lstinline{?:}. Dieser
-      stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit.
-      In diesem Fall liefert er für die rechte Seite des Vergleichs
-      \lstinline{days >} den Wert 366 im Falle eines Schaltjahrs
-      bzw.\ ansonsten den Wert 365.
-
-      Beide Lösungen \gitfile{hp}{20191024}{loesung-2-f2.c} und \gitfile{hp}{20191024}{loesung-2-f3.c}
-      sind jedoch im Sinne der Aufgabenstellung \textbf{falsch}.
-      Diese lautet: "`Schreiben Sie das Quelltextfragment so um,
-      daß es die beschriebenen Probleme nicht mehr enthält."'
-      Mit den beschriebenen Problemen sind die genannten drei
-      Code-Verdopplungen gemeint, und diese befinden sich weiterhin
-      im Quelltext. Damit ist der Fehler zwar "`korrigiert"', aber
-      das Programm ist eher noch unübersichtlicher geworden, so daß
-      nicht klar ist, ob es nicht noch weitere Fehler enthält.
-
-      \breath
-
-      Eine richtige Lösung liefert \gitfile{hp}{20191024}{loesung-2-4.c}. Dieses
-      Programm speichert den Wert der Tage im Jahr in einer
-      Variablen \lstinline{DaysInYear}. Damit erübrigen sich die
-      \lstinline{if}-Anweisungen innerhalb der
-      \lstinline{while}-Schleife, und die damit verbundenen
-      Code-Verdopplungen verschwinden.
-
-      Etwas unschön ist hierbei die neu hinzugekommene
-      Code-Verdopplung bei der Berechnung von \lstinline{DaysInYear}.
-      Diese ist allerdings weniger kritisch als die vorherigen, da
-      sie nur einmal innerhalb der \lstinline{while}-Schleife
-      vorkommt und das andere Mal außerhalb derselben.
-
-      Um diese Code-Verdopplung loszuwerden, kann man das
-      \lstinline{if} durch den \lstinline{?:}-Operator ersetzen und
-      die Zuweisung innerhalb der \lstinline{while}-Bedingung
-      vornehmen -- siehe \gitfile{hp}{20191024}{loesung-2-5.c}. Dies ist einer der
-      seltenen Fälle, in denen ein Programm \emph{übersichtlicher\/}
-      wird, wenn eine Zuweisung innerhalb einer Bedingung
-      stattfindet.
-
-      Alternativ kann \lstinline{DaysInYear()} auch eine Funktion
-      sein -- siehe \gitfile{hp}{20191024}{loesung-2-6.c}. Diese Version ist
-      wahrscheinlich die übersichtlichste, hat jedoch den Nachteil,
-      daß die Berechnung von \lstinline{DaysInYear()} zweimal statt
-      nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit
-      verschwendet wird.
-
-      \gitfile{hp}{20191024}{loesung-2-7.c} und \gitfile{hp}{20191024}{loesung-2-8.c} beseitigen
-      dieses Problem durch eine Zuweisung des Funktionsergebnisses
-      an eine Variable -- einmal innerhalb der
-      \lstinline{while}-Bedingung und einmal außerhalb.
-      Der zweimalige Aufruf der Funktion \lstinline{DaysInYear()} in
-      \gitfile{hp}{20191024}{loesung-2-8.c} zählt nicht als Code-Verdopplung, denn
-      der Code ist ja in einer Funktion gekapselt. (Genau dazu sind
-      Funktionen ja da: daß man sie mehrfach aufrufen kann.)
-
-      \breath
-
-      Fazit: Wenn Sie sich beim Programmieren bei
-      Cut-And-Paste-Aktionen erwischen, sollten Sie die Struktur
-      Ihres Programms noch einmal überdenken.
-
-      Wahrscheinlich gibt es dann eine elegantere Lösung, deren
-      Korrektheit man auf den ersten Blick sieht.
-
-  \end{itemize}
-
-\end{document}
diff --git a/20191024/hp-uebung-20191024.pdf b/20191024/hp-uebung-20191024.pdf
deleted file mode 100644
index 885cfeb764b65ce79aeef22b895ea51ae79785f8..0000000000000000000000000000000000000000
Binary files a/20191024/hp-uebung-20191024.pdf and /dev/null differ
diff --git a/20191024/hp-uebung-20191024.tex b/20191024/hp-uebung-20191024.tex
deleted file mode 100644
index beeb65541047286d40af6ec17819f7abe5df7b1e..0000000000000000000000000000000000000000
--- a/20191024/hp-uebung-20191024.tex
+++ /dev/null
@@ -1,113 +0,0 @@
-% hp-uebung-20191024.pdf - Exercises on Low-Level Programming / Applied Computer Sciences
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Seltsame Programme, Kalender-Berechnung
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\thispagestyle{empty}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 24.\ Oktober 2019}
-
-  \exercise{Seltsame Programme}
-
-  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024}
-  finden Sie (unter anderem)\\
-  die Programme \gitfile{hp}{20191024}{test-1.c},
-  \gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}.
-
-  Was bewirken diese Programme, und warum verhalten sie sich so?
-
-  \exercise{Kalender-Berechnung}
-
-  Am 3.\,1.\,2009 meldete \emph{heise online\/}:
-  \begin{quote}
-    Kunden des ersten mobilen Media-Players von Microsoft
-    erlebten zum Jahresende eine böse Überraschung:
-    Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus.
-    Ursache war ein interner Fehler bei der Handhabung von Schaltjahren.
-
-    \strut\hfill\url{http://heise.de/-193332}, 
-  \end{quote}
-  Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20191024}{aufgabe-2.c}),
-  das für einen gegebenen Wert \lstinline{days}
-  das Jahr und den Tag innerhalb des Jahres
-  für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll:
-  \begin{lstlisting}
-     year = ORIGINYEAR;  /* = 1980 */
-
-     while (days > 365)
-       {
-         if (IsLeapYear (year))
-           {
-             if (days > 366)
-               {
-                 days -= 366;
-                 year += 1;
-               }
-           }
-         else
-           {
-             days -= 365;
-             year += 1;
-           }
-       }
-  \end{lstlisting}
-  Dieses Quelltextfragment enthält schlechten Programmierstil,
-  nämlich mehrere Code-Verdopplungen:
-  \begin{itemize}
-    \item
-      Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf.
-    \item
-      Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\
-      eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung.
-    \item
-      Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert;
-      stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet.
-  \end{itemize}
-  Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife.
-
-  Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR}
-  anstelle der Zahl 1980
-  sowie die Kapselung der Berechnung der Schaltjahr-Bedingung
-  in einer Funktion \lstinline{IsLeapYear()}.
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie das Zustandekommen der Endlosschleife.
-    \item[(b)]
-      Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme
-      nicht mehr enthält.
-  \end{itemize}
-
-  \textbf{Hinweis 1:} Verwenden Sie Ihre eigene Funktion \lstinline{IsLeapYear()}.
-
-  \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}.
-
-\end{document}
diff --git a/20191024/loesung-2-4.c b/20191024/loesung-2-4.c
deleted file mode 100644
index d141e32582374a3b3e6955f5634191d15edb3709..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-4.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  int DaysInYear;
-  if (IsLeapYear (year))
-    DaysInYear = 366;
-  else
-    DaysInYear = 365;
-
-  while (days > DaysInYear)
-    {
-      days -= DaysInYear;
-      year += 1;
-      if (IsLeapYear (year))
-        DaysInYear = 366;
-      else
-        DaysInYear = 365;
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-5.c b/20191024/loesung-2-5.c
deleted file mode 100644
index 8a71934b7df24a28d11a6696e212aaccc430277f..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-5.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  int DaysInYear;
-
-  while (days > (DaysInYear = IsLeapYear (year) ? 366 : 365))
-    {
-      days -= DaysInYear;
-      year += 1;
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-6.c b/20191024/loesung-2-6.c
deleted file mode 100644
index 0605571480991d1ec73a8cec50395ddf68ae3135..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-6.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int DaysInYear (int year)
-{
-  if (IsLeapYear (year))
-    return 366;
-  else
-    return 365;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  while (days > DaysInYear (year))
-    {
-      days -= DaysInYear (year);
-      year += 1;
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-7.c b/20191024/loesung-2-7.c
deleted file mode 100644
index 5c98286730aae146cf587b5f3401eb6eadd17aa7..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-7.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int DaysInYear (int year)
-{
-  if (IsLeapYear (year))
-    return 366;
-  else
-    return 365;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  int d;
-
-  while (days > (d = DaysInYear (year)))
-    {
-      days -= d;
-      year += 1;
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-8.c b/20191024/loesung-2-8.c
deleted file mode 100644
index e94dc80375b88fd5ff3245e8a99f76a5955b6bb8..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-8.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int DaysInYear (int year)
-{
-  if (IsLeapYear (year))
-    return 366;
-  else
-    return 365;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  int d = DaysInYear (year);
-
-  while (days > d)
-    {
-      days -= d;
-      year += 1;
-      d = DaysInYear (year);
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-f1.c b/20191024/loesung-2-f1.c
deleted file mode 100644
index 4d511c4fa7ee6a9dfb0bc2f69412eeb48745af56..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-f1.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  while (days > 365)
-    {
-      if (IsLeapYear (year))
-        {
-          if (days > 366)
-            {
-              days -= 366;
-              year += 1;
-            }
-        }
-      else
-        {
-          days -= 365;
-          year += 1;
-        }
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-f2.c b/20191024/loesung-2-f2.c
deleted file mode 100644
index a44edb09ffde3d3c77cfe673da862260368c33e3..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-f2.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  while ((IsLeapYear (year) && days > 366)
-         || (!IsLeapYear (year) && days > 365))
-    {
-      if (IsLeapYear (year))
-        {
-          if (days > 366)
-            {
-              days -= 366;
-              year += 1;
-            }
-        }
-      else
-        {
-          days -= 365;
-          year += 1;
-        }
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/loesung-2-f3.c b/20191024/loesung-2-f3.c
deleted file mode 100644
index dbfe5040274953c3b90d6b2da194c0c8ae64f04f..0000000000000000000000000000000000000000
--- a/20191024/loesung-2-f3.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <stdio.h>
-
-int IsLeapYear (int year)
-{
-  if (year % 4)
-    return 0;
-  else if (year % 100)
-    return 1;
-  else if (year % 400)
-    return 0;
-  else
-    return 1;
-}
-
-int main (void)
-{
-  int ORIGINYEAR = 1980;
-  int days = 366;
-  int year;
-
-  year = ORIGINYEAR;  /* = 1980 */
-
-  while (days > (IsLeapYear (year) ? 366 : 365))
-    {
-      if (IsLeapYear (year))
-        {
-          if (days > 366)
-            {
-              days -= 366;
-              year += 1;
-            }
-        }
-      else
-        {
-          days -= 365;
-          year += 1;
-        }
-    }
-
-  printf ("year = %d\ndays = %d\n", year, days);
-  return 0;
-}
diff --git a/20191024/logo-hochschule-bochum-cvh-text-v2.pdf b/20191024/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191024/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191024/logo-hochschule-bochum.pdf b/20191024/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191024/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191024/pgscript.sty b/20191024/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191024/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191024/pgslides.sty b/20191024/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191024/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191024/pointers-1.c b/20191024/pointers-1.c
deleted file mode 100644
index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000
--- a/20191024/pointers-1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20191024/pointers-2.c b/20191024/pointers-2.c
deleted file mode 100644
index 421153a64907b61eebbacec398ed4f1fcb487cc6..0000000000000000000000000000000000000000
--- a/20191024/pointers-2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int a)
-{
-  a = 42;
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20191024/pointers-3.c b/20191024/pointers-3.c
deleted file mode 100644
index 7867933ea67073e239e5b307d2c219639442be77..0000000000000000000000000000000000000000
--- a/20191024/pointers-3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20191024/strings-1.c b/20191024/strings-1.c
deleted file mode 100644
index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000
--- a/20191024/strings-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-  for (char *p = hello; *p; p++)
-    printf ("%d", *p);
-  return 0;
-}
diff --git a/20191024/strings-2.c b/20191024/strings-2.c
deleted file mode 100644
index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000
--- a/20191024/strings-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-  for (char *p = hello; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20191024/strings-3.c b/20191024/strings-3.c
deleted file mode 100644
index d4559b4bd31358a25cbc23ecefc1540334e99962..0000000000000000000000000000000000000000
--- a/20191024/strings-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (char *p = "Hello, world!\n"; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20191024/strings-4.c b/20191024/strings-4.c
deleted file mode 100644
index d4559b4bd31358a25cbc23ecefc1540334e99962..0000000000000000000000000000000000000000
--- a/20191024/strings-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (char *p = "Hello, world!\n"; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20191024/test-1.c b/20191024/test-1.c
deleted file mode 100644
index 9dcb8ff47664fe804b3c9973166afe0d28b53ade..0000000000000000000000000000000000000000
--- a/20191024/test-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  return
-  printf ("Hello, world!\n"),
-  0;
-}
diff --git a/20191024/test-2.c b/20191024/test-2.c
deleted file mode 100644
index 216c924cde653228187b133b1a899765eb865584..0000000000000000000000000000000000000000
--- a/20191024/test-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b = 13 * a;
-  if (b = 42)
-    printf ("Die Antwort lautet: %d\n", b);
-  else
-    printf ("Die Antwort lautet: keine Ahnung\n");
-  return 0;
-}
diff --git a/20191024/test-3.c b/20191024/test-3.c
deleted file mode 100644
index b8964c8308aec57ed4de30acae8c3e3d31b9fa38..0000000000000000000000000000000000000000
--- a/20191024/test-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 42;
-  printf ("Die Antwort lautet: ");
-  printf (a);
-  return 0;
-}
diff --git a/20191024/test-4.c b/20191024/test-4.c
deleted file mode 100644
index ca18a9f582bdaea0970b213537053a0d1fc6b927..0000000000000000000000000000000000000000
--- a/20191024/test-4.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n" + 4);
-  return 0;
-}
diff --git a/20191024/test-5.c b/20191024/test-5.c
deleted file mode 100644
index 316f46571cbd13f7a2a6fab03801439af90df0fa..0000000000000000000000000000000000000000
--- a/20191024/test-5.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: %x.\n", 'B');
-  return 0;
-}
diff --git a/20191031/aufgabe-1.c b/20191031/aufgabe-1.c
deleted file mode 100644
index ad9d80416bad5c7c0edf9c9d4f175146c92a2755..0000000000000000000000000000000000000000
--- a/20191031/aufgabe-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-int fun_1 (char *s1, char *s2)
-{
-  int result = 1;
-  for (int i = 0; s1[i] && s2[i]; i++)
-    if (s1[i] != s2[i])
-      result = 0;
-  return result;
-}
diff --git a/20191031/aufgabe-2.c b/20191031/aufgabe-2.c
deleted file mode 100644
index dc58b6e8ee4a7a023654aa0eb3a9715a5b9f75cf..0000000000000000000000000000000000000000
--- a/20191031/aufgabe-2.c
+++ /dev/null
@@ -1 +0,0 @@
-char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
diff --git a/20191031/aufgabe-3.c b/20191031/aufgabe-3.c
deleted file mode 100644
index cd80c21b95b5a4c91a43a8b3e849f5e12db183c7..0000000000000000000000000000000000000000
--- a/20191031/aufgabe-3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int n, i, divisors;
-  for (n = 0; n < 100; n++)
-    divisors = 0;
-    for (i = 0; i < n; i++)
-      if (n % i == 0)
-        divisors++;
-    if (divisors = 2)
-      printf ("%d ist eine Primzahl.\n", n);
-  return 0;
-}
diff --git a/20191031/chars-1.c b/20191031/chars-1.c
deleted file mode 100644
index 9cfc700a0e6961638b5845ef997b4e5ac106b16f..0000000000000000000000000000000000000000
--- a/20191031/chars-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%c\n", 117);
-  return 0;
-}
diff --git a/20191031/files-1.c b/20191031/files-1.c
deleted file mode 100644
index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000
--- a/20191031/files-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/files-2.c b/20191031/files-2.c
deleted file mode 100644
index 65874828b001bbcf22c6323b344592eb69c33c18..0000000000000000000000000000000000000000
--- a/20191031/files-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("bla/fhello.txt", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/files-3.c b/20191031/files-3.c
deleted file mode 100644
index d24ac4460cb907c222abe4cfad011ce7b912f3f9..0000000000000000000000000000000000000000
--- a/20191031/files-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("c:\\windows\\system\\kern64.dll", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/files-4.c b/20191031/files-4.c
deleted file mode 100644
index d467f34f9c699140bfaf7f555ec4a89d6976baa1..0000000000000000000000000000000000000000
--- a/20191031/files-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/files-5.c b/20191031/files-5.c
deleted file mode 100644
index 3711c8de04fc9c02e8d5c5218256c76d39c65439..0000000000000000000000000000000000000000
--- a/20191031/files-5.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  return 0;
-}
diff --git a/20191031/files-6.c b/20191031/files-6.c
deleted file mode 100644
index 419284e35c0f518746cf608b8bda46fbcf904ae2..0000000000000000000000000000000000000000
--- a/20191031/files-6.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  else
-    fprintf (stderr, "error #%d\n", errno);
-  return 0;
-}
diff --git a/20191031/files-7.c b/20191031/files-7.c
deleted file mode 100644
index 655b4f84ae87480bb68ddce1625556ac5685fab4..0000000000000000000000000000000000000000
--- a/20191031/files-7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  else
-    {
-      char *msg = strerror (errno);
-      fprintf (stderr, "%s\n", msg);
-    }
-  return 0;
-}
diff --git a/20191031/files-8.c b/20191031/files-8.c
deleted file mode 100644
index 0d547eb35c42feb740a0b2064965e48188d91281..0000000000000000000000000000000000000000
--- a/20191031/files-8.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  if (!f)
-    error (1, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/files-9.c b/20191031/files-9.c
deleted file mode 100644
index f8110db6add22be281d3e67ba9b6978db164d32d..0000000000000000000000000000000000000000
--- a/20191031/files-9.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/etc/passwd", "w");
-  if (!f)
-    error (errno, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20191031/gitlab.png b/20191031/gitlab.png
deleted file mode 100644
index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000
Binary files a/20191031/gitlab.png and /dev/null differ
diff --git a/20191031/hp-20191031.pdf b/20191031/hp-20191031.pdf
deleted file mode 100644
index 21b00eb54aaa9516ea39fe8795e60b893375ee01..0000000000000000000000000000000000000000
Binary files a/20191031/hp-20191031.pdf and /dev/null differ
diff --git a/20191031/hp-20191031.tex b/20191031/hp-20191031.tex
deleted file mode 100644
index 514c63a274bb064311460666a7bffcb4fa59b3d3..0000000000000000000000000000000000000000
--- a/20191031/hp-20191031.tex
+++ /dev/null
@@ -1,778 +0,0 @@
-% hp-20191031.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{31.\ Oktober 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \color{medgreen}
-        \item[2.10] Zeiger
-        \color{orange}
-        \item[2.11] Arrays und Strings
-        \color{red}
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{black}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \color{gray}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{1}
-\section{Einführung in C}
-\setcounter{subsection}{9}
-\subsection{Zeiger}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void calc_answer (int *a)
-    {
-      *a = 42;
-    }
-
-    int main (void)
-    {
-      int answer;
-      calc_answer (&answer);
-      printf ("The answer is %d.\n", answer);
-      return 0;
-    }
-  \end{lstlisting}
-
-%  \pause
-  \vspace{-5cm}\hspace{5cm}%
-  \begin{minipage}{7cm}
-    \begin{itemize}
-      \item
-        \lstinline{*a} ist eine \lstinline{int}.
-%      \pause
-      \item
-        unärer Operator \lstinline{*}:\\
-        Pointer-Dererefenzierung
-%      \pause
-      \arrowitem
-        \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}.
-%      \pause
-      \bigskip
-      \item
-        unärer Operator \lstinline{&}: Adresse
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-\subsection{Arrays und Strings}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}.
-
-  \bigskip
-  \pause
-  \pause
-
-  \begin{onlyenv}<1-8>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", *(p + i));
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<9>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", p[i]);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<10>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", prime[i]);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<11>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int *p = prime;
-             p < prime + 5; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<12>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[6] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<13->
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-
-  \pause
-  \vspace{-3.05cm}\hspace{5.5cm}%
-  \begin{minipage}{6.5cm}
-    \begin{itemize}
-      \item
-        \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen.
-      \pause
-      \pause
-      \item
-        \only<6-9>{\begin{picture}(0,0)
-          \color{red}
-          \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}}
-        \end{picture}}%
-        \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}.
-      \pause
-      \item
-        \lstinline{p + i} ist ein Zeiger\\
-        auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}.
-      \pause
-      \item
-        \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}.
-      \pause
-      \item
-        Andere Schreibweise:\\
-        \lstinline{p[i]} statt \lstinline{*(p + i)}
-      \pause
-      \pause
-      \item
-        Zeiger-Arithmetik:\\
-        \lstinline{p++} rückt den Zeiger \lstinline{p}\\
-        um eine \lstinline{int} weiter.
-      \pause
-      \pause
-      \item
-        Array ohne \only<14->{explizite }Längenangabe:\\
-        Compiler zählt selbst
-        \vspace*{-1cm}
-        \pause
-        \begin{picture}(0,0)
-          \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}}
-        \end{picture}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i] != 0)
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i])
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       char *p = hello_world;
-%       while (*p)
-%         printf ("%c", *p++);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{onlyenv}<1-6>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%d", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<7>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%c", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<8>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        printf ("%s", hello);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<9>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char *hello = "Hello, world!\n";
-        printf ("%s", hello);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<10>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char *hello = "Hello, world!\n";
-        while (*hello)
-          printf ("%c", *hello++);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-
-  \vspace{-1.7cm}\hfill
-  \begin{minipage}{6.8cm}
-    \begin{itemize}
-      \pause[2]
-      \item
-        Ein \lstinline{char} ist eine kleinere \lstinline{int}.
-      \pause
-      \item
-        Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\
-        also ein Zeiger auf \lstinline{char}s}\only<5->{\\
-        also ein Zeiger auf (kleinere) Integer}.
-      \pause
-      \pause
-      \pause
-      \item
-        Der letzte \lstinline{char} muß 0 sein.\\
-        Er kennzeichnet das Ende des Strings.
-      \pause
-      \item
-        Die Formatspezifikation\\
-        entscheidet über die Ausgabe:\\[\smallskipamount]
-        \begin{tabular}{ll}
-          \lstinline|%d|\hspace*{0.5em}dezimal
-            & \lstinline|%c|\hspace*{0.5em}Zeichen\\
-          \lstinline|%x|\hspace*{0.5em}hexadezimal
-            \pause
-            & \lstinline|%s|\hspace*{0.5em}String
-        \end{tabular}
-        \vspace*{-1cm}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-\addtocounter{subsection}{-1}
-\subsection{Arrays und Strings \protect\color{gray}und Zeichen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr.
-
-  \medskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{r}
-      \lstinline|"Hello"|\\
-      \lstinline|'H'|\\
-      \lstinline|'a' + 4|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-    \begin{tabular}{c}
-      ist nur eine andere\\
-      Schreibweise für
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{l}
-      \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\
-      \lstinline|72|\\
-      \lstinline|'e'|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-  \end{center}
-
-  \begin{itemize}
-    \item
-      Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz (normalerweise: ASCII)?\\
-      Welches Zeichen entspricht dem Zahlenwert \lstinline{71}?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        printf ("%d\n", '*');
-        printf ("%c\n", 71);
-      \end{lstlisting}
-    \medskip
-    \item
-      Ist \lstinline{char ch} ein Großbuchstabe?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        if (ch >= 'A' && ch <= 'Z')
-          ...
-      \end{lstlisting}
-    \smallskip
-    \item
-      Groß- in Kleinbuchstaben umwandeln
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        ch += 'a' - 'A';
-      \end{lstlisting}
-  \end{itemize}
-  \vspace*{-1cm}
-\end{frame}
-
-\subsection{Strukturen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    int main (void)
-    {
-      date today = { 24, 10, 2019 };
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        (*d).day = 24;
-        (*d).month = 10;
-        (*d).year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        d->day = 24;
-        d->month = 10;
-        d->year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \hspace*{-1cm}%
-    \lstinline{foo->bar}
-    ist Abkürzung für
-    \lstinline{(*foo).bar}
-
-    \bigskip
-
-    \visible<2->{%
-      \hspace*{-1cm}%
-      Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\
-      \hspace*{-1cm}%
-      kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.}
-
-    \bigskip
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Dateien und Fehlerbehandlung}
-
-\begin{frame}[fragile]
-  \showsubsection
-  \vspace*{-0.2925cm}
-  \begin{minipage}[t]{6cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<3>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          else
-            fprintf (stderr, "error #%d\n", errno);
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<4>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-        #include <string.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          else
-            {
-              char *msg = strerror (errno);
-              fprintf (stderr, "%s\n", msg);
-            }
-          return 0;
-        }¿
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{onlyenv}
-    \begin{onlyenv}<5->
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-        #include <er¡ror.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (!f)
-            error (1, errno, "cannot open file");
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-          return 0;
-        }
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\pause\hspace*{-1.5cm}%
-  \begin{minipage}[t]{8.5cm}
-    \bigskip
-    \only<3->{\bigskip}
-    \begin{itemize}
-      \item
-        Wenn die Datei nicht geöffnet werden kann,\\
-        gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück.
-        \pause
-        \medskip
-      \item
-        \addtolength{\leftskip}{1cm}
-        Die globale Variable \lstinline{int errno}\\
-        enthält dann die Nummer des Fehlers.\\
-        Benötigt: \lstinline{#include <errno.h>}
-        \pause
-        \medskip
-        \only<5->{\bigskip}
-      \item
-        Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\
-        in einen Fehlermeldungstext um.\\
-        Benötigt: \lstinline{#include <string.h>}
-        \pause
-        \medskip
-      \item
-        \addtolength{\leftskip}{-1.5cm}
-        Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\
-        und beendet das Programm.\\
-        Benötigt: \lstinline{#include <er¡¿ror.h>}
-        \pause
-        \medskip
-      \item
-        \textbf{Niemals Fehler einfach ignorieren!}
-    \end{itemize}
-    \addtolength{\leftskip}{0.5cm}
-  \end{minipage}
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.5] Verzweigungen
-        \item[2.6] Schleifen
-        \item[2.7] Strukturierte Programmierung
-        \item[2.8] Seiteneffekte
-        \item[2.9] Funktionen
-        \item[2.10] Zeiger
-        \color{medgreen}
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{red}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20191031/hp-musterloesung-20191031.pdf b/20191031/hp-musterloesung-20191031.pdf
deleted file mode 100644
index e45be0d65c456202c4977f12da6fd6d024669aa8..0000000000000000000000000000000000000000
Binary files a/20191031/hp-musterloesung-20191031.pdf and /dev/null differ
diff --git a/20191031/hp-musterloesung-20191031.tex b/20191031/hp-musterloesung-20191031.tex
deleted file mode 100644
index 86d3e6695ab2eff35cffab5c8fe328c22682a978..0000000000000000000000000000000000000000
--- a/20191031/hp-musterloesung-20191031.tex
+++ /dev/null
@@ -1,414 +0,0 @@
-% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 31.\ Oktober 2019}
-
-  \exercise{Strings}
-
-  Strings werden in der Programmiersprache C
-  durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{20191031}{aufgabe-1.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s1, char *s2)
-        {
-          int result = 1;
-          for (int i = 0; s1[i] && s2[i]; i++)
-            if (s1[i] != s2[i])
-              result = 0;
-          return result;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-  \end{center}
-  \begin{itemize}
-    \item[(a)]
-      Was bewirkt die Funktion? % \points{3}
-    \item[(b)]
-      Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife? % \points{2}
-    \item[(c)]
-      Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife\\
-      zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3}
-%    \item[(d)]
-%      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()}
-%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings
-%      -- und warum? % \points{2}
-    \item[(d)]
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.
-%      und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5}
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Was bewirkt die Funktion?}
-
-      Sie vergleicht zwei Strings miteinander bis zur Länge des kürzeren Strings
-      und gibt bei Gleichheit 1 zurück, ansonsten 0.
-
-      Mit anderen Worten:
-      Die Funktion prüft, ob zwei Strings bis zur Länge des kürzeren übereinstimmen,
-      und gibt bei Gleichheit 1 zurück, ansonsten 0.
-
-      Die Funktion prüft insbesondere \textbf{nicht} zwei Strings auf Gleichheit,
-      und sie ist \textbf{nicht} funktionsgleich zur
-      Standard-Bibliotheksfunktion \lstinline{strcmp()}.
-
-    \item[(b)]
-      \textbf{Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife?}
-
-      Die Bedingung prüft, ob \emph{bei einem der beiden Strings\/}
-      die Ende-Markierung (Null-Symbol) erreicht ist.
-      Falls ja, wird die Schleife beendet.
-
-    \item[(c)]
-      \textbf{Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife\\
-      zu "`\lstinline{s1[i]}"' verkürzt würde?}
-
-      In diesem Fall würde nur für \lstinline{s1} geprüft,
-      ob das Ende erreicht ist.
-      Wenn \lstinline{s1} länger ist als \lstinline{s2},
-      würde \lstinline{s2} über sein Ende hinaus ausgelesen.
-      Dies kann zu Lesezugriffen auf Speicher außerhalb des Programms
-      und damit zu einem Absturz führen
-      ("`Speicherzugriffsfehler"', "`Schutzverletzung"').
-
-    \item[(d)]
-      \textbf{Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.}
-
-      Die Effizienz läßt sich steigern, indem man die Schleife abbricht,
-      sobald das Ergebnis feststeht.
-      Es folgen drei Möglichkeiten, dies zu realisieren.
-  \end{itemize}
-
-  \begin{center}
-    \begin{minipage}[t]{8cm}
-      Erweiterung der Schleifenbedingung:
-
-      \begin{lstlisting}[gobble=8]
-        int fun_2 (char *s1, char *s2)
-        {
-          int result = 1;
-          for (int i = 0; s1[i] && s2[i] && result; i++)
-            if (s1[i] != s2[i])
-              result = 0;
-          return result;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}[t]{6cm}
-      Verwendung von \lstinline{return}:
-
-      \begin{lstlisting}[gobble=8]
-        int fun_3 (char *s1, char *s2)
-        {
-          for (int i = 0; s1[i] && s2[i]; i++)
-            if (s1[i] != s2[i])
-              return 0;
-          return 1;
-        }
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  \vspace*{-1cm}\goodbreak
-
-  \begin{center}
-    \begin{minipage}{9cm}
-      Die nebenstehende Lösung unter Verwendung von \lstinline{break}
-      ist zwar ebenfalls richtig, aber länger und weniger übersichtlich
-      als die beiden anderen Lösungen.
-
-      \smallskip
-
-      Die Datei \gitfile{hp}{20191031}{loesung-1.c} enthält ein Testprogramm
-      für alle o.\,a.\ Lösungen.
-      Das Programm testet nur die offensichtlichsten Fälle;
-      für den Einsatz der Funktionen in einer Produktivumgebung
-      wären weitaus umfassendere Tests erforderlich.
-
-      \smallskip
-
-      Das Testprogramm enthält String-Zuweisungen wie z.\,B.\
-      \lstinline{s2 = "Apfel"}.
-      Dies funktioniert, weil wir damit einen Zeiger (\lstinline{char *s2})
-      auf einen neuen Speicherbereich (\lstinline{"Apfel"}) zeigen lassen.
-      Eine entsprechende Zuweisung zwischen Arrays
-      (\lstinline{char s3[] = "Birne"; s3 = "Pfirsich";)}
-      funktioniert \emph{nicht}.
-      
-    \end{minipage}\hspace*{1cm}%
-    \begin{minipage}{6cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_4 (char *s1, char *s2)
-        {
-          int result = 1;
-          for (int i = 0; s1[i] && s2[i]; i++)
-            if (s1[i] != s2[i])
-              {
-                result = 0;
-                break;
-              }
-          return result;
-        }
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-  \exercise{Programm analysieren}
-
-  Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20191031}{aufgabe-2.c}):
-  \begin{lstlisting}
-    char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
-  \end{lstlisting}
-  \vspace{-\medskipamount}
-  \begin{itemize}
-    \item[(a)]
-      Was bewirkt dieses Programm?
-    \item[(b)]
-      Wofür stehen die Zahlen?
-    \item[(c)]
-      Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion
-      \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat,
-      wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Was bewirkt dieses Programm?}
-
-      Es gibt \emph{seinen eigenen Quelltext\/} aus.
-
-      (Wichtig ist die Bezugnahme auf den eigenen Quelltext.
-      Die Angabe\\
-      "`Es gibt
-      \lstinline|char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}|
-      aus"'\\
-      genügt insbesondere nicht.)
-
-    \item[(b)]
-      \textbf{Wofür stehen die Zahlen?}
-
-      Die 34 steht für ein Anführungszeichen und die 10 für ein
-      Zeilenendezeichen (\lstinline{\n}).
-
-      Hintergrund: Um den eigenen Quelltext ausgeben zu können, muß
-      das Programm auch Anführungszeichen und Zeilenendezeichen
-      ausgeben. Dies geschieht normalerweise mit vorangestelltem
-      Backslash: \lstinline{\"} bzw.\ \lstinline{\n}. Um dann aber
-      den Backslash ausgeben zu können, müßte man diesem ebenfalls
-      einen Backslash voranstellen: \lstinline{\\}. Damit dies nicht
-      zu einer Endlosschleife wird, verwendet der Programmierer
-      dieses Programms den Trick mit den Zahlen, die durch
-      \lstinline{%c} als Zeichen ausgegeben werden.
-
-    \item[(c)]
-      \textbf{Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion
-      \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat,
-      wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.}
-
-      Datei: \gitfile{hp}{20191031}{loesung-2.c}
-      \begin{lstlisting}[gobble=8]
-        char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c";
-        int main(void){printf(f,34,f,34,10);return 0;}
-      \end{lstlisting}
-      Das Programm ist eine einzige, lange Zeile, die hier nur aus
-      Platzgründen als zwei Zeilen abgedruckt wird. Auf das
-      Semikolon am Ende der "`ersten Zeile"' folgt unmittelbar -- ohne Leerzeichen --
-      das Schlüsselwort \lstinline{int} am Anfang der "`zweiten Zeile"'.
-
-      Mit "`die in Aufgabenteil (a) festgestellte Eigenschaft"' ist
-      gemeint, daß das Programm weiterhin seinen eigenen Quelltext
-      ausgeben soll. Die Herausforderung dieser Aufgabe besteht
-      darin, das Programm zu modifizieren, ohne diese Eigenschaft zu
-      verlieren.
-
-      Zusatzaufgabe für Interessierte: Ergänzen Sie das Programm so,
-      daß es auch mit \lstinline[style=cmd]{-Wall} ohne Warnungen
-      compiliert werden kann.
-      
-      Hinweis dazu: \lstinline{#include<stdio.h>}
-      (ohne Leerzeichen, um Platz zu sparen)
-      
-      Lösung der Zusatzaufgabe: \gitfile{hp}{20191031}{loesung-2x.c}
-
-  \end{itemize}
-
-  \exercise{Fehlerhaftes Primzahl-Programm}
-
-  \begin{minipage}[t]{5.5cm}
-    Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{20191031}{aufgabe-3.c})
-    soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft.
-
-    \smallskip
-
-    Korrigieren Sie das Programm derart, daß ein Programm entsteht,
-    welches alle Primzahlen kleiner 100 ausgibt.% \points 5
-  \end{minipage}\hfill
-  \begin{minipage}[t]{9cm}
-     \vspace*{-0.5cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int n, i, divisors;
-        for (n = 0; n < 100; n++)
-          divisors = 0;
-          for (i = 0; i < n; i++)
-            if (n % i == 0)
-              divisors++;
-          if (divisors = 2)
-            printf ("%d ist eine Primzahl.\n", n);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  \solution
-
-  Beim Compilieren des Beispiel-Programms mit
-  \lstinline[style=cmd]{gcc -Wall} erhalten wir die folgende Warnung:
-  \begin{lstlisting}[style=terminal]
-    aufgabe-2.c:11:5: warning: suggest parentheses around assignment
-                      used as truth value [-Wparentheses]
-  \end{lstlisting}
-  Beim Ausführen gibt das Programm die folgende (falsche) Behauptung aus:
-  \begin{lstlisting}[style=terminal]
-    100 ist eine Primzahl.
-  \end{lstlisting}
-
-  Einen ersten Hinweis auf den Fehler im Programm liefert die Warnung.
-  Die Bedingung \lstinline{if (divisors = 2)} in Zeile 11
-  steht \emph{nicht\/} für einen Vergleich
-  der Variablen \lstinline{divisors} mit der Zahl 2,
-  sondern für eine Zuweisung der Zahl 2 an die Variable \lstinline{divisors}.
-  Neben dem \emph{Seiteneffekt\/} der Zuweisung gibt \lstinline{divisors = 2}
-  den Wert \lstinline{2} zurück.
-  Als Bedingung interpretiert, hat \lstinline{2} den Wahrheitswert "`wahr"' ("`true"');
-  die \lstinline{printf()}-Anweisung wird daher in jedem Fall ausgeführt.
-
-  Korrektur dieses Fehlers: \lstinline{if (divisors == 2)}
-  -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-1.c}.
-
-  \bigskip
-
-  Nach der Korrektur dieses Fehlers compiliert das Programm ohne Warnung,
-  gibt aber beim Ausführen die folgende Fehlermeldung aus:
-  \begin{lstlisting}[style=terminal]
-    Gleitkomma-Ausnahme
-  \end{lstlisting}
-  (Bemerkung: Bei ausgeschalteter Optimierung
-  -- \lstinline[style=cmd]{gcc} ohne \lstinline[style=cmd]{-O} --
-  kommt diese Fehlermeldung bereits beim ersten Versuch, das Programm auszuführen.
-  Der Grund für dieses Verhalten ist, daß bei eingeschalteter Optimierung
-  irrelevante Teile des Programms entfernt und gar nicht ausgeführt werden,
-  so daß der Fehler nicht zum Tragen kommt.
-  In diesem Fall wurde die Berechnung von \lstinline{divisors} komplett wegoptimiert,
-  da der Wert dieser Variablen nirgendwo abgefragt,
-  sondern durch die Zuweisung \lstinline{if (divisors = 2)}
-  sofort wieder überschrieben wurde.)
-
-  Die Fehlermeldung "`\lstinline[style=terminal]{Gleitkomma-Ausnahme}"'
-  ist insofern irreführend, als daß hier gar keine Gleitkommazahlen im Spiel sind;
-  andererseits deutet sie auf einen Rechenfehler hin, was auch tatsächlich zutrifft.
-  Durch Untersuchen aller Rechenoperationen
-  -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} --
-  finden wir den Fehler in Zeile 9:
-  Die Modulo-Operation \lstinline{n % i} ist eine Division,
-  die dann fehlschlägt, wenn der Divisor \lstinline{i} den Wert 0 hat.
-  Die Fehlerursache ist die bei 0 beginnende \lstinline{for}-Schleife in Zeile 8:
-  \lstinline{for (i = 0; i < n; i++)}.
-
-  Korrektur dieses Fehlers: Beginn der Schleife mit \lstinline{i = 1}
-  statt \lstinline{i = 0} -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-2.c}.
-
-  \bigskip
-
-  Nach der Korrektur dieses Fehlers gibt das Programm überhaupt nichts mehr aus.
-
-  Durch Untersuchen des Verhaltens des Programms
-  -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} --
-  stellen wir fest, daß die Zeilen 8 bis 12 des Programms nur einmal ausgeführt werden
-  und nicht, wie die \lstinline{for}-Schleife in Zeile 6 vermuten ließe, 100mal.
-  Der Grund dafür ist, daß sich die \lstinline{for}-Schleife
-  nur auf die unmittelbar folgende Anweisung \lstinline{divisors = 0} bezieht.
-  Nur diese Zuweisung wird 100mal ausgeführt;
-  alles andere befindet sich außerhalb der \lstinline{for}-Schleife.
-  (Die Einrückung hat in C keine inhaltliche Bedeutung,
-  sondern dient nur zur Verdeutlichung der Struktur des Programms.
-  In diesem Fall entsprach die tatsächliche Struktur nicht der beabsichtigten.)
-
-  Korrektur dieses Fehlers:
-  geschweifte Klammern um den Inhalt der äußeren \lstinline{for}-Schleife
-  -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-3.c}.
-
-  \bigskip
-
-  Nach der Korrektur dieses Fehlers gibt das Programm folgendes aus:
-  \begin{lstlisting}[style=terminal]
-    4 ist eine Primzahl.
-    9 ist eine Primzahl.
-    25 ist eine Primzahl.
-    49 ist eine Primzahl.
-  \end{lstlisting}
-  Diese Zahlen sind keine Primzahlen (mit zwei Teilern),
-  sondern sie haben drei Teiler.
-  Demnach findet das Programm einen Teiler zu wenig.
-  (Um diesen Fehler zu finden, kann man sich zu jeder Zahl
-  die gefundene Anzahl der Teiler \lstinline{divisors} ausgeben lassen.)
-
-  Der nicht gefundene Teiler ist jeweils die Zahl selbst.
-  Dies kommt daher, daß die Schleife
-  \lstinline{for (i = 1; i < n; i++)} nur bis \lstinline{n - 1} geht,
-  also keine Division durch \lstinline{n} stattfindet.
-
-  Korrektur dieses Fehlers: Schleifenbedingung \lstinline{i <= n}
-  statt \lstinline{i < n}
-  -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-4.c}.
-
-  \bigskip
-
-  Nach der Korrektur dieses Fehlers verhält sich das Programm korrekt.
-
-  Die Datei \gitfile{hp}{20191031}{loesung-2-4.c} enthält somit das korrigierte Programm.
-
-\end{document}
diff --git a/20191031/hp-uebung-20191031.pdf b/20191031/hp-uebung-20191031.pdf
deleted file mode 100644
index a102194cf3950d93579ee6c74bd8a96fa823a42d..0000000000000000000000000000000000000000
Binary files a/20191031/hp-uebung-20191031.pdf and /dev/null differ
diff --git a/20191031/hp-uebung-20191031.tex b/20191031/hp-uebung-20191031.tex
deleted file mode 100644
index 2d332998bce09452420ea73d3035feda4cc52567..0000000000000000000000000000000000000000
--- a/20191031/hp-uebung-20191031.tex
+++ /dev/null
@@ -1,127 +0,0 @@
-% hp-uebung-20191031.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\thispagestyle{empty}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 31.\ Oktober 2019}
-
-  \exercise{Strings}
-
-  Strings werden in der Programmiersprache C
-  durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{20191031}{aufgabe-1.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s1, char *s2)
-        {
-          int result = 1;
-          for (int i = 0; s1[i] && s2[i]; i++)
-            if (s1[i] != s2[i])
-              result = 0;
-          return result;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-  \end{center}
-  \begin{itemize}
-    \item[(a)]
-      Was bewirkt die Funktion? % \points{3}
-    \item[(b)]
-      Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife? % \points{2}
-    \item[(c)]
-      Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
-      in der \lstinline{for}-Schleife\\
-      zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3}
-%    \item[(d)]
-%      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()}
-%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings
-%      -- und warum? % \points{2}
-    \item[(d)]
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.
-%      und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5}
-  \end{itemize}
-
-  \exercise{Programm analysieren}
-
-  Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20191031}{aufgabe-2.c}):
-  \begin{lstlisting}
-    char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
-  \end{lstlisting}
-  \vspace{-\medskipamount}
-  \begin{itemize}
-    \item[(a)]
-      Was bewirkt dieses Programm?
-    \item[(b)]
-      Wofür stehen die Zahlen?
-    \item[(c)]
-      Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion
-      \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat,
-      wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.
-  \end{itemize}
-
-  \exercise{Fehlerhaftes Primzahl-Programm}
-
-  \begin{minipage}[t]{5.5cm}
-    Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{20191031}{aufgabe-3.c})
-    soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft.
-
-    \smallskip
-
-    Korrigieren Sie das Programm derart, daß ein Programm entsteht,
-    welches alle Primzahlen kleiner 100 ausgibt.% \points 5
-  \end{minipage}\hfill
-  \begin{minipage}[t]{9cm}
-     \vspace*{-0.5cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int n, i, divisors;
-        for (n = 0; n < 100; n++)
-          divisors = 0;
-          for (i = 0; i < n; i++)
-            if (n % i == 0)
-              divisors++;
-          if (divisors = 2)
-            printf ("%d ist eine Primzahl.\n", n);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-\end{document}
diff --git a/20191031/loesung-1.c b/20191031/loesung-1.c
deleted file mode 100644
index 29a2b7f234ea5c31b06780e9dd461dff95dd33a3..0000000000000000000000000000000000000000
--- a/20191031/loesung-1.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#include <stdio.h>
-
-int fun_1 (char *s1, char *s2)
-{
-  int result = 1;
-  for (int i = 0; s1[i] && s2[i]; i++)
-    if (s1[i] != s2[i])
-      result = 0;
-  return result;
-}
-
-int fun_2 (char *s1, char *s2)
-{
-  int result = 1;
-  for (int i = 0; s1[i] && s2[i] && result; i++)
-    if (s1[i] != s2[i])
-      result = 0;
-  return result;
-}
-
-int fun_3 (char *s1, char *s2)
-{
-  for (int i = 0; s1[i] && s2[i]; i++)
-    if (s1[i] != s2[i])
-      return 0;
-  return 1;
-}
-
-int fun_4 (char *s1, char *s2)
-{
-  int result = 1;
-  for (int i = 0; s1[i] && s2[i]; i++)
-    if (s1[i] != s2[i])
-      {
-        result = 0;
-        break;
-      }
-  return result;
-}
-
-int main (void)
-{
-  char *s1 = "Apfel";
-  char *s2 = "Apfelkuchen";
-  if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2))
-    printf ("OK\n");
-  else
-    printf ("failed\n");
-  s1 = "Apfelkuchen";
-  s2 = "Apfel";
-  if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2))
-    printf ("OK\n");
-  else
-    printf ("failed\n");
-  s2 = "Birnenmarmelade";
-  if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2))
-    printf ("failed\n");
-  else
-    printf ("OK\n");
-  s1 = s2;
-  s2 = "Apfelkuchen";
-  if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2))
-    printf ("failed\n");
-  else
-    printf ("OK\n");
-  return 0;
-}
diff --git a/20191031/loesung-2.c b/20191031/loesung-2.c
deleted file mode 100644
index 6346384a81d62e7e687f4db99be3ba8fe4020744..0000000000000000000000000000000000000000
--- a/20191031/loesung-2.c
+++ /dev/null
@@ -1 +0,0 @@
-char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c";int main(void){printf(f,34,f,34,10);return 0;}
diff --git a/20191031/loesung-2x.c b/20191031/loesung-2x.c
deleted file mode 100644
index fcc65e153ddf009f55af118278774cd202f7c316..0000000000000000000000000000000000000000
--- a/20191031/loesung-2x.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#include<stdio.h>
-char*f="#include<stdio.h>%cchar*f=%c%s%c;int main(void){printf(f,10,34,f,34,10);return 0;}%c";int main(void){printf(f,10,34,f,34,10);return 0;}
diff --git a/20191031/loesung-3-1.c b/20191031/loesung-3-1.c
deleted file mode 100644
index 248883b772ca68d498ae4dc080e83899eb715570..0000000000000000000000000000000000000000
--- a/20191031/loesung-3-1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int n, i, divisors;
-  for (n = 0; n < 100; n++)
-    divisors = 0;
-    for (i = 0; i < n; i++)
-      if (n % i == 0)
-        divisors++;
-    if (divisors == 2)
-      printf ("%d ist eine Primzahl.\n", n);
-  return 0;
-}
diff --git a/20191031/loesung-3-2.c b/20191031/loesung-3-2.c
deleted file mode 100644
index 0cc3db639099eab0040c568acbd46987eb599645..0000000000000000000000000000000000000000
--- a/20191031/loesung-3-2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int n, i, divisors;
-  for (n = 0; n < 100; n++)
-    divisors = 0;
-    for (i = 1; i < n; i++)
-      if (n % i == 0)
-        divisors++;
-    if (divisors == 2)
-      printf ("%d ist eine Primzahl.\n", n);
-  return 0;
-}
diff --git a/20191031/loesung-3-3.c b/20191031/loesung-3-3.c
deleted file mode 100644
index af2694c1ad2f710d79d7913b9dcfc7348be96115..0000000000000000000000000000000000000000
--- a/20191031/loesung-3-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int n, i, divisors;
-  for (n = 0; n < 100; n++)
-    {
-      divisors = 0;
-      for (i = 1; i < n; i++)
-        if (n % i == 0)
-          divisors++;
-      if (divisors == 2)
-        printf ("%d ist eine Primzahl.\n", n);
-    }
-  return 0;
-}
diff --git a/20191031/loesung-3-4.c b/20191031/loesung-3-4.c
deleted file mode 100644
index 770d92706cc68f64147e5efd443880ac3d875495..0000000000000000000000000000000000000000
--- a/20191031/loesung-3-4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int n, i, divisors;
-  for (n = 0; n < 100; n++)
-    {
-      divisors = 0;
-      for (i = 1; i <= n; i++)
-        if (n % i == 0)
-          divisors++;
-      if (divisors == 2)
-        printf ("%d ist eine Primzahl.\n", n);
-    }
-  return 0;
-}
diff --git a/20191031/logo-hochschule-bochum-cvh-text-v2.pdf b/20191031/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191031/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191031/logo-hochschule-bochum.pdf b/20191031/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191031/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191031/pgscript.sty b/20191031/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191031/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191031/pgslides.sty b/20191031/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191031/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191031/strings-1.c b/20191031/strings-1.c
deleted file mode 100644
index 68227c25325d9699430cacc3d071c5dad629fb40..0000000000000000000000000000000000000000
--- a/20191031/strings-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20191031/strings-10.c b/20191031/strings-10.c
deleted file mode 100644
index 0467e07e3cd4cdbdf140e71d04b7400e768c3d00..0000000000000000000000000000000000000000
--- a/20191031/strings-10.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 137, 13, 117};
-  char *a = answer;
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  a -= 4;
-  printf ("a: %d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
-  return 0;
-}
diff --git a/20191031/strings-11.c b/20191031/strings-11.c
deleted file mode 100644
index be1b28277e717a6e00459e1a2354eea32ac0dfa6..0000000000000000000000000000000000000000
--- a/20191031/strings-11.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 65, 66, 117};
-  char *a = answer;
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  a -= 4;
-  printf ("a: %d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
-  return 0;
-}
diff --git a/20191031/strings-2.c b/20191031/strings-2.c
deleted file mode 100644
index b1b337c5726babcb354bb306d7a5db646332b351..0000000000000000000000000000000000000000
--- a/20191031/strings-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[15] = "Hello, world!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20191031/strings-3.c b/20191031/strings-3.c
deleted file mode 100644
index e25f58cd8ebbf0a24ca3396466d2c5c323ff7ac1..0000000000000000000000000000000000000000
--- a/20191031/strings-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20191031/strings-4.c b/20191031/strings-4.c
deleted file mode 100644
index b03fc4a246405b85d6067036dacdf19783c334ea..0000000000000000000000000000000000000000
--- a/20191031/strings-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[3] = "Hello, world!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20191031/strings-5.c b/20191031/strings-5.c
deleted file mode 100644
index 677a6a2db34eb4d1baaf3b2b5c3d19ac47348c0e..0000000000000000000000000000000000000000
--- a/20191031/strings-5.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char bla[] = "blablablablabla";
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  printf ("(bla: %s)", bla);
-  return 0;
-}
diff --git a/20191031/strings-6.c b/20191031/strings-6.c
deleted file mode 100644
index 4f7bd2e2b67aea914b89831bfc42c10bbe4dd528..0000000000000000000000000000000000000000
--- a/20191031/strings-6.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 137, 13, 117};
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  printf ("Answer: %d\n", answer[0]);
-  return 0;
-}
diff --git a/20191031/strings-6.s b/20191031/strings-6.s
deleted file mode 100644
index ed7bf25156d66166726a385f3cc6ee20d77cf56a..0000000000000000000000000000000000000000
--- a/20191031/strings-6.s
+++ /dev/null
@@ -1,37 +0,0 @@
-	.file	"strings-6.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%s"
-.LC1:
-	.string	"Answer: %d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$40, %rsp
-	.cfi_def_cfa_offset 48
-	movl	$1963821354, 28(%rsp)
-	movabsq	$8583909746840200520, %rax
-	movq	%rax, 14(%rsp)
-	movl	$1684828783, 22(%rsp)
-	movw	$2593, 26(%rsp)
-	leaq	14(%rsp), %rsi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movzbl	28(%rsp), %esi
-	movsbl	%sil, %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %eax
-	addq	$40, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191031/strings-7.c b/20191031/strings-7.c
deleted file mode 100644
index 580035712e8a7f904dea0187a46bed5caad58fb5..0000000000000000000000000000000000000000
--- a/20191031/strings-7.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 137, 13, 117, 43, 138, 14, 118};
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  printf ("Answer: %d\n", answer[0]);
-  return 0;
-}
diff --git a/20191031/strings-7.s b/20191031/strings-7.s
deleted file mode 100644
index 6350774657a3a37cedf793cd1ea3b04c9654e21f..0000000000000000000000000000000000000000
--- a/20191031/strings-7.s
+++ /dev/null
@@ -1,38 +0,0 @@
-	.file	"strings-7.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%s"
-.LC1:
-	.string	"Answer: %d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$40, %rsp
-	.cfi_def_cfa_offset 48
-	movabsq	$8506888665401493802, %rax
-	movq	%rax, 24(%rsp)
-	movabsq	$8583909746840200520, %rax
-	movq	%rax, 10(%rsp)
-	movl	$1684828783, 18(%rsp)
-	movw	$2593, 22(%rsp)
-	leaq	10(%rsp), %rsi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movzbl	24(%rsp), %esi
-	movsbl	%sil, %esi
-	leaq	.LC1(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %eax
-	addq	$40, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20191031/strings-8.c b/20191031/strings-8.c
deleted file mode 100644
index 2965da514379dc5d5cfc9c72652896a2d517fddc..0000000000000000000000000000000000000000
--- a/20191031/strings-8.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 137, 13, 117};
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  printf ("Answer: %d %d %d %d\n", answer[0], answer[1], answer[2], answer[3]);
-  return 0;
-}
diff --git a/20191031/strings-9.c b/20191031/strings-9.c
deleted file mode 100644
index 02852e4bff6858f598860020fbf55d29a25ae90f..0000000000000000000000000000000000000000
--- a/20191031/strings-9.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  volatile char answer[] = {42, 137, 13, 117};
-  char *a = answer;
-  char hello[14] = "Hello, world!\n";
-  printf ("%s", hello);
-  printf ("Answer: %d %d %d %d\n", answer[0], answer[1], answer[2], answer[3]);
-  a -= 4;
-  printf ("a: %d %d %d %d\n", a[0], a[1], a[2], a[3]);
-  return 0;
-}
diff --git a/20191031/structs-1.c b/20191031/structs-1.c
deleted file mode 100644
index 5f112d7e69854f445e4d034553b8322b1de38a6e..0000000000000000000000000000000000000000
--- a/20191031/structs-1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  (*d).day = 31;
-  (*d).month = 10;
-  (*d).year = 2019;
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/20191031/structs-2.c b/20191031/structs-2.c
deleted file mode 100644
index f0c9c15c82ad1068ae250358a4a4e88faebaf5b2..0000000000000000000000000000000000000000
--- a/20191031/structs-2.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  (*d).day = 31;
-  (*d).month = 10;
-  (*d).year = 2019;
-}
-
-void print_date (date *d)
-{
-  printf ("%d.%d.%d\n", (*d).day, (*d).month, (*d).year);
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  print_date (&today);
-  return 0;
-}
diff --git a/20191031/structs-3.c b/20191031/structs-3.c
deleted file mode 100644
index 748dbcb94a83806e6995faca5045c374fb9f71e3..0000000000000000000000000000000000000000
--- a/20191031/structs-3.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 31;
-  d->month = 10;
-  d->year = 2019;
-}
-
-void print_date (date *d)
-{
-  printf ("%d.%d.%d\n", d->day, d->month, d->year);
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  print_date (&today);
-  return 0;
-}
diff --git a/20191107/400_points_breadboard.jpg b/20191107/400_points_breadboard.jpg
deleted file mode 100644
index 8ba048255851581a84db16c4d5a50802f7521486..0000000000000000000000000000000000000000
Binary files a/20191107/400_points_breadboard.jpg and /dev/null differ
diff --git a/20191107/Makefile b/20191107/Makefile
deleted file mode 100644
index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000
--- a/20191107/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-%.elf: %.c
-	avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
-
-%.hex: %.elf
-	avr-objcopy -O ihex $< $@
-
-download:
-	./download.sh
diff --git a/20191107/aufgabe-1.c b/20191107/aufgabe-1.c
deleted file mode 100644
index 632b4b796ae2f4060878a8870b9e7e55e5f064b9..0000000000000000000000000000000000000000
--- a/20191107/aufgabe-1.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-void f (int *s0, int *s1)
-{
-  while (*s0 >= 0)
-  {
-    int *s = s1;
-    while (*s >= 0)
-      if (*s0 == *s++)
-        printf ("%d ", *s0);
-    s0++;
-  }
-  printf ("\n");
-}
-
-int main (void)
-{
-  int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 };
-  int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 };
-  f (a, b);
-  return 0;
-}
diff --git a/20191107/aufgabe-1c.c b/20191107/aufgabe-1c.c
deleted file mode 100644
index 9b6e7ab2ecfbddc16121acd229a13745182190c2..0000000000000000000000000000000000000000
--- a/20191107/aufgabe-1c.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-void f (int *s0, int *s1)
-{
-  while (*s0 >= 0)
-  {
-    int *s = s1;
-    while (*s >= 0)
-      if (*s0 == *s++)
-        printf ("%d ", *s0);
-    s0++;
-  }
-  printf ("\n");
-}
-
-int main (void)
-{
-  int a[] = { 10, 4, 3, 7, 12, 0, 1 };
-  int b[] = { 7, 14, 0, 8, 9, 22, 10 };
-  f (a, b);
-  return 0;
-}
diff --git a/20191107/blink-0.c b/20191107/blink-0.c
deleted file mode 100644
index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000
--- a/20191107/blink-0.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-0a.c b/20191107/blink-0a.c
deleted file mode 100644
index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000
--- a/20191107/blink-0a.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x00;  /* binär: 0000 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-1.c b/20191107/blink-1.c
deleted file mode 100644
index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000
--- a/20191107/blink-1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD |= 0x01;
-  while (1)
-    {
-      _delay_ms (500);
-      PORTD &= ~0x01;
-      _delay_ms (500);
-      PORTD |= 0x01;
-    }
-  return 0;
-}
diff --git a/20191107/blink-10.c b/20191107/blink-10.c
deleted file mode 100644
index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000
--- a/20191107/blink-10.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191107/blink-11.c b/20191107/blink-11.c
deleted file mode 100644
index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000
--- a/20191107/blink-11.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      _delay_ms (1);
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191107/blink-2.c b/20191107/blink-2.c
deleted file mode 100644
index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000
--- a/20191107/blink-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x02;
-  PORTD = 0x02;
-  while (1)
-    {
-      _delay_ms (250);
-      PORTD ^= 0x02;
-    }
-  return 0;
-}
diff --git a/20191107/blink-3.c b/20191107/blink-3.c
deleted file mode 100644
index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000
--- a/20191107/blink-3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-    }
-  return 0;
-}
diff --git a/20191107/blink-4.c b/20191107/blink-4.c
deleted file mode 100644
index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000
--- a/20191107/blink-4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20191107/blink-5.c b/20191107/blink-5.c
deleted file mode 100644
index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000
--- a/20191107/blink-5.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-6.c b/20191107/blink-6.c
deleted file mode 100644
index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000
--- a/20191107/blink-6.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  static uint8_t counter = 0;
-  if (counter++ == 0)
-    PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-7.c b/20191107/blink-7.c
deleted file mode 100644
index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000
--- a/20191107/blink-7.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-8.c b/20191107/blink-8.c
deleted file mode 100644
index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000
--- a/20191107/blink-8.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xff;   /* binär: 1111 1111 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191107/blink-9.c b/20191107/blink-9.c
deleted file mode 100644
index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000
--- a/20191107/blink-9.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191107/download.sh b/20191107/download.sh
deleted file mode 100755
index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000
--- a/20191107/download.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-port=$(ls -rt /dev/ttyACM* | tail -1)
-echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1)
-avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null
diff --git a/20191107/hp-20191107.pdf b/20191107/hp-20191107.pdf
deleted file mode 100644
index 1547ff38932e5bc9c3994027f2edbf628963975c..0000000000000000000000000000000000000000
Binary files a/20191107/hp-20191107.pdf and /dev/null differ
diff --git a/20191107/hp-20191107.tex b/20191107/hp-20191107.tex
deleted file mode 100644
index 4bc6b807b45a3e95f55fb35d74cf64242c0dde98..0000000000000000000000000000000000000000
--- a/20191107/hp-20191107.tex
+++ /dev/null
@@ -1,1785 +0,0 @@
-% hp-20191107.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{7.\ November 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.10] Zeiger
-        \color{medgreen}
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{red}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{1}
-\section{Einführung in C}
-\setcounter{subsection}{10}
-\subsection{Arrays und Strings}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}.
-
-  \bigskip
-  \pause
-  \pause
-
-  \begin{onlyenv}<1-8>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", *(p + i));
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<9>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        int *p = prime;
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", p[i]);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<10>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int i = 0; i < 5; i++)
-          printf ("%d\n", prime[i]);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<11>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[5] = { 2, 3, 5, 7, 11 };
-        for (int *p = prime;
-             p < prime + 5; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<12>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[6] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<13->
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        int prime[] = { 2, 3, 5, 7, 11, 0 };
-        for (int *p = prime; *p; p++)
-          printf ("%d\n", *p);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-
-  \pause
-  \vspace{-3.05cm}\hspace{5.5cm}%
-  \begin{minipage}{6.5cm}
-    \begin{itemize}
-      \item
-        \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen.
-      \pause
-      \pause
-      \item
-        \only<6-9>{\begin{picture}(0,0)
-          \color{red}
-          \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}}
-        \end{picture}}%
-        \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}.
-      \pause
-      \item
-        \lstinline{p + i} ist ein Zeiger\\
-        auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}.
-      \pause
-      \item
-        \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}.
-      \pause
-      \item
-        Andere Schreibweise:\\
-        \lstinline{p[i]} statt \lstinline{*(p + i)}
-      \pause
-      \pause
-      \item
-        Zeiger-Arithmetik:\\
-        \lstinline{p++} rückt den Zeiger \lstinline{p}\\
-        um eine \lstinline{int} weiter.
-      \pause
-      \pause
-      \item
-        Array ohne \only<14->{explizite }Längenangabe:\\
-        Compiler zählt selbst
-        \vspace*{-1cm}
-        \pause
-        \begin{picture}(0,0)
-          \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}}
-        \end{picture}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i] != 0)
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       int i = 0;
-%       while (hello_world[i])
-%         printf ("%d", hello_world[i++]);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-% \begin{frame}[fragile]
-%   \showsubsection
-% 
-%   \begin{lstlisting}
-%     #include <stdio.h>
-% 
-%     int main (void)
-%     {
-%       char hello_world[] = "Hello, world!\n";
-%       char *p = hello_world;
-%       while (*p)
-%         printf ("%c", *p++);
-%       return 0;
-%     }
-%   \end{lstlisting}
-% \end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{onlyenv}<1-6>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%d", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<7>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        for (char *p = hello; *p; p++)
-          printf ("%c", *p);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<8>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char hello[] = "Hello, world!\n";
-        printf ("%s", hello);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<9>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char *hello = "Hello, world!\n";
-        printf ("%s", hello);
-        return 0;
-      }
-      ¡ ¿
-    \end{lstlisting}
-  \end{onlyenv}
-  \begin{onlyenv}<10>
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      int main (void)
-      {
-        char *hello = "Hello, world!\n";
-        while (*hello)
-          printf ("%c", *hello++);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{onlyenv}
-
-  \vspace{-1.7cm}\hfill
-  \begin{minipage}{6.8cm}
-    \begin{itemize}
-      \pause[2]
-      \item
-        Ein \lstinline{char} ist eine kleinere \lstinline{int}.
-      \pause
-      \item
-        Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\
-        also ein Zeiger auf \lstinline{char}s}\only<5->{\\
-        also ein Zeiger auf (kleinere) Integer}.
-      \pause
-      \pause
-      \pause
-      \item
-        Der letzte \lstinline{char} muß 0 sein.\\
-        Er kennzeichnet das Ende des Strings.
-      \pause
-      \item
-        Die Formatspezifikation\\
-        entscheidet über die Ausgabe:\\[\smallskipamount]
-        \begin{tabular}{ll}
-          \lstinline|%d|\hspace*{0.5em}dezimal
-            & \lstinline|%c|\hspace*{0.5em}Zeichen\\
-          \lstinline|%x|\hspace*{0.5em}hexadezimal
-            \pause
-            & \lstinline|%s|\hspace*{0.5em}String
-        \end{tabular}
-        \vspace*{-1cm}
-    \end{itemize}
-  \end{minipage}
-\end{frame}
-
-\addtocounter{subsection}{-1}
-\subsection{Arrays und Strings \protect\color{gray}und Zeichen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr.
-
-  \medskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{r}
-      \lstinline|"Hello"|\\
-      \lstinline|'H'|\\
-      \lstinline|'a' + 4|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-    \begin{tabular}{c}
-      ist nur eine andere\\
-      Schreibweise für
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.5}
-    \begin{tabular}{l}
-      \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\
-      \lstinline|72|\\
-      \lstinline|'e'|
-    \end{tabular}
-    \renewcommand{\arraystretch}{1.0}
-  \end{center}
-
-  \begin{itemize}
-    \item
-      Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz (normalerweise: ASCII)?\\
-      Welches Zeichen entspricht dem Zahlenwert \lstinline{71}?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        printf ("%d\n", '*');
-        printf ("%c\n", 71);
-      \end{lstlisting}
-    \medskip
-    \item
-      Ist \lstinline{char ch} ein Großbuchstabe?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        if (ch >= 'A' && ch <= 'Z')
-          ...
-      \end{lstlisting}
-    \smallskip
-    \item
-      Groß- in Kleinbuchstaben umwandeln
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        ch += 'a' - 'A';
-      \end{lstlisting}
-  \end{itemize}
-  \vspace*{-1cm}
-\end{frame}
-
-\subsection{Strukturen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    int main (void)
-    {
-      date today = { 24, 10, 2019 };
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        (*d).day = 24;
-        (*d).month = 10;
-        (*d).year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \vspace*{0.9mm}
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      void set_date (date *d)
-      {
-        d->day = 24;
-        d->month = 10;
-        d->year = 2019;
-      }¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \hspace*{-1cm}%
-    \lstinline{foo->bar}
-    ist Abkürzung für
-    \lstinline{(*foo).bar}
-
-    \bigskip
-
-    \visible<2->{%
-      \hspace*{-1cm}%
-      Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\
-      \hspace*{-1cm}%
-      kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.}
-
-    \bigskip
-    \bigskip
-
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        date today;
-        set_date (&today);
-        printf ("%d.%d.%d\n", today.day,
-                today.month, today.year);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Dateien und Fehlerbehandlung}
-
-\begin{frame}[fragile]
-  \showsubsection
-  \vspace*{-0.2925cm}
-  \begin{minipage}[t]{6cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<3>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          else
-            fprintf (stderr, "error #%d\n", errno);
-          return 0;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<4>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-        #include <string.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (f)
-            {
-              fprintf (f, "Hello, world!\n");
-              fclose (f);
-            }
-          else
-            {
-              char *msg = strerror (errno);
-              fprintf (stderr, "%s\n", msg);
-            }
-          return 0;
-        }¿
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{onlyenv}
-    \begin{onlyenv}<5->
-      \begin{lstlisting}[gobble=8]
-        ¡#include <stdio.h>
-        #include <errno.h>
-        #include <er¡ror.h>
-
-        int main (void)
-        {
-          FILE *f = fopen ("fhello.txt", "w");
-          if (!f)
-            error (1, errno, "cannot open file");
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-          return 0;
-        }
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\pause\hspace*{-1.5cm}%
-  \begin{minipage}[t]{8.5cm}
-    \bigskip
-    \only<3->{\bigskip}
-    \begin{itemize}
-      \item
-        Wenn die Datei nicht geöffnet werden kann,\\
-        gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück.
-        \pause
-        \medskip
-      \item
-        \addtolength{\leftskip}{1cm}
-        Die globale Variable \lstinline{int errno}\\
-        enthält dann die Nummer des Fehlers.\\
-        Benötigt: \lstinline{#include <errno.h>}
-        \pause
-        \medskip
-        \only<5->{\bigskip}
-      \item
-        Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\
-        in einen Fehlermeldungstext um.\\
-        Benötigt: \lstinline{#include <string.h>}
-        \pause
-        \medskip
-      \item
-        \addtolength{\leftskip}{-1.5cm}
-        Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\
-        und beendet das Programm.\\
-        Benötigt: \lstinline{#include <er¡¿ror.h>}
-        \pause
-        \medskip
-      \item
-        \textbf{Niemals Fehler einfach ignorieren!}
-    \end{itemize}
-    \addtolength{\leftskip}{0.5cm}
-  \end{minipage}
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.10] Zeiger
-        \color{medgreen}
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{red}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-%      \begin{itemize}
-%        \color{red}
-%        \item[3.1] Der Präprozessor
-%        \item[3.2] Bibliotheken einbinden
-%        \item[3.3] Bibliotheken verwenden
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-%%        \item[3.4] Projekt organisieren: make
-%      \end{itemize}
-%    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%      \begin{itemize}
-%        \color{red}
-%        \item[4.1] Bit-Operationen
-%        \item[4.2] I/O-Ports
-%        \color{black}
-%        \item[4.3] Interrupts
-%        \vspace*{-0.1cm}
-%        \item[\dots]
-%      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Parameter des Hauptprogramms}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; i < argc; i++)
-        printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; *argv; i++, argv++)
-        printf ("argv[%d] = \"%s\"\n", i, *argv);
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{String-Operationen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char hello[] = "Hello, world!\n";
-
-      printf ("%s\n", hello);
-      printf ("%zd\n", strlen (hello));
-
-      printf ("%s\n", hello + 7);
-      printf ("%zd\n", strlen (hello + 7));
-
-      hello[5] = 0;
-      printf ("%s\n", hello);
-      printf ("%zd\n", strlen (hello));
-
-      return 0;
-    }
-  \end{lstlisting}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char *anton = "Anton";
-      char *zacharias = "Zacharias";
-
-      printf ("%d\n", strcmp (anton, zacharias));
-      printf ("%d\n", strcmp (zacharias, anton));
-      printf ("%d\n", strcmp (anton, anton));
-
-      char buffer[100] = "Huber ";
-      strcat (buffer, anton);
-      printf ("%s\n", buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char buffer[100] = "";
-      sprintf (buffer, "Die Antwort lautet: %d", 42);
-      printf ("%s\n", buffer);
-
-      char *answer = strstr (buffer, "Antwort");
-      printf ("%s\n", answer);
-      printf ("found at: %zd\n", answer - buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char buffer[100] = "";
-      snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-      printf ("%s\n", buffer);
-
-      char *answer = strstr (buffer, "Antwort");
-      printf ("%s\n", answer);
-      printf ("found at: %zd\n", answer - buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-
-  Sprachelemente weitgehend komplett
-
-  \bigskip
-  Es fehlen:
-  \begin{itemize}
-    \item
-      Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile})
-    \item
-      Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()})
-    \arrowitem
-      werden eingeführt, wenn wir sie brauchen
-    \bigskip
-    \item
-      Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen)
-    \arrowitem
-      werden eingeführt, wenn wir sie brauchen, oder:
-    \arrowitem
-      Literatur\\[\smallskipamount]
-      (z.\,B.\ Wikibooks: C-Programmierung,\\
-      Dokumentation zu Compiler und Bibliotheken)
-    \bigskip
-    \item
-      Praxiserfahrung
-    \arrowitem
-      Übung und Praktikum: nur Einstieg
-    \arrowitem
-      selbständig arbeiten
-  \end{itemize}
-\end{frame}
-
-\iffalse
-
-\section{Bibliotheken}
-\subsection{Der Präprozessor}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \lstinline{#include}: %\pause:
-  Text einbinden
-  \begin{itemize}
-%    \pause
-    \item
-      \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header
-%    \pause
-    \item
-      \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header
-  \end{itemize}
-
-  \pause
-  \bigskip
-
-  \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren
-  \begin{itemize}
-    \pause
-    \item
-      Kein Semikolon!
-    \pause
-    \item
-      Berechnungen in Klammern setzen:\\
-      \lstinline{#define VIER (2 + 2)}
-    \pause
-    \item
-      Konvention: Großbuchstaben
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliotheken einbinden}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Inhalt der Header-Datei: externe Deklarationen
-
-%  \pause
-  \smallskip
-  \lstinline{extern int answer (void);}
-
-%  \pause
-  \smallskip
-  \lstinline{extern int printf (__const char *__restrict __format, ...);}
-
-%  \pause
-  \bigskip
-  Funktion wird "`anderswo"' definiert
-  \begin{itemize}
-%    \pause
-    \item
-      separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben
-%    \pause
-    \item
-      Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker}
-%    \pause
-    \item
-      vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\
-%      \pause
-      = Datei \file{libfoo.a} in Standard-Verzeichnis
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliothek verwenden (Beispiel: GTK+)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \lstinline{#include <gtk/gtk.h>}
-    \pause
-    \smallskip
-    \item
-      Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\
-      welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc}
-      übergeben muß\alt<4->{.}{:}
-      \pause
-      \begin{onlyenv}<3>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡pkg-config --cflags --libs gtk+-3.0¿
-          -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-
-          atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1
-          .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/
-          include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc
-          lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf
-          buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I
-          /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu
-          de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk
-          -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib
-          -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk
-          -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai
-          ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject
-          -2.0 -lglib-2.0
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \pause
-    \arrowitem
-      Compiler-Aufruf:
-      \begin{onlyenv}<4>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk-
-          3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp
-          i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g
-          nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu
-          de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa
-          ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.
-          0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in
-          clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/
-          libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l
-          ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux
-          -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0
-          -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix
-          buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-      \begin{onlyenv}<5->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs)
-                 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-  \end{itemize}
-  \pause[6]
-  \begin{picture}(0,0)
-    \color{red}
-    \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}}
-    \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\
-                     \strut u.\,a.\ viele Include-Verzeichnisse:\\
-                     \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}}
-    \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}}
-    \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\
-                      \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      /* Zeichenbefehle */
-      ...
-
-      return FALSE;
-    }
-  
-    ...
-
-    g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\
-      die Funktion \lstinline{draw} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}}
-    \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\
-                    \strut Bildschirm, auf den\\
-                    \strut gezeichnet werden soll}}}
-    \pause
-    \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}}
-    \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\
-                    \strut für draw(), typischerweise\\
-                    \strut ein Zeiger auf ein struct}}}
-    \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean timer (GtkWidget *widget)
-    {
-      /* Rechenbefehle */
-      ...
-
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-  
-    ...
-
-    g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft nach 50 Millisekunden
-      die Funktion \lstinline{timer} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\
-                    \strut neu gezeichnet werden.}}}
-    \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}}
-    \pause
-    \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}}
-    \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\
-                    \strut die Funktion erneut aufgerufen werden.}}}
-    \pause
-    \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}}
-    \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\
-                    \strut eines Zeigers (später)}}}
-  \end{picture}
-
-\end{frame}
-
-\setcounter{section}{4}
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-%\begin{frame}[fragile]
-%
-%  \showsection
-%  \showsubsection
-%
-%  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-%
-%  \begin{center}
-%    \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg}
-%  \end{center}
-%
-%\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \strut\hfill
-  \begin{minipage}{2.5cm}
-    \vspace*{0.6cm}
-    \begin{align*}
-      x'(t) &= v_x(t) \\[0.65cm]
-      y'(t) &= v_y(t) \\[0.75cm]
-      v_x'(t) &= 0 \\[0.65cm]
-      v_y'(t) &= -g
-    \end{align*}
-    \vspace*{0.0cm}
-  \end{minipage}%
-  \only<1>{\hspace*{9.49cm}}\strut
-  \only<2->{\hfill$\Rightarrow$\hfill}%
-  \begin{onlyenv}<2-8>
-    \begin{minipage}{8.3cm}
-      \begin{align*}
-        x(t) &= \int v_x(t)\,dt
-          \visible<4->{= \int v_{0x}\,dt}
-          \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount]
-        y(t) &= \int v_y(t)\,dt
-          \visible<7->{= \int v_{0y} - g\cdot t\,dt}
-          \visible<8->{= y_0 + v_{0y}\cdot t
-                         - {\textstyle\frac12}gt^2}\\[\bigskipamount]
-        v_x(t) &= \int 0\,dt
-          \visible<3->{= v_{0x}} \\[\medskipamount]
-        v_y(t) &= \int -g\,dt
-          \visible<6->{= v_{0y} - g\cdot t}
-      \end{align*}
-    \end{minipage}%
-  \end{onlyenv}%
-  \begin{onlyenv}<9->
-    \begin{minipage}{3.5cm}
-      \vspace*{0.5cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡x += vx * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡y += vy * dt;¿
-      \end{lstlisting}
-      \vspace{0.90cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vx += 0 * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vy += -g * dt;¿
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{5.13cm}
-      Siehe: \file{gtk-13.c}
-    \end{minipage}
-  \end{onlyenv}%
-  \hfill\strut
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \medskip
-
-  \textbf{Beispiel 2: Mathematisches Pendel}
-
-  \vspace*{-2\bigskipamount}
-
-  \begin{picture}(0,0)
-    \put(8,-6.5){\includegraphics{pendulum.pdf}}
-  \end{picture}
-
-  \begin{eqnarray*}
-    \varphi'(t) &=& \omega(t) \\[\smallskipamount]
-    \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm}
-  \end{eqnarray*}
-  \vspace*{-1.5\medskipamount}
-  \begin{itemize}
-    \item
-      Von Hand (analytisch):\\
-      Lösung raten (Ansatz), Parameter berechnen
-    \item
-      Mit Computer (numerisch):\\
-      Eulersches Polygonzugverfahren
-  \end{itemize}
-  \smallskip
-  \begin{lstlisting}[gobble=0]
-    phi += dt * omega;
-    omega += - dt * g / l * sin (phi);
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  \textbf{Beispiel 3: Weltraum-Simulation}
-
-  Praktikumsaufgabe
-  \vspace*{-1cm}
-
-\end{frame}
-
-\iffalse
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\setcounter{subsection}{3}
-\subsection{Projekt organisieren: make}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \begin{itemize}
-    \item
-      \only<4->{explizite und implizite} Regeln
-      \begin{onlyenv}<2>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          philosophy: philosophy.o answer.o
-                  gcc philosophy.o answer.o -o philosophy
-
-          answer.o: answer.c answer.h
-                  gcc -Wall -O answer.c -c
-
-          philosophy.o: philosophy.c answer.h
-                  gcc -Wall -O philosophy.c -c
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<4>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = philosophy
-          OBJECTS = philosophy.o answer.o
-          HEADERS = answer.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          %.o: %.c $(HEADERS)
-                  gcc $(CFLAGS) $< -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-      \end{onlyenv}
-    \item
-      Makros
-      \begin{onlyenv}<3>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = philosophy
-          OBJECTS = philosophy.o answer.o
-          HEADERS = answer.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          answer.o: answer.c $(HEADERS)
-                  gcc $(CFLAGS) answer.c -c
-
-          philosophy.o: philosophy.c $(HEADERS)
-                  gcc $(CFLAGS) philosophy.c -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \begin{onlyenv}<5->
-      \smallskip
-      \arrowitem
-        3 Sprachen: C, Präprozessor, make
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \color{medgreen}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \color{red}
-        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Differentialgleichungen
-        \color{black}
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.10] Zeiger
-        \color{medgreen}
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{red}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-%      \begin{itemize}
-%        \color{red}
-%        \item[3.1] Der Präprozessor
-%        \item[3.2] Bibliotheken einbinden
-%        \item[3.3] Bibliotheken verwenden
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-%%        \item[3.4] Projekt organisieren: make
-%      \end{itemize}
-%    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{black}
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\subsection{Bit-Operationen}
-\subsubsection{Zahlensysteme}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \vspace*{-\smallskipamount}
-  \showsubsection
-  \vspace*{-\medskipamount}
-  \showsubsubsection
-
-  \begin{tabular}{rlrl}
-    Basis & Name & Beispiel & Anwendung \\[\smallskipamount]
-      2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\
-      8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\
-     10 & Dezimalsystem & \lstinline,259, & Alltag \\
-     16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\
-    256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4)
-  \end{tabular}
-
-  \bigskip
-
-  \begin{itemize}
-    \item
-      Computer rechnen im Binärsystem.
-    \item
-      Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\
-      Bits in Zahlen einzeln ansprechen zu können.
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{rlrlrc}
-    \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\
-           001 & \bf 1                 & 0001 & \bf 1 &       1001 & \bf 9\\
-           010 & \bf 2                 & 0010 & \bf 2 &       1010 & \bf A\\
-           011 & \bf 3                 & 0011 & \bf 3 &       1011 & \bf B\\[\smallskipamount]
-           100 & \bf 4                 & 0100 & \bf 4 &       1100 & \bf C\\
-           101 & \bf 5                 & 0101 & \bf 5 &       1101 & \bf D\\
-           110 & \bf 6                 & 0110 & \bf 6 &       1110 & \bf E\\
-           111 & \bf 7                 & 0111 & \bf 7 &       1111 & \bf F\\
-  \end{tabular}
-
-  \medskip
-
-  \begin{itemize}
-    \item
-      Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\
-      in Binär-Zahlen umrechnen.
-    \item
-      Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 4 Bits.
-    \item
-      Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 3 Bits.
-    \item
-      Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\
-      die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen.
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Bit-Operationen in C}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{lll}
-    C-Operator     & Verknüpfung              & Anwendung                \\[\smallskipamount]
-    \lstinline,&,  & Und                      & Bits gezielt löschen     \\
-    \lstinline,|,  & Oder                     & Bits gezielt setzen      \\
-    \lstinline,^,  & Exklusiv-Oder            & Bits gezielt invertieren \\
-    \lstinline,~,  & Nicht                    & Alle Bits invertieren    \\[\smallskipamount]
-    \lstinline,<<, & Verschiebung nach links  & Maske generieren         \\
-    \lstinline,>>, & Verschiebung nach rechts & Bits isolieren
-  \end{tabular}
-
-  \bigskip
-
-  Numerierung der Bits: von rechts ab 0
-
-  \medskip
-
-  \begin{tabular}{ll}
-    Bit Nr.\ 3 auf 1 setzen: &
-    \lstinline,a |= 1 << 3;, \\
-    Bit Nr.\ 4 auf 0 setzen: &
-    \lstinline,a &= ~(1 << 4);, \\
-    Bit Nr.\ 0 invertieren: &
-    \lstinline,a ^= 1 << 0;,
-  \end{tabular}
-
-  \smallskip
-
-  ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad
-  \lstinline{if (a & (1 << 1))}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  C-Datentypen für Bit-Operationen:
-  \smallskip\par
-  \lstinline{#include <stdint.h>}
-  \medskip\par
-  \begin{tabular}{lllll}
-                    & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\
-    mit Vorzeichen  & \lstinline,int8_t,
-                    & \lstinline,int16_t,
-                    & \lstinline,int32_t,
-                    & \lstinline,int64_t, \\
-    ohne Vorzeichen & \lstinline,uint8_t,
-                    & \lstinline,uint16_t,
-                    & \lstinline,uint32_t,
-                    & \lstinline,uint64_t,
-  \end{tabular}
-
-  \bigskip
-  \bigskip
-
-  Ausgabe:
-  \smallskip\par
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-    #include <inttypes.h>
-    ...
-    uint64_t x = 42;
-    printf ("Die Antwort lautet: %" PRIu64 "\n", x);
-  \end{lstlisting}
-
-\iffalse
-
-  \bigskip
-
-  Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.
-
-  \smallskip
-
-  \begin{tabular}[t]{ll}
-    \lstinline|void set_bit (int i);|   & Bei Index $i$ auf 1 setzen \\
-    \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\
-    \lstinline|int get_bit (int i);|    & Bei Index $i$ lesen
-  \end{tabular}
-
-  \medskip
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen.
-    \item
-      Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen.
-    \item
-      Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|).
-  \end{itemize}
-
-\fi
-
-\end{frame}
-
-\subsection{I/O-Ports}
-
-\begin{frame}[fragile]
-
-%  \showsection
-  \showsubsection
-  \vspace*{-1.5\medskipamount}
-  {\large\textbf{\color{structure}4.3\quad Interrupts}}
-
-  \bigskip
-
-  Kommunikation mit externen Geräten
-
-  \bigskip
-
-  \begin{center}
-    \includegraphics{io-ports-and-interrupts.pdf}
-  \end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  In Output-Port schreiben = Aktoren ansteuern
-
-  Beispiel: LED
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0x70;
-    PORTC = 0x40;
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 0111\,0000\\
-                binär: 0100\,0000
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Aus Input-Port lesen = Sensoren abfragen
-
-  Beispiel: Taster
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0xfd;
-    while ((PINC & 0x02) == 0)
-      ; /* just wait */
-  \end{lstlisting}
-  \begin{picture}(0,0)(-1.5,-0.42)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 1111\,1101\\
-                binär: 0000\,0010
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-  
-  \bigskip
-
-  Praktikumsaufgabe: Druckknopfampel
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.10] Zeiger
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{medgreen}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-%      \begin{itemize}
-%        \color{red}
-%        \item[3.1] Der Präprozessor
-%        \item[3.2] Bibliotheken einbinden
-%        \item[3.3] Bibliotheken verwenden
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-%%        \item[3.4] Projekt organisieren: make
-%      \end{itemize}
-%    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{red}
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20191107/hp-2019ws-p2.pdf b/20191107/hp-2019ws-p2.pdf
deleted file mode 100644
index d53d05e7e266376cbc28622d5ca0bd2ce00d4ec9..0000000000000000000000000000000000000000
Binary files a/20191107/hp-2019ws-p2.pdf and /dev/null differ
diff --git a/20191107/hp-2019ws-p2.tex b/20191107/hp-2019ws-p2.tex
deleted file mode 100644
index 4a75ab308d4e717460805d316b6859f52273901c..0000000000000000000000000000000000000000
--- a/20191107/hp-2019ws-p2.tex
+++ /dev/null
@@ -1,180 +0,0 @@
-% hp-2019ws-p2.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Versuch 2, 14. und 21.11.2019: Druckknopfampel
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{multicol}
-\usepackage{amsmath}
-\usepackage{sfmath}
-
-\sloppy
-\raggedcolumns
-\pagestyle{empty}
-\addtolength{\textheight}{1cm}
-\newcommand{\sep}{~$\cdot$~}
-\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
-
-\begin{document}
-
-  \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
-  \par\bigskip\bigskip
-  \begin{center}
-    \Large\textbf{Praktikumsversuch 2: Druckknopfampel}
-    \par\medskip
-    \normalsize Hardwarenahe Programmierung\sep
-    Wintersemester 2019/20\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Programmieren Sie einen Mikrocontroller so,
-  daß er eine Druckknopfampel steuern kann.
-
-  \begin{multicols}{2}
-
-    \begin{itemize}
-      \item
-        Normalerweise zeigt eine Druckknopfampel rotes Licht für die
-        Fußgänger und grünes Licht für die Straße.
-      \item
-        Nach Knopfdruck wechselt die Straße über Gelb nach Rot.
-        Danach bekommen die Fußgänger Grün.
-        Nach einer gewissen Zeit bekommen die Fußgänger wieder Rot,
-        und die Straße wechselt über Rot-Gelb wieder zu Grün.
-
-      \medskip
-      \item
-        Als Mikrocontroller-Entwicklungsplattform stellen wir Ihnen
-        einen \emph{Arduino Uno\/} zur Verfügung.
-      \item
-        Software-Entwiklung für den Arduino geschieht üblicherweise
-        mit Hilfe der Entwicklungswerkzeuge \emph{GCC, binutils und
-        glibc für AVR} sowie \emph{avrdude\/} für das Herunterladen
-        des geschriebenen Programms vom PC auf den Mikrocontroller.
-
-        Die Arduino-Entwicklungsumgebung (siehe z.\,B.\
-        \url{https://www.arduino.cc/en/Main/Software}) integriert
-        alle diese Komponenten.
-      \item
-        Wir schreiben unser Programm in C und nicht in der INO-Sprache.
-        Wenn die Quelltext-Dateien in der Arduino-Entwicklungsumgebung
-        die Endung \file{.ino} haben, ist das kein Problem,
-        sofern der Inhalt der Datei in C geschrieben ist.
-      \item
-        Den Schaltplan des Arduino Uno sowie das Datenblatt des
-        ATmega328p finden Sie per Web-Recherche.
-
-      \columnbreak
-
-      \item
-        Sie können Ihr Programm direkt aus der Arduino-Entwicklungsumgebung heraus
-        compilieren und auf den Mikrocontroller herunterladen.
-        Wenn Sie dies von der Kommandozeile aus machen möchten,
-        geht dies folgendermaßen:
-
-        \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p \}\\
-        \lstinline[style=cmd]{dateiname.c -o dateiname.elf}
-
-        \lstinline[style=cmd]{avr-objcopy -O ihex \}\\
-        \lstinline[style=cmd]{dateiname-4.elf dateiname-4.hex}
-
-        \lstinline[style=cmd]{avrdude -P /dev/ttyACM0 -c arduino \}\\
-        \lstinline[style=cmd]{-p m328p -U flash:w:dateiname.hex}
-
-        Notfalls: \lstinline[style=cmd]{sudo chmod 666 /dev/ttyACM0}
-
-      \medskip
-      \item
-        Die Verdrahtung erfolgt auf Steckplatinen -- siehe
-        Abb.~\ref{Steckplatine}.
-        Die mit roten und blauen Streifen markierten Lochreihen sind
-        in Längsrichtung elektrisch verbunden, alle anderen in
-        Querrichtung mit einer Trennung in der Mitte. Üblicherweise
-        verwendet man die Längsrichtung für die Stromversorgung: Rot
-        = Versorgungsspannung, Blau = 0\,V.
-      \item
-        LEDs sind keine Glühlampen! Sie haben einen Pluspol (länger)
-        und einen Minuspol (kürzer, Gehäuse abgeflacht), und sie dürfen
-        \textbf{nur mit Vorwiderstand} betrieben werden,
-        andernfalls besteht die Gefahr einer Zerstörung der LED
-        und/oder des Arduino.
-      \item
-        Anstelle eines Drucktasters verwenden wir ein Stück Draht.
-      \item
-        Bevor Sie Ihre Schaltung unter Strom setzen, lassen Sie
-        diese \textbf{durch einen Betreuer prüfen}.
-    \end{itemize}
-
-    \vspace*{-\medskipamount}
-
-    \strut\hfill\emph{Viel Erfolg!}\\[-3.5cm]
-
-  \end{multicols}
-
-  \vspace*{-1.5\bigskipamount}
-
-  \begin{figure}[h]
-    \begin{minipage}{7.3cm}
-      \includegraphics[width=8cm]{400_points_breadboard.jpg}
-      \vspace*{-1cm}
-      \caption{Steckplatine\label{Steckplatine}}
-      \vspace*{1cm}
-    \end{minipage}%
-    \begin{minipage}{9cm}
-      \small\raggedright
-      \vspace*{1cm}
-      Bildquelle:
-      \href{https://commons.wikimedia.org/wiki/File:400_points_breadboard.jpg}%
-           {\nolinkurl{https://commons.wikimedia.org/}\\
-            \nolinkurl{wiki/File:400_points_breadboard.jpg}}\\
-      Autor: \url{https://www.flickr.com/people/33504192@N00}\\
-      Lizenz: CC-BY-SA 2.0 Generic
-    \end{minipage}
-  \end{figure}
-
-  \vspace*{-1.5\bigskipamount}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 7.\ November 2019
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
-%    und Beispielprogramme\\
-    herunterladen unter:\\
-    \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-
-  \endgroup
-
-\end{document}
diff --git a/20191107/hp-musterloesung-20191107.pdf b/20191107/hp-musterloesung-20191107.pdf
deleted file mode 100644
index 9905f60c857257ddeb36f9ab2da2da55e8276971..0000000000000000000000000000000000000000
Binary files a/20191107/hp-musterloesung-20191107.pdf and /dev/null differ
diff --git a/20191107/hp-musterloesung-20191107.tex b/20191107/hp-musterloesung-20191107.tex
deleted file mode 100644
index aa38dd6b720f07db83c81af10c35766a2d620409..0000000000000000000000000000000000000000
--- a/20191107/hp-musterloesung-20191107.tex
+++ /dev/null
@@ -1,212 +0,0 @@
-% hp-musterloesung-20191107.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Arrays mit Zahlen, Datum-Bibliothek
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 7.\ November 2019}
-
-  \exercise{Arrays mit Zahlen}
-
-  \begin{minipage}[t]{0.4\textwidth}
-    Wir betrachten das folgende Programm\\
-    (Datei: \gitfile{hp}{20191107}{aufgabe-1.c}):
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      void f (int *s0, int *s1)
-      {
-        while (*s0 >= 0)
-        {
-          int *s = s1;
-          while (*s >= 0)
-            if (*s0 == *s++)
-              printf ("%d ", *s0);
-          s0++;
-        }
-        printf ("\n");
-      }
-
-      int main (void)
-      {
-        int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 };
-        int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 };
-        f (a, b);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.55\textwidth}
-    \vspace*{-\bigskipamount}
-    \begin{enumerate}[\quad(a)]
-      \item
-        Was bewirkt die Funktion \lstinline{f},\\
-        und wie funktioniert sie?
-        \points{4}
-%      \item
-%        Von welcher Ordnung (Landau-Symbol) ist die Funktion?
-%        Begründen Sie Ihre Antwort.
-%
-%        Wir beziehen uns hierbei auf die Anzahl der Vergleiche
-%        in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}.
-%        Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen,
-%        obwohl sie normalerweise nicht gleich sind.
-%        \points{2}
-      \item
-        Was passiert, wenn Sie beim Aufruf der Funktion für einen der
-        Parameter den Wert \lstinline{NULL} übergeben?
-        Begründen Sie Ihre Antwort.
-        \points{2}
-      \item
-        Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern
-        (\gitfile{hp}{20191107}{aufgabe-1c.c})?
-        Begründen Sie Ihre Antwort.
-        \begin{lstlisting}[gobble=8]
-          int main (void)
-          {
-            int a[] = { 10, 4, 3, 7, 12, 0, 1 };
-            int b[] = { 7, 14, 0, 8, 9, 22, 10 };
-            f (a, b);
-            return 0;
-          }
-        \end{lstlisting}
-        \points{2}
-%      \item
-%        Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
-%        sich die Funktion \lstinline{f} effizienter gestalten läßt,
-%        wenn man die ihr übergebenen Arrays \lstinline{s0} und
-%        \lstinline{s1} als sortiert voraussetzt.
-%        \points{5}
-%
-%        Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen?
-%      \item
-%        Von welcher
-%        Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?
-%        \points{2}
-    \end{enumerate}
-  \end{minipage}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Was bewirkt die Funktion \lstinline{f}, und wie funktioniert sie?}
-
-      Die Funktion gibt alle Zahlen aus, die sowohl im Array \lstinline{s0}
-      als auch im Array \lstinline{s1} vorkommen (Schnittmenge).
-
-      Dies geschieht, indem der Zeiger \lstinline{s0} das gesamte Array durchläuft
-      (äußere Schleife).
-      Für jedes Element des ersten Arrays durchläuft der Zeiger \lstinline{s}
-      das gesamte zweite Array (innere Schleife).
-      Auf diese Weise wird jedes Element von \lstinline{s0}
-      mit jedem von \lstinline{s1} verglichen und bei Gleichheit ausgegeben.
-
-      Um die Schleifen abbrechen zu können, enthalten beide Arrays
-      als Ende-Markierung eine negative Zahl (\lstinline{-1}).
-
-    \item
-      \textbf{Was passiert, wenn Sie beim Aufruf der Funktion für einen der
-      Parameter den Wert \lstinline{NULL} übergeben?
-      Begründen Sie Ihre Antwort.}
-
-      In dem Moment, wo auf den jeweiligen Parameter-Zeiger zugegriffen wird
-      (\lstinline{while (*s0 >= 0)} für \lstinline{s0} bzw.\
-      \lstinline{int *s = s1; while (*s >= 0)} für \lstinline{s1}),
-      kommt es zu einem Absturz (Speicherzugriffsfehler).
-      Die Dereferenzierung eines Zeigers mit dem Wert \lstinline{NULL}
-      ist nicht zulässig.
-
-    \item
-      \textbf{Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern
-      (\gitfile{hp}{20191107}{aufgabe-1c.c})?
-      Begründen Sie Ihre Antwort.}
-
-      \begin{minipage}{0.35\textwidth}
-        \begin{lstlisting}[gobble=10]
-          int main (void)
-          {
-            int a[] = { 10, 4, 3, 7, 12, 0, 1 };
-            int b[] = { 7, 14, 0, 8, 9, 22, 10 };
-            f (a, b);
-            return 0;
-          }
-        \end{lstlisting}
-      \end{minipage}\hfill
-      \begin{minipage}{0.575\textwidth}
-        Durch die fehlenden Ende-Markierungen der Arrays
-        laufen die Schleifen immer weiter,
-        bis sie irgendwann zufällig auf Speicherzellen stoßen,
-        die sich als Ende-Markierungen interpretieren lassen (negative Zahlen).
-        Dadurch kann es zu einem Lesezugriff auf Speicher kommen,
-        für den das Programm kein Lesezugriffsrecht hat,
-        also zu einem Absturz (Speicherzugriffsfehler).
-      \end{minipage}
-  \end{enumerate}
-
-  \exercise{Datum-Bibliothek}
-
-  Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen)
-  zur Behandlung von Datumsangaben.
-
-  Diese soll enthalten:
-  \begin{itemize}
-    \item
-      einen \lstinline{struct}-Datentyp \lstinline{date},
-      der eine Datumsangabe speichert,
-    \item
-      eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt,
-    \item
-      eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)},
-      die ein Datum auf einen gegebenen Tag setzt
-      und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja),
-    \item
-      eine Funktion \lstinline{void date_next (date *d)},
-      die ein Datum auf den nächsten Tag vorrückt.
-  \end{itemize}
-
-  Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet.
-
-  \solution
-
-  Die Datei \gitfile{hp}{20191107}{loesung-2.c}
-  enthält die Bibliothek zusammen mit einem Test-Programm.
-
-  Eine detaillierte Anleitung,
-  wie man auf die Funktion \lstinline{date_next()} kommt,
-  finden Sie im Skript zur Lehrveranstaltung, Datei \gitfile{hp}{script}{hp-2019ws.pdf},
-  ab Seite 29.
-
-  (Die Vorgehensweise,
-  die Bibliothek und das Hauptprogramm in dieselbe Datei zu schreiben,
-  hat den Nachteil,
-  daß man die Bibliothek in jedes weitere Programm, das sie benutzt,
-  kopieren und auch dort aktuell halten muß.
-  Eine sinnvollere Lösung wird demnächst in der Vorlesung vorgestellt werden.)
-
-\end{document}
diff --git a/20191107/hp-uebung-20191107.pdf b/20191107/hp-uebung-20191107.pdf
deleted file mode 100644
index b95cf262649215585559e08cebb725d077c74edd..0000000000000000000000000000000000000000
Binary files a/20191107/hp-uebung-20191107.pdf and /dev/null differ
diff --git a/20191107/hp-uebung-20191107.tex b/20191107/hp-uebung-20191107.tex
deleted file mode 100644
index d8bcd38685d538f35e56459c85b2d865012d4b85..0000000000000000000000000000000000000000
--- a/20191107/hp-uebung-20191107.tex
+++ /dev/null
@@ -1,152 +0,0 @@
-% hp-uebung-20191031.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Arrays mit Zahlen, Datum-Bibliothek
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\thispagestyle{empty}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 7.\ November 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 45 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  8 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Arrays mit Zahlen}
-
-  \begin{minipage}[t]{0.4\textwidth}
-    Wir betrachten das folgende Programm\\
-    (Datei: \gitfile{hp}{20191107}{aufgabe-1.c}):
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      void f (int *s0, int *s1)
-      {
-        while (*s0 >= 0)
-        {
-          int *s = s1;
-          while (*s >= 0)
-            if (*s0 == *s++)
-              printf ("%d ", *s0);
-          s0++;
-        }
-        printf ("\n");
-      }
-
-      int main (void)
-      {
-        int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 };
-        int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 };
-        f (a, b);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.55\textwidth}
-    \vspace*{-\bigskipamount}
-    \begin{enumerate}[\quad(a)]
-      \item
-        Was bewirkt die Funktion \lstinline{f},\\
-        und wie funktioniert sie?
-        \points{4}
-%      \item
-%        Von welcher Ordnung (Landau-Symbol) ist die Funktion?
-%        Begründen Sie Ihre Antwort.
-%
-%        Wir beziehen uns hierbei auf die Anzahl der Vergleiche
-%        in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}.
-%        Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen,
-%        obwohl sie normalerweise nicht gleich sind.
-%        \points{2}
-      \item
-        Was passiert, wenn Sie beim Aufruf der Funktion für einen der
-        Parameter den Wert \lstinline{NULL} übergeben?
-        Begründen Sie Ihre Antwort.
-        \points{2}
-      \item
-        Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern
-        (\gitfile{hp}{20191107}{aufgabe-1c.c})?
-        Begründen Sie Ihre Antwort.
-        \begin{lstlisting}[gobble=8]
-          int main (void)
-          {
-            int a[] = { 10, 4, 3, 7, 12, 0, 1 };
-            int b[] = { 7, 14, 0, 8, 9, 22, 10 };
-            f (a, b);
-            return 0;
-          }
-        \end{lstlisting}
-        \points{2}
-%      \item
-%        Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
-%        sich die Funktion \lstinline{f} effizienter gestalten läßt,
-%        wenn man die ihr übergebenen Arrays \lstinline{s0} und
-%        \lstinline{s1} als sortiert voraussetzt.
-%        \points{5}
-%
-%        Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen?
-%      \item
-%        Von welcher
-%        Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?
-%        \points{2}
-    \end{enumerate}
-  \end{minipage}
-
-  \exercise{Datum-Bibliothek}
-
-  Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen)
-  zur Behandlung von Datumsangaben.
-
-  Diese soll enthalten:
-  \begin{itemize}
-    \item
-      einen \lstinline{struct}-Datentyp \lstinline{date},
-      der eine Datumsangabe speichert,
-    \item
-      eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt,
-    \item
-      eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)},
-      die ein Datum auf einen gegebenen Tag setzt
-      und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja),
-    \item
-      eine Funktion \lstinline{void date_next (date *d)},
-      die ein Datum auf den nächsten Tag vorrückt.
-  \end{itemize}
-
-  Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet.
-
-  \points{8}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191107/io-ports-and-interrupts.pdf b/20191107/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20191107/io-ports-and-interrupts.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/io-ports-and-interrupts.pdf
\ No newline at end of file
diff --git a/20191107/loesung-2.c b/20191107/loesung-2.c
deleted file mode 100644
index 151c965980df79b5d0e04188f7bf6ac7a3b836a9..0000000000000000000000000000000000000000
--- a/20191107/loesung-2.c
+++ /dev/null
@@ -1,109 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-int is_leap_year (int year)
-{
-  if (year % 4 == 0)
-    if (year % 100 == 0)
-      if (year % 400 == 0)
-        return 1;
-      else
-        return 0;
-    else
-      return 1;
-  else
-    return 0;
-}
-
-int days_in_month (int month, int year)
-{
-  if (month == 2)
-    if (is_leap_year (year))
-      return 29;
-    else
-      return 28;
-  else if (month == 4 || month == 6 || month == 9 || month == 11)
-    return 30;
-  else
-    return 31;
-}
-
-void date_print (date *d)
-{
-  printf ("%02d.%02d.%04d", d->day, d->month, d->year);
-}
-
-int date_set (date *d, char day, char month, int year)
-{
-  d->year = year;
-  if (month > 0 && month <= 12)
-    d->month = month;
-  else
-    return 0;
-  if (day > 0 && day <= days_in_month (month, year))
-    d->day = day;
-  else
-    return 0;
-  return 1;
-}
-
-void date_next (date *d)
-{
-  d->day++;
-  if (d->day > days_in_month (d->month, d->year))
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-void check (char day, char month, int year)
-{
-  date d;
-  if (date_set (&d, day, month, year))
-    {
-      date_print (&d);
-      printf (" --> ");
-      date_next (&d);
-      date_print (&d);
-      printf ("\n");
-    }
-  else
-    printf ("%02d.%02d.%04d: invalid date\n", day, month, year);
-}
-
-int main (void)
-{
-  check (6, 11, 2018);
-  check (29, 11, 2018);
-  check (30, 11, 2018);
-  check (31, 11, 2018);
-  check (29, 12, 2018);
-  check (30, 12, 2018);
-  check (31, 12, 2018);
-  check (28, 2, 2016);
-  check (29, 2, 2016);
-  check (30, 2, 2016);
-  check (28, 2, 2015);
-  check (29, 2, 2015);
-  check (30, 2, 2015);
-  check (31, 12, 2008);
-  check (28, 2, 2000);
-  check (29, 2, 2000);
-  check (30, 2, 2000);
-  check (28, 2, 1900);
-  check (29, 2, 1900);
-  check (30, 2, 1900);
-  return 0;
-}
diff --git a/20191107/logo-hochschule-bochum-cvh-text-v2.pdf b/20191107/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191107/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191107/logo-hochschule-bochum.pdf b/20191107/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191107/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191107/main-params-1.c b/20191107/main-params-1.c
deleted file mode 100644
index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000
--- a/20191107/main-params-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  for (int i = 0; i < argc; i++)
-    printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-  return 0;
-}
diff --git a/20191107/main-params-2.c b/20191107/main-params-2.c
deleted file mode 100644
index 0e932b379ce3c7381241c8d8d58d2a8cad4a2f76..0000000000000000000000000000000000000000
--- a/20191107/main-params-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  for (int i = 0; *argv; i++, argv++)
-    printf ("argv[%d] = \"%s\"\n", i, *argv);
-  return 0;
-}
diff --git a/20191107/main-params-3.c b/20191107/main-params-3.c
deleted file mode 100644
index 8fa64e701d9257dae4040a694ec651a054657cf4..0000000000000000000000000000000000000000
--- a/20191107/main-params-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  int i = 0;
-  while (*argv)
-    printf ("argv[%d] = \"%s\"\n", i++, *argv++);
-  return 0;
-}
diff --git a/20191107/pgscript.sty b/20191107/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191107/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191107/pgslides.sty b/20191107/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191107/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191107/photo-20191107-172458.jpg b/20191107/photo-20191107-172458.jpg
deleted file mode 100644
index 85c4436154b52a806621cce1d7136b8b7aec2b99..0000000000000000000000000000000000000000
Binary files a/20191107/photo-20191107-172458.jpg and /dev/null differ
diff --git a/20191107/photo-20191107-172458.txt b/20191107/photo-20191107-172458.txt
deleted file mode 100644
index 2be9224d8d9fffdd1006037948f89a5d6f948c3f..0000000000000000000000000000000000000000
--- a/20191107/photo-20191107-172458.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Beispiele für Bit-Manipulation
diff --git a/20191107/string-ops-1.c b/20191107/string-ops-1.c
deleted file mode 100644
index 92163074ea985f03c6611b60ac033a212925aa47..0000000000000000000000000000000000000000
--- a/20191107/string-ops-1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-
-/*
-  printf ("%s\n", hello + 7);
-  printf ("%zd\n", strlen (hello + 7));
-
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-10.c b/20191107/string-ops-10.c
deleted file mode 100644
index 34fd25974d19f7be2d4b0ddd99add49750197d51..0000000000000000000000000000000000000000
--- a/20191107/string-ops-10.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton1 = "Anton";
-  char *anton2 = "anton";
-  char *zacharias1 = "Zacharias";
-  char *zacharias2 = "zacharias";
-
-  printf ("%d\n", strcmp (anton2, zacharias1));
-  printf ("%d\n", strcmp (anton2, zacharias2));
-
-  return 0;
-}
diff --git a/20191107/string-ops-11.c b/20191107/string-ops-11.c
deleted file mode 100644
index fed7abe314e9db92eb804177d9aae413b60fb4c6..0000000000000000000000000000000000000000
--- a/20191107/string-ops-11.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20191107/string-ops-12.c b/20191107/string-ops-12.c
deleted file mode 100644
index 80fb9895c1cf460fb2343564802fdb9f4d13856a..0000000000000000000000000000000000000000
--- a/20191107/string-ops-12.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char buffer[] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20191107/string-ops-13.c b/20191107/string-ops-13.c
deleted file mode 100644
index a52a4b750a836d9ba8de68b93b7cc1a724ce2847..0000000000000000000000000000000000000000
--- a/20191107/string-ops-13.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char buffer[] = "Huber ";
-  strcat (buffer, anton);
-  strcat (buffer, anton);
-  strcat (buffer, anton);
-  strcat (buffer, anton);
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20191107/string-ops-14.c b/20191107/string-ops-14.c
deleted file mode 100644
index ca080e2fa6f5c37a289942a362a3ae33fa58d505..0000000000000000000000000000000000000000
--- a/20191107/string-ops-14.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char buffer[20] = "Huber ";
-  strncat (buffer, anton, 20);
-  strncat (buffer, anton, 20);
-  strncat (buffer, anton, 20);
-  strncat (buffer, anton, 20);
-  strncat (buffer, anton, 20);
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20191107/string-ops-15.c b/20191107/string-ops-15.c
deleted file mode 100644
index 8101ccfc1de8242f1155164746688f9163b5a338..0000000000000000000000000000000000000000
--- a/20191107/string-ops-15.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[100] = "";
-  sprintf (buffer, "Die Antwort lautet: %d", 42);
-  printf ("%s\n", buffer);
-
-/*
-  char *answer = strstr (buffer, "Antwort");
-  printf ("%s\n", answer);
-  printf ("found at: %zd\n", answer - buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-16.c b/20191107/string-ops-16.c
deleted file mode 100644
index 141b163881b0733d009cf5489c0473fac05029dd..0000000000000000000000000000000000000000
--- a/20191107/string-ops-16.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[100] = "";
-  snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-  printf ("%s\n", buffer);
-
-/*
-  char *answer = strstr (buffer, "Antwort");
-  printf ("%s\n", answer);
-  printf ("found at: %zd\n", answer - buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-2.c b/20191107/string-ops-2.c
deleted file mode 100644
index 2657cc3ee8ec57d8cb86cdb2f02ef772d5a38c41..0000000000000000000000000000000000000000
--- a/20191107/string-ops-2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-
-  printf ("%s\n", hello);
-  printf ("%d\n", strlen (hello));
-
-/*
-  printf ("%s\n", hello + 7);
-  printf ("%zd\n", strlen (hello + 7));
-
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-3.c b/20191107/string-ops-3.c
deleted file mode 100644
index 403ba5dc2d6cd99f286b051e6d3734bb770e86e7..0000000000000000000000000000000000000000
--- a/20191107/string-ops-3.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-
-  printf ("%s\n", hello + 7);
-  printf ("%zd\n", strlen (hello + 7));
-
-/*
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-4.c b/20191107/string-ops-4.c
deleted file mode 100644
index dd05111f79e0573d616522593362f6f93beb89e7..0000000000000000000000000000000000000000
--- a/20191107/string-ops-4.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char hello[] = "Hello, world!\n";
-
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-
-  printf ("%s\n", hello + 7);
-  printf ("%zd\n", strlen (hello + 7));
-
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-
-  return 0;
-}
diff --git a/20191107/string-ops-5.c b/20191107/string-ops-5.c
deleted file mode 100644
index 95e826860f223ebd5f3819c56934eedadcd3d0d4..0000000000000000000000000000000000000000
--- a/20191107/string-ops-5.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-6.c b/20191107/string-ops-6.c
deleted file mode 100644
index ce97b816f10df0f72a52aeeb2d0a8fe92be012c5..0000000000000000000000000000000000000000
--- a/20191107/string-ops-6.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  if (anton == anton)
-    printf ("gleich\n");
-  else
-    printf ("ungleich\n");
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-7.c b/20191107/string-ops-7.c
deleted file mode 100644
index ae04c1dd83ba416a3e0aa4053cc4a2e7a50acac2..0000000000000000000000000000000000000000
--- a/20191107/string-ops-7.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char anton2[] = "Anton";
-  if (anton == anton2)
-    printf ("gleich\n");
-  else
-    printf ("ungleich\n");
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-8.c b/20191107/string-ops-8.c
deleted file mode 100644
index 962b294a817a0a6380bc9ba78d2dc9f3198f9f0e..0000000000000000000000000000000000000000
--- a/20191107/string-ops-8.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias = "Zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char *anton2 = "Anton";
-  if (anton == anton2)
-    printf ("gleich\n");
-  else
-    printf ("ungleich\n");
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20191107/string-ops-9.c b/20191107/string-ops-9.c
deleted file mode 100644
index fd8d0190d6c51f19866afee140dbe872af12335d..0000000000000000000000000000000000000000
--- a/20191107/string-ops-9.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *anton = "Anton";
-  char *zacharias1 = "Zacharias";
-  char *zacharias2 = "zacharias";
-
-  printf ("%d\n", strcmp (anton, zacharias1));
-  printf ("%d\n", strcmp (anton, zacharias2));
-
-  return 0;
-}
diff --git a/20191114/Makefile b/20191114/Makefile
deleted file mode 100644
index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000
--- a/20191114/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-%.elf: %.c
-	avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
-
-%.hex: %.elf
-	avr-objcopy -O ihex $< $@
-
-download:
-	./download.sh
diff --git a/20191114/aufgabe-2.c b/20191114/aufgabe-2.c
deleted file mode 100644
index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000
--- a/20191114/aufgabe-2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = pos; i < len; i++)
-    target[i+1] = target[i];
-  target[pos] = src;
-}
-
-int main (void)
-{
-  char test[100] = "Hochshule Bochum";
-  insert_into_string ('c', test, 5);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191114/aufgabe-3.c b/20191114/aufgabe-3.c
deleted file mode 100644
index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000
--- a/20191114/aufgabe-3.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <string.h>
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
diff --git a/20191114/blink-0.c b/20191114/blink-0.c
deleted file mode 100644
index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000
--- a/20191114/blink-0.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-0.hex b/20191114/blink-0.hex
deleted file mode 100644
index 6a05b7db67b71fe56b83474cab2ab278834e3777..0000000000000000000000000000000000000000
--- a/20191114/blink-0.hex
+++ /dev/null
@@ -1,10 +0,0 @@
-:100000000C9434000C943E000C943E000C943E0082
-:100010000C943E000C943E000C943E000C943E0068
-:100020000C943E000C943E000C943E000C943E0058
-:100030000C943E000C943E000C943E000C943E0048
-:100040000C943E000C943E000C943E000C943E0038
-:100050000C943E000C943E000C943E000C943E0028
-:100060000C943E000C943E0011241FBECFEFD8E04C
-:10007000DEBFCDBF0E9440000C9444000C940000F1
-:0C00800080E48AB98BB9FFCFF894FFCF61
-:00000001FF
diff --git a/20191114/blink-0a.c b/20191114/blink-0a.c
deleted file mode 100644
index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000
--- a/20191114/blink-0a.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x00;  /* binär: 0000 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-1.c b/20191114/blink-1.c
deleted file mode 100644
index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000
--- a/20191114/blink-1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD |= 0x01;
-  while (1)
-    {
-      _delay_ms (500);
-      PORTD &= ~0x01;
-      _delay_ms (500);
-      PORTD |= 0x01;
-    }
-  return 0;
-}
diff --git a/20191114/blink-1.hex b/20191114/blink-1.hex
deleted file mode 100644
index 0ec64bca829ff784341305a395818499e1854cdb..0000000000000000000000000000000000000000
--- a/20191114/blink-1.hex
+++ /dev/null
@@ -1,13 +0,0 @@
-:100000000C9434000C943E000C943E000C943E0082
-:100010000C943E000C943E000C943E000C943E0068
-:100020000C943E000C943E000C943E000C943E0058
-:100030000C943E000C943E000C943E000C943E0048
-:100040000C943E000C943E000C943E000C943E0038
-:100050000C943E000C943E000C943E000C943E0028
-:100060000C943E000C943E0011241FBECFEFD8E04C
-:10007000DEBFCDBF0E9440000C9457000C940000DE
-:1000800081E08AB9589A2FEF89E698E121508040A3
-:100090009040E1F700C0000058982FEF89E698E102
-:1000A000215080409040E1F700C00000EBCFF89471
-:0200B000FFCF80
-:00000001FF
diff --git a/20191114/blink-10.c b/20191114/blink-10.c
deleted file mode 100644
index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000
--- a/20191114/blink-10.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191114/blink-11.c b/20191114/blink-11.c
deleted file mode 100644
index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000
--- a/20191114/blink-11.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      _delay_ms (1);
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191114/blink-2.c b/20191114/blink-2.c
deleted file mode 100644
index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000
--- a/20191114/blink-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x02;
-  PORTD = 0x02;
-  while (1)
-    {
-      _delay_ms (250);
-      PORTD ^= 0x02;
-    }
-  return 0;
-}
diff --git a/20191114/blink-3.c b/20191114/blink-3.c
deleted file mode 100644
index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000
--- a/20191114/blink-3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-    }
-  return 0;
-}
diff --git a/20191114/blink-4.c b/20191114/blink-4.c
deleted file mode 100644
index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000
--- a/20191114/blink-4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20191114/blink-5.c b/20191114/blink-5.c
deleted file mode 100644
index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000
--- a/20191114/blink-5.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-6.c b/20191114/blink-6.c
deleted file mode 100644
index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000
--- a/20191114/blink-6.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  static uint8_t counter = 0;
-  if (counter++ == 0)
-    PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-7.c b/20191114/blink-7.c
deleted file mode 100644
index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000
--- a/20191114/blink-7.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-8.c b/20191114/blink-8.c
deleted file mode 100644
index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000
--- a/20191114/blink-8.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xff;   /* binär: 1111 1111 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191114/blink-9.c b/20191114/blink-9.c
deleted file mode 100644
index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000
--- a/20191114/blink-9.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191114/download.sh b/20191114/download.sh
deleted file mode 100755
index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000
--- a/20191114/download.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-port=$(ls -rt /dev/ttyACM* | tail -1)
-echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1)
-avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null
diff --git a/20191114/hp-20191114.pdf b/20191114/hp-20191114.pdf
deleted file mode 100644
index cd78df604182427a7facc842946283f3e827fa07..0000000000000000000000000000000000000000
Binary files a/20191114/hp-20191114.pdf and /dev/null differ
diff --git a/20191114/hp-20191114.tex b/20191114/hp-20191114.tex
deleted file mode 100644
index 4cad8823bfd9c6ae57add9a5bf2829c5c201d053..0000000000000000000000000000000000000000
--- a/20191114/hp-20191114.tex
+++ /dev/null
@@ -1,1294 +0,0 @@
-% hp-20191114.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Bit-Operationen, I/O-Ports
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{14.\ November 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{medgreen}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{orange}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{black}
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{1}
-\section{Einführung in C}
-\setcounter{subsection}{13}
-\subsection{Parameter des Hauptprogramms}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; i < argc; i++)
-        printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; *argv; i++, argv++)
-        printf ("argv[%d] = \"%s\"\n", i, *argv);
-      return 0;
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{String-Operationen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char hello[] = "Hello, world!\n";
-
-      printf ("%s\n", hello);
-      printf ("%zd\n", strlen (hello));
-
-      printf ("%s\n", hello + 7);
-      printf ("%zd\n", strlen (hello + 7));
-
-      hello[5] = 0;
-      printf ("%s\n", hello);
-      printf ("%zd\n", strlen (hello));
-
-      return 0;
-    }
-  \end{lstlisting}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char *anton = "Anton";
-      char *zacharias = "Zacharias";
-
-      printf ("%d\n", strcmp (anton, zacharias));
-      printf ("%d\n", strcmp (zacharias, anton));
-      printf ("%d\n", strcmp (anton, anton));
-
-      char buffer[100] = "Huber ";
-      strcat (buffer, anton);
-      printf ("%s\n", buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(6,2){\begin{minipage}[t]{6cm}
-                \color{red}
-                strcat() prüft nicht die Länge!\\
-                Gefahr: Überschreiben von Speicher
-              \end{minipage}}
-  \end{picture}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char *anton = "Anton";
-      char *zacharias = "Zacharias";
-
-      printf ("%d\n", strcmp (anton, zacharias));
-      printf ("%d\n", strcmp (zacharias, anton));
-      printf ("%d\n", strcmp (anton, anton));
-
-      char buffer[100] = "Huber ";
-      strncat (buffer, anton, 100);
-      printf ("%s\n", buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(6,2){\begin{minipage}[t]{6cm}
-                \color{red}
-                strcat() prüft nicht die Länge!\\
-                Gefahr: Überschreiben von Speicher\\[\medskipamount]
-                strncat() prüft die Länge.
-              \end{minipage}}
-  \end{picture}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char buffer[100] = "";
-      sprintf (buffer, "Die Antwort lautet: %d", 42);
-      printf ("%s\n", buffer);
-
-      char *answer = strstr (buffer, "Antwort");
-      printf ("%s\n", answer);
-      printf ("found at: %zd\n", answer - buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(6,5.7){\begin{minipage}[t]{6cm}
-                  \color{red}
-                  sprintf() prüft nicht die Länge!\\
-                  Gefahr: Überschreiben von Speicher
-                \end{minipage}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      char buffer[100] = "";
-      snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-      printf ("%s\n", buffer);
-
-      char *answer = strstr (buffer, "Antwort");
-      printf ("%s\n", answer);
-      printf ("found at: %zd\n", answer - buffer);
-
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(6,5.7){\begin{minipage}[t]{6cm}
-                  \color{red}
-                  sprintf() prüft nicht die Länge!\\
-                  Gefahr: Überschreiben von Speicher\\[\medskipamount]
-                  snprintf() prüft die Länge.
-                \end{minipage}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-
-  Sprachelemente weitgehend komplett
-
-  \bigskip
-  Es fehlen:
-  \begin{itemize}
-    \item
-      Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile})
-    \item
-      Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()})
-    \arrowitem
-      werden eingeführt, wenn wir sie brauchen
-    \bigskip
-    \item
-      Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen)
-    \arrowitem
-      werden eingeführt, wenn wir sie brauchen, oder:
-    \arrowitem
-      Literatur\\[\smallskipamount]
-      (z.\,B.\ Wikibooks: C-Programmierung,\\
-      Dokumentation zu Compiler und Bibliotheken)
-    \bigskip
-    \item
-      Praxiserfahrung
-    \arrowitem
-      Übung und Praktikum: nur Einstieg
-    \arrowitem
-      selbständig arbeiten
-  \end{itemize}
-\end{frame}
-
-\iffalse
-
-\section{Bibliotheken}
-\subsection{Der Präprozessor}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \lstinline{#include}: %\pause:
-  Text einbinden
-  \begin{itemize}
-%    \pause
-    \item
-      \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header
-%    \pause
-    \item
-      \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header
-  \end{itemize}
-
-  \pause
-  \bigskip
-
-  \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren
-  \begin{itemize}
-    \pause
-    \item
-      Kein Semikolon!
-    \pause
-    \item
-      Berechnungen in Klammern setzen:\\
-      \lstinline{#define VIER (2 + 2)}
-    \pause
-    \item
-      Konvention: Großbuchstaben
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliotheken einbinden}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Inhalt der Header-Datei: externe Deklarationen
-
-%  \pause
-  \smallskip
-  \lstinline{extern int answer (void);}
-
-%  \pause
-  \smallskip
-  \lstinline{extern int printf (__const char *__restrict __format, ...);}
-
-%  \pause
-  \bigskip
-  Funktion wird "`anderswo"' definiert
-  \begin{itemize}
-%    \pause
-    \item
-      separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben
-%    \pause
-    \item
-      Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker}
-%    \pause
-    \item
-      vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\
-%      \pause
-      = Datei \file{libfoo.a} in Standard-Verzeichnis
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliothek verwenden (Beispiel: GTK+)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \lstinline{#include <gtk/gtk.h>}
-    \pause
-    \smallskip
-    \item
-      Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\
-      welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc}
-      übergeben muß\alt<4->{.}{:}
-      \pause
-      \begin{onlyenv}<3>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡pkg-config --cflags --libs gtk+-3.0¿
-          -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-
-          atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1
-          .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/
-          include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc
-          lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf
-          buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I
-          /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu
-          de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk
-          -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib
-          -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk
-          -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai
-          ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject
-          -2.0 -lglib-2.0
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \pause
-    \arrowitem
-      Compiler-Aufruf:
-      \begin{onlyenv}<4>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk-
-          3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp
-          i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g
-          nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu
-          de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa
-          ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.
-          0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in
-          clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/
-          libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l
-          ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux
-          -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0
-          -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix
-          buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-      \begin{onlyenv}<5->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs)
-                 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-  \end{itemize}
-  \pause[6]
-  \begin{picture}(0,0)
-    \color{red}
-    \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}}
-    \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\
-                     \strut u.\,a.\ viele Include-Verzeichnisse:\\
-                     \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}}
-    \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}}
-    \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\
-                      \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      /* Zeichenbefehle */
-      ...
-
-      return FALSE;
-    }
-  
-    ...
-
-    g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\
-      die Funktion \lstinline{draw} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}}
-    \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\
-                    \strut Bildschirm, auf den\\
-                    \strut gezeichnet werden soll}}}
-    \pause
-    \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}}
-    \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\
-                    \strut für draw(), typischerweise\\
-                    \strut ein Zeiger auf ein struct}}}
-    \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean timer (GtkWidget *widget)
-    {
-      /* Rechenbefehle */
-      ...
-
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-  
-    ...
-
-    g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft nach 50 Millisekunden
-      die Funktion \lstinline{timer} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\
-                    \strut neu gezeichnet werden.}}}
-    \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}}
-    \pause
-    \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}}
-    \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\
-                    \strut die Funktion erneut aufgerufen werden.}}}
-    \pause
-    \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}}
-    \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\
-                    \strut eines Zeigers (später)}}}
-  \end{picture}
-
-\end{frame}
-
-\setcounter{section}{4}
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-%\begin{frame}[fragile]
-%
-%  \showsection
-%  \showsubsection
-%
-%  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-%
-%  \begin{center}
-%    \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg}
-%  \end{center}
-%
-%\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \strut\hfill
-  \begin{minipage}{2.5cm}
-    \vspace*{0.6cm}
-    \begin{align*}
-      x'(t) &= v_x(t) \\[0.65cm]
-      y'(t) &= v_y(t) \\[0.75cm]
-      v_x'(t) &= 0 \\[0.65cm]
-      v_y'(t) &= -g
-    \end{align*}
-    \vspace*{0.0cm}
-  \end{minipage}%
-  \only<1>{\hspace*{9.49cm}}\strut
-  \only<2->{\hfill$\Rightarrow$\hfill}%
-  \begin{onlyenv}<2-8>
-    \begin{minipage}{8.3cm}
-      \begin{align*}
-        x(t) &= \int v_x(t)\,dt
-          \visible<4->{= \int v_{0x}\,dt}
-          \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount]
-        y(t) &= \int v_y(t)\,dt
-          \visible<7->{= \int v_{0y} - g\cdot t\,dt}
-          \visible<8->{= y_0 + v_{0y}\cdot t
-                         - {\textstyle\frac12}gt^2}\\[\bigskipamount]
-        v_x(t) &= \int 0\,dt
-          \visible<3->{= v_{0x}} \\[\medskipamount]
-        v_y(t) &= \int -g\,dt
-          \visible<6->{= v_{0y} - g\cdot t}
-      \end{align*}
-    \end{minipage}%
-  \end{onlyenv}%
-  \begin{onlyenv}<9->
-    \begin{minipage}{3.5cm}
-      \vspace*{0.5cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡x += vx * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡y += vy * dt;¿
-      \end{lstlisting}
-      \vspace{0.90cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vx += 0 * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vy += -g * dt;¿
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{5.13cm}
-      Siehe: \file{gtk-13.c}
-    \end{minipage}
-  \end{onlyenv}%
-  \hfill\strut
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \medskip
-
-  \textbf{Beispiel 2: Mathematisches Pendel}
-
-  \vspace*{-2\bigskipamount}
-
-  \begin{picture}(0,0)
-    \put(8,-6.5){\includegraphics{pendulum.pdf}}
-  \end{picture}
-
-  \begin{eqnarray*}
-    \varphi'(t) &=& \omega(t) \\[\smallskipamount]
-    \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm}
-  \end{eqnarray*}
-  \vspace*{-1.5\medskipamount}
-  \begin{itemize}
-    \item
-      Von Hand (analytisch):\\
-      Lösung raten (Ansatz), Parameter berechnen
-    \item
-      Mit Computer (numerisch):\\
-      Eulersches Polygonzugverfahren
-  \end{itemize}
-  \smallskip
-  \begin{lstlisting}[gobble=0]
-    phi += dt * omega;
-    omega += - dt * g / l * sin (phi);
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  \textbf{Beispiel 3: Weltraum-Simulation}
-
-  Praktikumsaufgabe
-  \vspace*{-1cm}
-
-\end{frame}
-
-\iffalse
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\setcounter{subsection}{3}
-\subsection{Projekt organisieren: make}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \begin{itemize}
-    \item
-      \only<4->{explizite und implizite} Regeln
-      \begin{onlyenv}<2>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          philosophy: philosophy.o answer.o
-                  gcc philosophy.o answer.o -o philosophy
-
-          answer.o: answer.c answer.h
-                  gcc -Wall -O answer.c -c
-
-          philosophy.o: philosophy.c answer.h
-                  gcc -Wall -O philosophy.c -c
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<4>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = philosophy
-          OBJECTS = philosophy.o answer.o
-          HEADERS = answer.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          %.o: %.c $(HEADERS)
-                  gcc $(CFLAGS) $< -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-      \end{onlyenv}
-    \item
-      Makros
-      \begin{onlyenv}<3>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = philosophy
-          OBJECTS = philosophy.o answer.o
-          HEADERS = answer.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          answer.o: answer.c $(HEADERS)
-                  gcc $(CFLAGS) answer.c -c
-
-          philosophy.o: philosophy.c $(HEADERS)
-                  gcc $(CFLAGS) philosophy.c -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \begin{onlyenv}<5->
-      \smallskip
-      \arrowitem
-        3 Sprachen: C, Präprozessor, make
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \color{medgreen}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \color{red}
-        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Differentialgleichungen
-        \color{black}
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{\dots}]
-%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-%    \item[\textbf{5}] \textbf{Algorithmen}
-%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.10] Zeiger
-        \color{medgreen}
-        \item[2.11] Arrays und Strings
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \color{red}
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-%      \begin{itemize}
-%        \color{red}
-%        \item[3.1] Der Präprozessor
-%        \item[3.2] Bibliotheken einbinden
-%        \item[3.3] Bibliotheken verwenden
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-%%        \item[3.4] Projekt organisieren: make
-%      \end{itemize}
-%    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{black}
-        \item[4.3] Interrupts
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\subsection{Bit-Operationen}
-\subsubsection{Zahlensysteme}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \vspace*{-\smallskipamount}
-  \showsubsection
-  \vspace*{-\medskipamount}
-  \showsubsubsection
-
-  \begin{tabular}{rlrl}
-    Basis & Name & Beispiel & Anwendung \\[\smallskipamount]
-      2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\
-      8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\
-     10 & Dezimalsystem & \lstinline,259, & Alltag \\
-     16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\
-    256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4)
-  \end{tabular}
-
-  \bigskip
-
-  \begin{itemize}
-    \item
-      Computer rechnen im Binärsystem.
-    \item
-      Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\
-      Bits in Zahlen einzeln ansprechen zu können.
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{rlrlrc}
-    \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\
-           001 & \bf 1                 & 0001 & \bf 1 &       1001 & \bf 9\\
-           010 & \bf 2                 & 0010 & \bf 2 &       1010 & \bf A\\
-           011 & \bf 3                 & 0011 & \bf 3 &       1011 & \bf B\\[\smallskipamount]
-           100 & \bf 4                 & 0100 & \bf 4 &       1100 & \bf C\\
-           101 & \bf 5                 & 0101 & \bf 5 &       1101 & \bf D\\
-           110 & \bf 6                 & 0110 & \bf 6 &       1110 & \bf E\\
-           111 & \bf 7                 & 0111 & \bf 7 &       1111 & \bf F\\
-  \end{tabular}
-
-  \medskip
-
-  \begin{itemize}
-    \item
-      Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\
-      in Binär-Zahlen umrechnen.
-    \item
-      Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 4 Bits.
-    \item
-      Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 3 Bits.
-    \item
-      Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\
-      die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen.
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Bit-Operationen in C}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{lll}
-    C-Operator     & Verknüpfung              & Anwendung                \\[\smallskipamount]
-    \lstinline,&,  & Und                      & Bits gezielt löschen     \\
-    \lstinline,|,  & Oder                     & Bits gezielt setzen      \\
-    \lstinline,^,  & Exklusiv-Oder            & Bits gezielt invertieren \\
-    \lstinline,~,  & Nicht                    & Alle Bits invertieren    \\[\smallskipamount]
-    \lstinline,<<, & Verschiebung nach links  & Maske generieren         \\
-    \lstinline,>>, & Verschiebung nach rechts & Bits isolieren
-  \end{tabular}
-
-  \bigskip
-
-  Numerierung der Bits: von rechts ab 0
-
-  \medskip
-
-  \begin{tabular}{ll}
-    Bit Nr.\ 3 auf 1 setzen: &
-    \lstinline,a |= 1 << 3;, \\
-    Bit Nr.\ 4 auf 0 setzen: &
-    \lstinline,a &= ~(1 << 4);, \\
-    Bit Nr.\ 0 invertieren: &
-    \lstinline,a ^= 1 << 0;,
-  \end{tabular}
-
-  \smallskip
-
-  ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad
-  \lstinline{if (a & (1 << 1))}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  C-Datentypen für Bit-Operationen:
-  \smallskip\par
-  \lstinline{#include <stdint.h>}
-  \medskip\par
-  \begin{tabular}{lllll}
-                    & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\
-    mit Vorzeichen  & \lstinline,int8_t,
-                    & \lstinline,int16_t,
-                    & \lstinline,int32_t,
-                    & \lstinline,int64_t, \\
-    ohne Vorzeichen & \lstinline,uint8_t,
-                    & \lstinline,uint16_t,
-                    & \lstinline,uint32_t,
-                    & \lstinline,uint64_t,
-  \end{tabular}
-
-  \bigskip
-  \bigskip
-
-  Ausgabe:
-  \smallskip\par
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-    #include <inttypes.h>
-    ...
-    uint64_t x = 42;
-    printf ("Die Antwort lautet: %" PRIu64 "\n", x);
-  \end{lstlisting}
-
-\iffalse
-
-  \bigskip
-
-  Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.
-
-  \smallskip
-
-  \begin{tabular}[t]{ll}
-    \lstinline|void set_bit (int i);|   & Bei Index $i$ auf 1 setzen \\
-    \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\
-    \lstinline|int get_bit (int i);|    & Bei Index $i$ lesen
-  \end{tabular}
-
-  \medskip
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen.
-    \item
-      Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen.
-    \item
-      Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|).
-  \end{itemize}
-
-\fi
-
-\end{frame}
-
-\subsection{I/O-Ports}
-
-\begin{frame}[fragile]
-
-%  \showsection
-  \showsubsection
-  \vspace*{-1.5\medskipamount}
-  {\large\textbf{\color{structure}4.3\quad Interrupts}}
-
-  \bigskip
-
-  Kommunikation mit externen Geräten
-
-  \bigskip
-
-  \begin{center}
-    \includegraphics{io-ports-and-interrupts.pdf}
-  \end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  In Output-Port schreiben = Aktoren ansteuern
-
-  Beispiel: LED
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0x70;
-    PORTC = 0x40;
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 0111\,0000\\
-                binär: 0100\,0000
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Aus Input-Port lesen = Sensoren abfragen
-
-  Beispiel: Taster
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0xfd;
-    while ((PINC & 0x02) == 0)
-      ; /* just wait */
-  \end{lstlisting}
-  \begin{picture}(0,0)(-1.5,-0.42)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 1111\,1101\\
-                binär: 0000\,0010
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-  
-  \bigskip
-
-  Praktikumsaufgabe: Druckknopfampel
-
-\end{frame}
-
-\iffalse
-
-\subsection{Interrupts}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: eingebaute Uhr\hfill
-  \makebox(0,0)[tr]{%
-    \only<2->{\begin{minipage}[t]{4.7cm}
-        \vspace*{-0.3cm}%
-        statt Zählschleife (\lstinline{_delay_ms}):\\
-        Hauptprogramm kann\\
-        andere Dinge tun
-      \end{minipage}}%
-    }
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-
-    ...
-
-
-    ISR (TIMER0B_COMP_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}}
-    \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}}
-    \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}}
-    \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}}
-  \end{picture}
-
-  Initialisierung über spezielle Ports:
-  \lstinline{TCCR0B}, \lstinline{TIMSK0}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster\hfill
-  \makebox(0,0)[tr]{%
-    \begin{minipage}[t]{4.7cm}
-      \vspace*{-0.3cm}%
-      statt \newterm{Busy Waiting\/}:\\
-      Hauptprogramm kann\\
-      andere Dinge tun
-    \end{minipage}}
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-    ...
-
-    ISR (INT0_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-
-  \medskip
-
-  Initialisierung über spezielle Ports:
-  \lstinline{EICRA}, \lstinline{EIMSK}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\fi
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-%      \begin{itemize}
-%        \color{red}
-%        \item[3.1] Der Präprozessor
-%        \item[3.2] Bibliotheken einbinden
-%        \item[3.3] Bibliotheken verwenden
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-%%        \item[3.4] Projekt organisieren: make
-%      \end{itemize}
-%    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{red}
-        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20191114/hp-musterloesung-20191114.pdf b/20191114/hp-musterloesung-20191114.pdf
deleted file mode 100644
index af99bb1a2c107607b1fc0dc1b2e76625b11bdd55..0000000000000000000000000000000000000000
Binary files a/20191114/hp-musterloesung-20191114.pdf and /dev/null differ
diff --git a/20191114/hp-musterloesung-20191114.tex b/20191114/hp-musterloesung-20191114.tex
deleted file mode 100644
index 8016731a8ae9665900c62f1337115e35150b8d4b..0000000000000000000000000000000000000000
--- a/20191114/hp-musterloesung-20191114.tex
+++ /dev/null
@@ -1,458 +0,0 @@
-% hp-musterloesung-20191114.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 14.\ November 2019}
-
-  \exercise{Ausgabe von Hexadezimalzahlen}
-
-  Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)},
-  die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x}
-  als Hexadezimalzahl ausgibt.
-  (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.)
-
-  Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit
-  der Formatspezifikation \lstinline{%x} als fertige Lösung,
-  sondern programmieren Sie die nötige Ausgabe selbst.
-  (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.)
-
-  Die Verwendung von \lstinline{printf()}
-  mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d}
-  oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig.
-
-  \points{8}
-
-  (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht,
-  aber nicht zwingend.)
-
-  \solution
-
-  Um die Ziffern von \lstinline{x} zur Basis 16 zu isolieren,
-  berechnen wir \lstinline{x % 16} (modulo 16 = Rest bei Division durch 16)
-  und dividieren anschließend \lstinline{x} durch 16,
-  solange bis \lstinline{x} den Wert 0 erreicht.
-
-  Wenn wir die auf diese Weise ermittelten Ziffern direkt ausgeben,
-  sind sie \emph{Little-Endian}, erscheinen also in umgekehrter Reihenfolge.
-  Die Datei \gitfile{hp}{20191114}{loesung-1-1.c} setzt diesen Zwischenschritt um.
-
-  Die Ausgabe der Ziffern erfolgt in \gitfile{hp}{20191114}{loesung-1-1.c}
-  über \lstinline{printf ("%d")}
-  für die Ziffern 0 bis 9. Für die darüberliegenden Ziffern
-  wird der Buchstabe \lstinline{a} um die Ziffer abzüglich 10 inkrementiert
-  und der erhaltene Wert mit \lstinline{printf ("%c")} als Zeichen ausgegeben.
-
-  Um die umgekehrte Reihenfolge zu beheben,
-  speichern wir die Ziffern von \lstinline{x}
-  in einem Array \lstinline{digits[]} zwischen
-  und geben sie anschließend in einer zweiten Schleife
-  in umgekehrter Reihenfolge aus (siehe \gitfile{hp}{20191114}{loesung-1-2.c}).
-  Da wir wissen, daß \lstinline{x} eine 32-Bit-Zahl ist
-  und daher höchstens 8 Hexadezimalziffern haben kann,
-  ist 8 eine sinnvolle Länge für das Ziffern-Array \lstinline{digits[8]}.
-
-  Nun sind die Ziffern in der richtigen Reihenfolge,
-  aber wir erhalten zusätzlich zu den eigentlichen Ziffern führende Nullen.
-  Da in der Aufgabenstellung nicht von führenden Nullen die Rede war,
-  sind diese nicht verboten; \gitfile{hp}{20191114}{loesung-1-2.c} ist daher
-  eine richtige Lösung der Aufgabe.
-
-  \breath
-
-  Wenn wir die führenden Nullen vermeiden wollen,
-  können wir die \lstinline{for}-Schleifen durch \lstinline{while}-Schleifen ersetzen.
-  Die erste Schleife zählt hoch, solange \lstinline{x} ungleich 0 ist;
-  die zweite zählt von dem erreichten Wert aus wieder herunter
-  -- siehe \gitfile{hp}{20191114}{loesung-1-3.c}.
-  Da wir wissen, daß die Zahl \lstinline{x} höchstens 32 Bit,
-  also höchstens 8 Hexadezimalziffern hat,
-  wissen wir, daß \lstinline{i} höchstens den Wert 8 erreichen kann,
-  das Array also nicht überlaufen wird.
-
-  Man beachte, daß der Array-Index nach der ersten Schleife "`um einen zu hoch"' ist.
-  In der zweiten Schleife muß daher \emph{zuerst\/} der Index dekrementiert werden.
-  Erst danach darf ein Zugriff auf \lstinline{digit[i]} erfolgen.
-
-  \breath
-
-  Alternativ können wir auch mitschreiben,
-  ob bereits eine Ziffer ungleich Null ausgegeben wurde,
-  und andernfalls die Ausgabe von Null-Ziffern unterdrücken
-  -- siehe \gitfile{hp}{20191114}{loesung-1-4.c}.
-
-  \breath
-
-  Weitere Möglichkeiten ergeben sich, wenn man bedenkt,
-  daß eine Hexadezimalziffer genau einer Gruppe von vier Binärziffern entspricht.
-  Eine Bitverschiebung um 4 nach rechts
-  ist daher dasselbe wie eine Division durch 16,
-  und eine Und-Verknüpfung mit 15$_{10}$ = f$_{16}$ = 1111$_2$
-  ist dasselbe wie die Operation Modulo 16.
-  Die Datei \gitfile{hp}{20191114}{loesung-1-5.c} ist eine in dieser Weise abgewandelte Variante
-  von \gitfile{hp}{20191114}{loesung-1-3.c}.
-
-  Mit dieser Methode kann man nicht nur auf die jeweils unterste Ziffer,
-  sondern auf alle Ziffern direkt zugreifen.
-  Damit ist kein Array als zusätzlicher Speicher mehr nötig.
-  Die Datei \gitfile{hp}{20191114}{loesung-1-6.c} setzt dies auf einfache Weise um.
-  Sie gibt wieder führende Nullen mit aus,
-  ist aber trotzdem eine weitere richtige Lösung der Aufgabe.
-
-  Die führenden Nullen ließen sich auf die gleiche Weise vermeiden
-  wie in \gitfile{hp}{20191114}{loesung-1-4.c}.
-
-  Die Bitverschiebungsmethode hat den Vorteil,
-  daß kein zusätzliches Array benötigt wird.
-  Auch wird die als Parameter übergebene Zahl \lstinline{x} nicht verändert,
-  was bei größeren Zahlen, die über Zeiger übergeben werden, von Vorteil sein kann.
-  Demgegenüber steht der Nachteil,
-  daß diese Methode nur für eine ganze Anzahl von Bits funktioniert,
-  also für Basen, die Zweierpotenzen sind (z.\,B.\ 2, 8, 16, 256).
-  Für alle anderen Basen (z.\,B.\ 10) eignet sich nur die Methode
-  mit Division und Modulo-Operation.
-
-  \exercise{Einfügen in Strings}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20191114}{aufgabe-2.c}):
-%  \begin{lstlisting}[style=numbered]
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    void insert_into_string (char src, char *target, int pos)
-    {
-      int len = strlen (target);
-      for (int i = pos; i < len; i++)
-        target[i+1] = target[i];
-      target[pos] = src;
-    }
-
-    int main (void)
-    {
-      char test[100] = "Hochshule Bochum";
-      insert_into_string ('c', test, 5);
-      printf ("%s\n", test);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe des Programms lautet:
-  \lstinline[style=terminal]{Hochschhhhhhhhhhh}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie, wie die Ausgabe zustandekommt.
-      \points{3}
-%      \workspace{12}
-    \item
-      Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
-      daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos}
-      in den String \lstinline{target} einfügt.\par
-      Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.
-      \points{2}
-%      \workspace{13}
-    \item
-      Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char test[] = "Hochshule Bochum";} ersetzen?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{10}
-    \item
-      Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char *test = "Hochshule Bochum";} ersetzen?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{10}
-%    \item
-%      Schreiben Sie eine Funktion
-%      \lstinline{void insert_into_string_sorted (char src, char *target)},
-%      die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist
-%      und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle
-%      einfügt. Diese Funktion darf die bereits vorhandene Funktion
-%      \lstinline|insert_into_string()| aufrufen.\\
-%      \points{4}\par
-%      Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm:
-%      \begin{lstlisting}[gobble=8]
-%        char test[100] = "";
-%        insert_into_string_sorted ('c', test);
-%        insert_into_string_sorted ('a', test);
-%        insert_into_string_sorted ('d', test);
-%        insert_into_string_sorted ('b', test);
-%      \end{lstlisting}
-%      Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten.
-%      \workspace{14}
-%    \item
-%      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
-%      arbeitet Ihre Funktion
-%      \lstinline{void insert_into_string_sorted (char src, char *target)}
-%      und warum?
-%      \points{1}
-%      \workspace{10}
-%    \item
-%      Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\
-%      \lstinline{void insert_into_string_sorted (char src, char *target)}
-%      so gestalten kann,\\
-%      daß sie in $\mathcal{O}(\log n)$ arbeitet.
-%      \points{3}
-%      \workspace{35}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie, wie die Ausgabe zustandekommt.}
-
-      In der Schleife wird \emph{zuerst\/} der nächste Buchstabe \lstinline{target[i + 1]}
-      gleich dem aktuellen gesetzt
-      und \emph{danach\/} der Zähler \lstinline{i} erhöht.
-      Dadurch wird im nächsten Schleifendurchlauf der bereits verschobene Buchstabe
-      noch weiter geschoben und letztlich alle Buchstaben in \lstinline{target[]}
-      durch den an der Stelle \lstinline{pos} ersetzt.
-
-    \item
-      \textbf{Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
-      daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos}
-      in den String \lstinline{target} einfügt.}\par
-      \textbf{Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.}
-
-      Um im String "`Platz zu schaffen"', muß man von hinten beginnen,
-      also die Schleife umdrehen\\
-      (siehe: \gitfile{hp}{20191114}{loesung-2.c}):
-      \begin{lstlisting}{gobble=8}
-        for (int i = len; i >= pos; i--)
-          target[i + 1] = target[i];
-      \end{lstlisting}
-
-    \item
-      \textbf{Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char test[] = "Hochshule Bochum";}
-      ersetzen und warum?}
-
-      Die Schreibweise \lstinline{test[]} bedeutet,
-      daß der Compiler selbst zählt, wieviel Speicherplatz der String benötigt,
-      un dann genau die richtige Menge Speicher reserviert
-      (anstatt, wie wir es manuell getan haben, pauschal Platz für 100 Zeichen).
-
-      Wenn wir nun in den String ein zusätzliches Zeichen einfügen,
-      ist dafür kein Speicherplatz reserviert worden,
-      und wir \textbf{überschreiben} dann Speicher, an dem sich andere Variable befinden,
-      was zu einem \textbf{Absturz} führen kann.
-
-      Da wir hier nur ein einziges Zeichen schreiben,
-      wird dieser Fehler nicht sofort auffallen.
-      Dies ist schlimmer, als wenn das Programm direkt beim ersten Test abstürzt,
-      denn dadurch entsteht bei uns der Eindruck, es sei in Ordnung.
-      Wenn danach der Fehler in einer Produktivumgebung auftritt,
-      kann dadurch Schaden entstehen -- je nach Einsatzgebiet der Software
-      u.\,U.\ erheblicher Vermögens-, Sach- und/oder Personenschaden
-      (z.\,B.\ Absturz eines Raumflugkörpers).
-
-    \item
-      \textbf{Was kann passieren, wenn Sie 
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char *test = "Hochshule Bochum";}
-      ersetzen und warum?}
-
-      In diesem Fall wird der Speicher für den eigentlichen String
-      in einem unbenannten, \textbf{nicht schreibbaren} Teil des Speichers reserviert.
-      Unser Versuch, dorthin ein zusätzliches Zeichen zu schreiben,
-      fürt dann normalerweise zu einem \textbf{Absturz}.
-
-      In manchen Systemen (Betriebssystem, Compiler, \dots)
-      ist der Speicherbereich tatsächlich sehr wohl schreibbar.
-      In diesem Fall tritt der Absturz nicht immer und nicht immer sofort auf --
-      genau wie in Aufgabenteil (c).
-     
-  \end{enumerate}
-
-  \exercise{Länge von Strings}
-
-  Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Beispiel: \lstinline{char *hello_world = "Hello, world!\n"}
-
-  Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\
-  zur Verfügung (\lstinline{#include <string.h>}).
-
-  \begin{itemize}
-    \item[(a)]
-      Auf welche Weise ist die Länge eines Strings gekennzeichnet?
-      \points{1}
-    \item[(b)]
-      Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?\\
-      \points{2}
-    \item[(c)]
-      Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.\\
-      \points{3}
-  \end{itemize}
-
-  Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20191114}{aufgabe-3.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s)
-        {
-          int x = 0;
-          for (int i = 0; i < strlen (s); i++)
-            x += s[i];
-          return x;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{6cm}
-      \vspace*{-1cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_2 (char *s)
-        {
-          int i = 0, x = 0;
-          int len = strlen (s);
-          while (i < len)
-            x += s[i++];
-          return x;
-        }
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{minipage}
-  \end{center}
-  \begin{itemize}
-    \item[(d)]
-      Was bewirken die beiden Funktionen?
-      \points{2}
-    \item[(e)]
-%      Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum?
-%      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.
-%       \points 3
-%    \item[(f)]
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\
-      nur effizienter.
-      \points{4}
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?}
-
-      Ein String ist ein Array von \lstinline{char}s.
-      Nach den eigentlichen Zeichen des Strings enthält das Array
-      \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0,
-      nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung.
-      Die Länge eines Strings ist die Anzahl der Zeichen
-      \emph{vor\/} diesem Symbol.
-
-    \item[(b)]
-      {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?}
-
-      Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen;
-      das Null-Symbol, das das Ende markiert, zählt hier nicht mit)
-      und belegt Speicherplatz für 15 Zeichen
-      (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung).
-
-    \item[(c)]
-      \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.}
-
-      Siehe die Dateien \gitfile{hp}{20191114}{loesung-3c-1.c} (mit Array-Index)
-      und \gitfile{hp}{20191114}{loesung-3c-2.c} (mit Zeiger-Arithmetik).
-      Beide Lösungen sind korrekt und arbeiten gleich schnell.
-
-      Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"}
-      kann normalerweise ignoriert werden;
-      auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()}
-      beim Linken Vorrang vor der selbstgeschriebenen,
-      so daß die selbstgeschriebene Funktion nie aufgerufen wird.
-      In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion
-      anders zu nennen (z.\,B.\ \lstinline{my_strlen()}).
-
-    \item[(d)]
-      \textbf{Was bewirken die beiden Funktionen?}
-
-      Beide addieren die Zahlenwerte der im String enthaltenen Zeichen
-      und geben die Summe als Funktionsergebnis zurück.
-
-      Im Falle des Test-Strings \lstinline{"Hello, world!\n"}
-      lautet der Rückgabewert 1171 (siehe \gitfile{hp}{20191114}{loesung-3d-1.c} und \gitfile{hp}{20191114}{loesung-3d-2.c}).
-
-    \item[(e)]
-%      \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum?
-%      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.}
-%
-%      Vorüberlegung: \lstinline{strlen()} greift in einer Schleife
-%      auf alle Zeichen des Strings der Länge $n$ zu,
-%      hat also $\mathcal{O}(n)$.
-%
-%      \lstinline{fun_1()} ruft in jedem Schleifendurchlauf
-%      (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf
-%      und greift anschließend auf ein Zeichen des Strings zu,
-%      hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$.
-%
-%      \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf
-%      und greift anschließend in einer Schleife auf alle Zeichen des Strings zu,
-%      hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$.
-%
-%    \item[(f)]
-      \textbf{Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},
-      nur effizienter.}
-
-      Die Funktion wird effizienter,
-      wenn man auf den Aufruf von \lstinline{strlen()} verzichtet
-      und stattdessen die Ende-Prüfung in derselben Schleife vornimmt,
-      in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert.
-
-      Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{20191114}{loesung-3e-1.c}
-      realisiert dies mit einem Array-Index,
-      Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{20191114}{loesung-3e-2.c}
-      mit Zeiger-Arithmetik.
-      Beide Lösungen sind korrekt und arbeiten gleich schnell.
-
-%      \textbf{Bemerkung:} Die effizientere Version der Funktion
-%      arbeitet doppelt so schnell wie die ursprüngliche,
-%      hat aber ebenfalls die Ordnung $\mathcal{O}(n)$.
-
-  \end{itemize}
-
-\end{document}
diff --git a/20191114/hp-uebung-20191114.pdf b/20191114/hp-uebung-20191114.pdf
deleted file mode 100644
index f1529ea50e423d307ecb8dc12b510aa559ec5a9f..0000000000000000000000000000000000000000
Binary files a/20191114/hp-uebung-20191114.pdf and /dev/null differ
diff --git a/20191114/hp-uebung-20191114.tex b/20191114/hp-uebung-20191114.tex
deleted file mode 100644
index 9cbbf90fce149850f2334fd2356922295df5b498..0000000000000000000000000000000000000000
--- a/20191114/hp-uebung-20191114.tex
+++ /dev/null
@@ -1,227 +0,0 @@
-% hp-uebung-20191114.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 14.\ November 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 80 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  14 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Ausgabe von Hexadezimalzahlen}
-
-  Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)},
-  die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x}
-  als Hexadezimalzahl ausgibt.
-  (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.)
-
-  Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit
-  der Formatspezifikation \lstinline{%x} als fertige Lösung,
-  sondern programmieren Sie die nötige Ausgabe selbst.
-  (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.)
-
-  Die Verwendung von \lstinline{printf()}
-  mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d}
-  oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig.
-
-  \points{8}
-
-  (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht,
-  aber nicht zwingend.)
-
-  \exercise{Einfügen in Strings}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20191114}{aufgabe-2.c}):
-%  \begin{lstlisting}[style=numbered]
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    void insert_into_string (char src, char *target, int pos)
-    {
-      int len = strlen (target);
-      for (int i = pos; i < len; i++)
-        target[i+1] = target[i];
-      target[pos] = src;
-    }
-
-    int main (void)
-    {
-      char test[100] = "Hochshule Bochum";
-      insert_into_string ('c', test, 5);
-      printf ("%s\n", test);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe des Programms lautet:
-  \lstinline[style=terminal]{Hochschhhhhhhhhhh}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie, wie die Ausgabe zustandekommt.
-      \points{3}
-%      \workspace{12}
-    \item
-      Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
-      daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos}
-      in den String \lstinline{target} einfügt.\par
-      Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.
-      \points{2}
-%      \workspace{13}
-    \item
-      Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char test[] = "Hochshule Bochum";} ersetzen?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{10}
-    \item
-      Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char *test = "Hochshule Bochum";} ersetzen?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{10}
-%    \item
-%      Schreiben Sie eine Funktion
-%      \lstinline{void insert_into_string_sorted (char src, char *target)},
-%      die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist
-%      und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle
-%      einfügt. Diese Funktion darf die bereits vorhandene Funktion
-%      \lstinline|insert_into_string()| aufrufen.\\
-%      \points{4}\par
-%      Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm:
-%      \begin{lstlisting}[gobble=8]
-%        char test[100] = "";
-%        insert_into_string_sorted ('c', test);
-%        insert_into_string_sorted ('a', test);
-%        insert_into_string_sorted ('d', test);
-%        insert_into_string_sorted ('b', test);
-%      \end{lstlisting}
-%      Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten.
-%      \workspace{14}
-%    \item
-%      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
-%      arbeitet Ihre Funktion
-%      \lstinline{void insert_into_string_sorted (char src, char *target)}
-%      und warum?
-%      \points{1}
-%      \workspace{10}
-%    \item
-%      Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\
-%      \lstinline{void insert_into_string_sorted (char src, char *target)}
-%      so gestalten kann,\\
-%      daß sie in $\mathcal{O}(\log n)$ arbeitet.
-%      \points{3}
-%      \workspace{35}
-  \end{enumerate}
-
-  \exercise{Länge von Strings}
-
-  Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Beispiel: \lstinline{char *hello_world = "Hello, world!\n"}
-
-  Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\
-  zur Verfügung (\lstinline{#include <string.h>}).
-
-  \begin{itemize}
-    \item[(a)]
-      Auf welche Weise ist die Länge eines Strings gekennzeichnet?
-      \points{1}
-    \item[(b)]
-      Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?\\
-      \points{2}
-    \item[(c)]
-      Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.\\
-      \points{3}
-  \end{itemize}
-
-  Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20191114}{aufgabe-3.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s)
-        {
-          int x = 0;
-          for (int i = 0; i < strlen (s); i++)
-            x += s[i];
-          return x;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{6cm}
-      \vspace*{-1cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_2 (char *s)
-        {
-          int i = 0, x = 0;
-          int len = strlen (s);
-          while (i < len)
-            x += s[i++];
-          return x;
-        }
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{minipage}
-  \end{center}
-  \begin{itemize}
-    \item[(d)]
-      Was bewirken die beiden Funktionen?
-      \points{2}
-    \item[(e)]
-%      Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum?
-%      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.
-%       \points 3
-%    \item[(f)]
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\
-      nur effizienter.
-      \points{4}
-  \end{itemize}
-
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191114/io-ports-and-interrupts.pdf b/20191114/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20191114/io-ports-and-interrupts.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/io-ports-and-interrupts.pdf
\ No newline at end of file
diff --git a/20191114/loesung-1-1.c b/20191114/loesung-1-1.c
deleted file mode 100644
index 98b2f03f19d21aa2a794fef1f3f98feff95f5142..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-1.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  while (x)
-    {
-      int digit = x % 16;
-      if (digit < 10)
-        printf ("%d", digit);
-      else
-        printf ("%c", 'a' + digit - 10);
-      x /= 16;
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-1-2.c b/20191114/loesung-1-2.c
deleted file mode 100644
index 35aa3b3aea6fc8faaa55c7d5382f0a8de9282aee..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  char digit[8];
-  for (int i = 0; i < 8; i++)
-    {
-      digit[i] = x % 16;
-      x /= 16;
-    }
-  for (int i = 7; i >= 0; i--)
-    {
-      if (digit[i] < 10)
-        printf ("%d", digit[i]);
-      else
-        printf ("%c", 'a' + digit[i] - 10);
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-1-3.c b/20191114/loesung-1-3.c
deleted file mode 100644
index 2462f2b537896722d8d1774a5d47f374ee5ef7fa..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-3.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  char digit[8];
-  int i = 0;
-  while (x)
-    {
-      digit[i] = x % 16;
-      x /= 16;
-      i++;
-    }
-  while (i > 0)
-    {
-      i--;
-      if (digit[i] < 10)
-        printf ("%d", digit[i]);
-      else
-        printf ("%c", 'a' + digit[i] - 10);
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-1-4.c b/20191114/loesung-1-4.c
deleted file mode 100644
index 5083dcb865c86beafd43ce3e8837510b13cbe850..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-4.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  char digit[8];
-  for (int i = 0; i < 8; i++)
-    {
-      digit[i] = x % 16;
-      x /= 16;
-    }
-  int printing = 0;
-  for (int i = 7; i >= 0; i--)
-    {
-      if (printing || digit[i] != 0)
-        {
-          printing = 1;
-          if (digit[i] < 10)
-            printf ("%d", digit[i]);
-          else
-            printf ("%c", 'a' + digit[i] - 10);
-        }
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-1-5.c b/20191114/loesung-1-5.c
deleted file mode 100644
index e3446edb4a40348ac14da420f344c208f8916f7e..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-5.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  char digit[8];
-  int i = 0;
-  while (x)
-    {
-      digit[i] = x & 0x0000000f;
-      x >>= 4;
-      i++;
-    }
-  while (i > 0)
-    {
-      i--;
-      if (digit[i] < 10)
-        printf ("%d", digit[i]);
-      else
-        printf ("%c", 'a' + digit[i] - 10);
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-1-6.c b/20191114/loesung-1-6.c
deleted file mode 100644
index 7b8e8e1a9d7285b8a1e02ff1a91310f1dc02ed5b..0000000000000000000000000000000000000000
--- a/20191114/loesung-1-6.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void print_hex (uint32_t x)
-{
-  int i = 32;
-  while (i > 0)
-    {
-      i -= 4;
-      int digit = (x >> i) & 0x0000000f;
-      if (digit < 10)
-        printf ("%d", digit);
-      else
-        printf ("%c", 'a' + digit - 10);
-    }
-}
-
-int main (void)
-{
-  print_hex (0xcafe42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20191114/loesung-2.c b/20191114/loesung-2.c
deleted file mode 100644
index 85abfcf3e1e4bacf454acd10f6832b757a64ac35..0000000000000000000000000000000000000000
--- a/20191114/loesung-2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-int main (void)
-{
-  char test[100] = "Hochshule Bochum";
-  insert_into_string ('c', test, 5);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191114/loesung-3c-1.c b/20191114/loesung-3c-1.c
deleted file mode 100644
index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000
--- a/20191114/loesung-3c-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  int l = 0;
-  while (s[l])
-    l++;
-  return l;
-}
-
-int main (void)
-{
-  printf ("%d\n", strlen ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/loesung-3c-2.c b/20191114/loesung-3c-2.c
deleted file mode 100644
index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000
--- a/20191114/loesung-3c-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  char *s0 = s;
-  while (*s)
-    s++;
-  return s - s0;
-}
-
-int main (void)
-{
-  printf ("%d\n", strlen ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/loesung-3d-1.c b/20191114/loesung-3d-1.c
deleted file mode 100644
index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000
--- a/20191114/loesung-3d-1.c
+++ /dev/null
@@ -1,34 +0,0 @@
-
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  int l = 0;
-  while (s[l])
-    l++;
-  return l;
-}
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_1 ("Hello, world!\n"));
-  printf ("%d\n", fun_2 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/loesung-3d-2.c b/20191114/loesung-3d-2.c
deleted file mode 100644
index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000
--- a/20191114/loesung-3d-2.c
+++ /dev/null
@@ -1,34 +0,0 @@
-
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  char *s0 = s;
-  while (*s)
-    s++;
-  return s - s0;
-}
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_1 ("Hello, world!\n"));
-  printf ("%d\n", fun_2 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/loesung-3e-1.c b/20191114/loesung-3e-1.c
deleted file mode 100644
index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000
--- a/20191114/loesung-3e-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int fun_3 (char *s)
-{
-  int i = 0, x = 0;
-  while (s[i])
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_3 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/loesung-3e-2.c b/20191114/loesung-3e-2.c
deleted file mode 100644
index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000
--- a/20191114/loesung-3e-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int fun_4 (char *s)
-{
-  int x = 0;
-  while (*s)
-    x += *s++;
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_4 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20191114/logo-hochschule-bochum-cvh-text-v2.pdf b/20191114/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191114/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191114/logo-hochschule-bochum.pdf b/20191114/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191114/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191114/pgscript.sty b/20191114/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191114/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191114/pgslides.sty b/20191114/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191114/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191114/photo-20191114-172339.jpg b/20191114/photo-20191114-172339.jpg
deleted file mode 100644
index 7f3a5c0acfc6a961519b49766d15bace3d24df74..0000000000000000000000000000000000000000
Binary files a/20191114/photo-20191114-172339.jpg and /dev/null differ
diff --git a/20191114/photo-20191114-172339.txt b/20191114/photo-20191114-172339.txt
deleted file mode 100644
index d814d6bc33fd97d3fbeffa1b8addabfee6f231b8..0000000000000000000000000000000000000000
--- a/20191114/photo-20191114-172339.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Logische und bitweise Und-Verknüpfung (rechts), einzelnes Bit auf 1 setzen (links)
diff --git a/20191114/photo-20191114-172358.jpg b/20191114/photo-20191114-172358.jpg
deleted file mode 100644
index cf63b8848239a5fcdfd2a5bc5bcf5875984608f3..0000000000000000000000000000000000000000
Binary files a/20191114/photo-20191114-172358.jpg and /dev/null differ
diff --git a/20191114/photo-20191114-172358.txt b/20191114/photo-20191114-172358.txt
deleted file mode 100644
index 7046eff38e9e9f3021e15d28da248caa5e069233..0000000000000000000000000000000000000000
--- a/20191114/photo-20191114-172358.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Einzelnes Bit auf 1 (rechts) bzw. auf 0 (links) setzen
diff --git a/20191114/photo-20191114-172434.jpg b/20191114/photo-20191114-172434.jpg
deleted file mode 100644
index ea24c48d0482d3805f9cfd42cfd9fb4fd97b9b0b..0000000000000000000000000000000000000000
Binary files a/20191114/photo-20191114-172434.jpg and /dev/null differ
diff --git a/20191114/photo-20191114-172434.txt b/20191114/photo-20191114-172434.txt
deleted file mode 100644
index ef3724197fcf64b1b3bb318a9494290a456a85e2..0000000000000000000000000000000000000000
--- a/20191114/photo-20191114-172434.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Einzelnes Bit auf 0 setzen (rechts) bzw. umklappen (Mitte) bzw. abfragen (links)
diff --git a/20191114/string-ops-16.c b/20191114/string-ops-16.c
deleted file mode 100644
index 141b163881b0733d009cf5489c0473fac05029dd..0000000000000000000000000000000000000000
--- a/20191114/string-ops-16.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[100] = "";
-  snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-  printf ("%s\n", buffer);
-
-/*
-  char *answer = strstr (buffer, "Antwort");
-  printf ("%s\n", answer);
-  printf ("found at: %zd\n", answer - buffer);
-*/
-
-  return 0;
-}
diff --git a/20191114/string-ops-17.c b/20191114/string-ops-17.c
deleted file mode 100644
index e1c1e84fba7eade92c2a0c818104de31b24c5f61..0000000000000000000000000000000000000000
--- a/20191114/string-ops-17.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[100] = "";
-  snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-  printf ("%s\n", buffer);
-
-  char *answer = strstr (buffer, "Antwort");
-  printf ("%s\n", answer);
-  printf ("found at: %zd\n", answer - buffer);
-
-  return 0;
-}
diff --git a/20191114/string-ops-18.c b/20191114/string-ops-18.c
deleted file mode 100644
index c00eb2205fe4fdde55a29f4207187fd50b200149..0000000000000000000000000000000000000000
--- a/20191114/string-ops-18.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[100] = "";
-  snprintf (buffer, 100, "Die Antwort lautet: %d", 42);
-  printf ("%s\n", buffer);
-
-  char *answer = strstr (buffer, "antwort");
-  if (answer)
-    {
-      printf ("%s\n", answer);
-      printf ("found at: %zd\n", answer - buffer);
-    }
-  else
-    printf ("Suchbegriff nicht gefunden.\n");
-
-  return 0;
-}
diff --git a/20191121/Makefile b/20191121/Makefile
deleted file mode 100644
index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000
--- a/20191121/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-%.elf: %.c
-	avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
-
-%.hex: %.elf
-	avr-objcopy -O ihex $< $@
-
-download:
-	./download.sh
diff --git a/20191121/aufgabe-2.c b/20191121/aufgabe-2.c
deleted file mode 100644
index 1afa7b1260506cb307aff5f929c6357c7bdcb708..0000000000000000000000000000000000000000
--- a/20191121/aufgabe-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRA = 0xff;
-  DDRB = 0xff;
-  DDRC = 0xff;
-  DDRD = 0xff;
-  PORTA = 0x1f;
-  PORTB = 0x10;
-  PORTD = 0x10;
-  PORTC = 0xfc;
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-0.c b/20191121/blink-0.c
deleted file mode 100644
index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000
--- a/20191121/blink-0.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-0a.c b/20191121/blink-0a.c
deleted file mode 100644
index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000
--- a/20191121/blink-0a.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x40;   /* binär: 0100 0000 */
-  PORTD = 0x00;  /* binär: 0000 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-1.c b/20191121/blink-1.c
deleted file mode 100644
index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000
--- a/20191121/blink-1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD |= 0x01;
-  while (1)
-    {
-      _delay_ms (500);
-      PORTD &= ~0x01;
-      _delay_ms (500);
-      PORTD |= 0x01;
-    }
-  return 0;
-}
diff --git a/20191121/blink-10.c b/20191121/blink-10.c
deleted file mode 100644
index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000
--- a/20191121/blink-10.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191121/blink-11.c b/20191121/blink-11.c
deleted file mode 100644
index 15d401a20a3560b763fb509273d6a4eb0cb5edbe..0000000000000000000000000000000000000000
--- a/20191121/blink-11.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-volatile uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x60;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      _delay_ms (1);
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191121/blink-2.c b/20191121/blink-2.c
deleted file mode 100644
index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000
--- a/20191121/blink-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x02;
-  PORTD = 0x02;
-  while (1)
-    {
-      _delay_ms (250);
-      PORTD ^= 0x02;
-    }
-  return 0;
-}
diff --git a/20191121/blink-3.c b/20191121/blink-3.c
deleted file mode 100644
index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000
--- a/20191121/blink-3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-    }
-  return 0;
-}
diff --git a/20191121/blink-4.c b/20191121/blink-4.c
deleted file mode 100644
index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000
--- a/20191121/blink-4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20191121/blink-5.c b/20191121/blink-5.c
deleted file mode 100644
index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000
--- a/20191121/blink-5.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-6.c b/20191121/blink-6.c
deleted file mode 100644
index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000
--- a/20191121/blink-6.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (TIMER0_COMPB_vect)
-{
-  static uint8_t counter = 0;
-  if (counter++ == 0)
-    PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  TCCR0B = (1 << CS01) | (1 << CS00);  /* Takt durch 64 dividieren */
-  TIMSK0 = 1 << OCIE0B;  /* Interrupt einschalten */
-  sei ();
-  DDRD = 0xfd;   /* binär: 1111 1101 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-7.c b/20191121/blink-7.c
deleted file mode 100644
index 5468a8c4ec7791bcfd411be418f0f3b4009dfe6d..0000000000000000000000000000000000000000
--- a/20191121/blink-7.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x60;  /* binär: 0110 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-8.c b/20191121/blink-8.c
deleted file mode 100644
index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000
--- a/20191121/blink-8.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-ISR (INT0_vect)  /* PD2 */
-{
-  PORTD ^= 0x40;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xff;   /* binär: 1111 1111 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20191121/blink-9.c b/20191121/blink-9.c
deleted file mode 100644
index 088e2c5c9953552f862b803a3f0ecb96ff1ce4aa..0000000000000000000000000000000000000000
--- a/20191121/blink-9.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <stdint.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-uint8_t key_pressed = 0;
-
-ISR (INT0_vect)  /* PD2 */
-{
-  key_pressed = 1;
-}
-
-int main (void)
-{
-  cli ();
-  EICRA = 1 << ISC00 | 1 << ISC01;  /* INT0: steigende Flanke */
-  EIMSK = 1 << INT0;  /* INT0 einschalten */
-  sei ();
-  DDRD = 0xfb;   /* binär: 1111 1011 */
-  PORTD = 0x60;  /* binär: 0100 0000 */
-  while (1)
-    {
-      while (!key_pressed)
-        ;  /* just wait */
-      PORTD ^= 0x40;
-      key_pressed = 0;
-    }
-  return 0;
-}
diff --git a/20191121/download.sh b/20191121/download.sh
deleted file mode 100755
index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000
--- a/20191121/download.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-port=$(ls -rt /dev/ttyACM* | tail -1)
-echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1)
-avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null
diff --git a/20191121/gtk-1.c b/20191121/gtk-1.c
deleted file mode 100644
index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000
--- a/20191121/gtk-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-2.c b/20191121/gtk-2.c
deleted file mode 100644
index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000
--- a/20191121/gtk-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-3.c b/20191121/gtk-3.c
deleted file mode 100644
index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000
--- a/20191121/gtk-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-4.c b/20191121/gtk-4.c
deleted file mode 100644
index 3e15b640a0f1503294f93bb69fa0b457d60288e4..0000000000000000000000000000000000000000
--- a/20191121/gtk-4.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-5.c b/20191121/gtk-5.c
deleted file mode 100644
index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000
--- a/20191121/gtk-5.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-6.c b/20191121/gtk-6.c
deleted file mode 100644
index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000
--- a/20191121/gtk-6.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/gtk-7.c b/20191121/gtk-7.c
deleted file mode 100644
index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000
--- a/20191121/gtk-7.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data)
-{
-  printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y);
-  return FALSE;
-}
-
-gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data)
-{
-  printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-  gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK);
-  g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL);
-
-  gtk_widget_add_events (window, GDK_KEY_PRESS_MASK);
-  g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191121/hello-1.c b/20191121/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20191121/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hello-2.c b/20191121/hello-2.c
deleted file mode 100644
index 304452b8c501faf03fbd0afaa267e6ef0172807e..0000000000000000000000000000000000000000
--- a/20191121/hello-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int printf (const char *__restrict __format, ...);
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hello-3.c b/20191121/hello-3.c
deleted file mode 100644
index 30d22b887447115a06d04e239c1c31f327964ec4..0000000000000000000000000000000000000000
--- a/20191121/hello-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int pruzzel (const char *__restrict __format, ...);
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hello-4.c b/20191121/hello-4.c
deleted file mode 100644
index 532be20323c2136346f82f45ea12f830480d8040..0000000000000000000000000000000000000000
--- a/20191121/hello-4.c
+++ /dev/null
@@ -1,11 +0,0 @@
-int pruzzel (const char *bla)
-{
-  printf ("%s", bla);
-  return 42;
-}
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hello-5.c b/20191121/hello-5.c
deleted file mode 100644
index 88b69e3ca352f89caa868a9cedb0fd12bc6e1133..0000000000000000000000000000000000000000
--- a/20191121/hello-5.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int pruzzel (const char *bla);
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hello-6.c b/20191121/hello-6.c
deleted file mode 100644
index c160a51f7a3c73664fdc20dd3a21429a77142644..0000000000000000000000000000000000000000
--- a/20191121/hello-6.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pruzzel.h"
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191121/hexe.h b/20191121/hexe.h
deleted file mode 100644
index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000
--- a/20191121/hexe.h
+++ /dev/null
@@ -1 +0,0 @@
-eine kleine Hexe.
diff --git a/20191121/hp-20191121.pdf b/20191121/hp-20191121.pdf
deleted file mode 100644
index f44ee5e36ed1393e524c5b8d7f1e88fc8153f8b3..0000000000000000000000000000000000000000
Binary files a/20191121/hp-20191121.pdf and /dev/null differ
diff --git a/20191121/hp-20191121.tex b/20191121/hp-20191121.tex
deleted file mode 100644
index 5388961bce9b0dae56fae979af5289126f5eee62..0000000000000000000000000000000000000000
--- a/20191121/hp-20191121.tex
+++ /dev/null
@@ -1,819 +0,0 @@
-% hp-20191121.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Interrupts, volatile-Variable, Bibliotheken: Einführung
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{21.\ November 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{red}
-        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\subsection{Bit-Operationen}
-\subsubsection{Zahlensysteme}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \vspace*{-\smallskipamount}
-  \showsubsection
-  \vspace*{-\medskipamount}
-  \showsubsubsection
-
-  \begin{tabular}{rlrl}
-    Basis & Name & Beispiel & Anwendung \\[\smallskipamount]
-      2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\
-      8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\
-     10 & Dezimalsystem & \lstinline,259, & Alltag \\
-     16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\
-    256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4)
-  \end{tabular}
-
-  \bigskip
-
-  \begin{itemize}
-    \item
-      Computer rechnen im Binärsystem.
-    \item
-      Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\
-      Bits in Zahlen einzeln ansprechen zu können.
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{rlrlrc}
-    \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\
-           001 & \bf 1                 & 0001 & \bf 1 &       1001 & \bf 9\\
-           010 & \bf 2                 & 0010 & \bf 2 &       1010 & \bf A\\
-           011 & \bf 3                 & 0011 & \bf 3 &       1011 & \bf B\\[\smallskipamount]
-           100 & \bf 4                 & 0100 & \bf 4 &       1100 & \bf C\\
-           101 & \bf 5                 & 0101 & \bf 5 &       1101 & \bf D\\
-           110 & \bf 6                 & 0110 & \bf 6 &       1110 & \bf E\\
-           111 & \bf 7                 & 0111 & \bf 7 &       1111 & \bf F\\
-  \end{tabular}
-
-  \medskip
-
-  \begin{itemize}
-    \item
-      Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\
-      in Binär-Zahlen umrechnen.
-    \item
-      Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 4 Bits.
-    \item
-      Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 3 Bits.
-    \item
-      Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\
-      die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen.
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Bit-Operationen in C}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{lll}
-    C-Operator     & Verknüpfung              & Anwendung                \\[\smallskipamount]
-    \lstinline,&,  & Und                      & Bits gezielt löschen     \\
-    \lstinline,|,  & Oder                     & Bits gezielt setzen      \\
-    \lstinline,^,  & Exklusiv-Oder            & Bits gezielt invertieren \\
-    \lstinline,~,  & Nicht                    & Alle Bits invertieren    \\[\smallskipamount]
-    \lstinline,<<, & Verschiebung nach links  & Maske generieren         \\
-    \lstinline,>>, & Verschiebung nach rechts & Bits isolieren
-  \end{tabular}
-
-  \bigskip
-
-  Numerierung der Bits: von rechts ab 0
-
-  \medskip
-
-  \begin{tabular}{ll}
-    Bit Nr.\ 3 auf 1 setzen: &
-    \lstinline,a |= 1 << 3;, \\
-    Bit Nr.\ 4 auf 0 setzen: &
-    \lstinline,a &= ~(1 << 4);, \\
-    Bit Nr.\ 0 invertieren: &
-    \lstinline,a ^= 1 << 0;,
-  \end{tabular}
-
-  \smallskip
-
-  ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad
-  \lstinline{if (a & (1 << 1))}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  C-Datentypen für Bit-Operationen:
-  \smallskip\par
-  \lstinline{#include <stdint.h>}
-  \medskip\par
-  \begin{tabular}{lllll}
-                    & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\
-    mit Vorzeichen  & \lstinline,int8_t,
-                    & \lstinline,int16_t,
-                    & \lstinline,int32_t,
-                    & \lstinline,int64_t, \\
-    ohne Vorzeichen & \lstinline,uint8_t,
-                    & \lstinline,uint16_t,
-                    & \lstinline,uint32_t,
-                    & \lstinline,uint64_t,
-  \end{tabular}
-
-  \bigskip
-  \bigskip
-
-  Ausgabe:
-  \smallskip\par
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-    #include <inttypes.h>
-    ...
-    uint64_t x = 42;
-    printf ("Die Antwort lautet: %" PRIu64 "\n", x);
-  \end{lstlisting}
-
-\iffalse
-
-  \bigskip
-
-  Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.
-
-  \smallskip
-
-  \begin{tabular}[t]{ll}
-    \lstinline|void set_bit (int i);|   & Bei Index $i$ auf 1 setzen \\
-    \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\
-    \lstinline|int get_bit (int i);|    & Bei Index $i$ lesen
-  \end{tabular}
-
-  \medskip
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen.
-    \item
-      Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen.
-    \item
-      Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|).
-  \end{itemize}
-
-\fi
-
-\end{frame}
-
-\subsection{I/O-Ports}
-
-\begin{frame}[fragile]
-
-%  \showsection
-  \showsubsection
-  \vspace*{-1.5\medskipamount}
-  {\large\textbf{\color{structure}4.3\quad Interrupts}}
-
-  \bigskip
-
-  Kommunikation mit externen Geräten
-
-  \bigskip
-
-  \begin{center}
-    \includegraphics{io-ports-and-interrupts.pdf}
-  \end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  In Output-Port schreiben = Aktoren ansteuern
-
-  Beispiel: LED
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0x70;
-    PORTC = 0x40;
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 0111\,0000\\
-                binär: 0100\,0000
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Aus Input-Port lesen = Sensoren abfragen
-
-  Beispiel: Taster
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0xfd;
-    while ((PINC & 0x02) == 0)
-      ; /* just wait */
-  \end{lstlisting}
-  \begin{picture}(0,0)(-1.5,-0.42)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 1111\,1101\\
-                binär: 0000\,0010
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-  
-  \bigskip
-
-  Praktikumsaufgabe: Druckknopfampel
-
-\end{frame}
-
-\subsection{Interrupts}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: eingebaute Uhr\hfill
-  \makebox(0,0)[tr]{%
-    \only<2->{\begin{minipage}[t]{4.7cm}
-        \vspace*{-0.3cm}%
-        statt Zählschleife (\lstinline{_delay_ms}):\\
-        Hauptprogramm kann\\
-        andere Dinge tun
-      \end{minipage}}%
-    }
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-
-    ...
-
-
-    ISR (TIMER0B_COMP_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}}
-    \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}}
-    \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}}
-    \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}}
-  \end{picture}
-
-  Initialisierung über spezielle Ports:
-  \lstinline{TCCR0B}, \lstinline{TIMSK0}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster\hfill
-  \makebox(0,0)[tr]{%
-    \begin{minipage}[t]{4.7cm}
-      \vspace*{-0.3cm}%
-      statt \newterm{Busy Waiting\/}:\\
-      Hauptprogramm kann\\
-      andere Dinge tun
-    \end{minipage}}
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-    ...
-
-    ISR (INT0_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-
-  \medskip
-
-  Initialisierung über spezielle Ports:
-  \lstinline{EICRA}, \lstinline{EIMSK}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\subsection{volatile-Variable}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster
-
-  \vspace*{-2.5pt}
-
-  \begin{minipage}[t]{5cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        volatile uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        ...
-
-        while (1)
-          {
-            while (!key_pressed)
-              ;  /* just wait */
-            PORTD ^= 0x40;
-            key_pressed = 0;
-          }
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm}
-        \begin{center}
-          \textbf{volatile}:\\
-          Speicherzugriff\\
-          nicht wegoptimieren
-        \end{center}
-      \end{minipage}}}
-    \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}}
-  \end{picture}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[2.12] Strukturen
-        \item[2.13] Dateien und Fehlerbehandlung
-        \item[2.14] Parameter des Hauptprogramms
-        \item[2.15] String-Operationen
-      \end{itemize}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \color{red}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \color{black}
-        \item[3.3] Bibliotheken verwenden
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-%        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{medgreen}
-        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\subsection{Der Präprozessor}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \lstinline{#include}: %\pause:
-  Text einbinden
-  \begin{itemize}
-    \pause
-    \item
-      \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header
-    \pause
-    \item
-      \lstinline{#include "pruzzel.h"}: auch aktuelles Verzeichnis -- eigene Header
-  \end{itemize}
-
-%  \pause
-%  \bigskip
-%
-%  \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren
-%  \begin{itemize}
-%    \pause
-%    \item
-%      Kein Semikolon!
-%    \pause
-%    \item
-%      Berechnungen in Klammern setzen:\\
-%      \lstinline{#define VIER (2 + 2)}
-%    \pause
-%    \item
-%      Konvention: Großbuchstaben
-%  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliotheken einbinden}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Inhalt der Header-Datei: externe Deklarationen
-
-%  \pause
-  \smallskip
-  \lstinline{extern int pruzzel (const char *bla);}
-
-%  \pause
-  \smallskip
-  \lstinline{extern int printf (__const char *__restrict __format, ...);}
-
-%  \pause
-  \bigskip
-  Funktion wird "`anderswo"' definiert
-  \begin{itemize}
-%    \pause
-    \item
-      separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben
-%    \pause
-    \item
-      Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker}
-%    \pause
-%    \item
-%      vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\
-%%      \pause
-%      = Datei \file{libfoo.a} in Standard-Verzeichnis
-  \end{itemize}
-
-\end{frame}
-
-\iffalse
-
-\subsection{Bibliothek verwenden (Beispiel: GTK+)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \lstinline{#include <gtk/gtk.h>}
-    \pause
-    \smallskip
-    \item
-      Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\
-      welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc}
-      übergeben muß\alt<4->{.}{:}
-      \pause
-      \begin{onlyenv}<3>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡pkg-config --cflags --libs gtk+-3.0¿
-          -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-
-          atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1
-          .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/
-          include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc
-          lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf
-          buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I
-          /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu
-          de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk
-          -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib
-          -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk
-          -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai
-          ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject
-          -2.0 -lglib-2.0
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \pause
-    \arrowitem
-      Compiler-Aufruf:
-      \begin{onlyenv}<4>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk-
-          3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp
-          i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g
-          nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu
-          de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa
-          ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.
-          0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in
-          clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/
-          libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l
-          ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux
-          -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0
-          -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix
-          buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-      \begin{onlyenv}<5->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs)
-                 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-  \end{itemize}
-  \pause[6]
-  \begin{picture}(0,0)
-    \color{red}
-    \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}}
-    \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\
-                     \strut u.\,a.\ viele Include-Verzeichnisse:\\
-                     \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}}
-    \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}}
-    \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\
-                      \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      /* Zeichenbefehle */
-      ...
-
-      return FALSE;
-    }
-  
-    ...
-
-    g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\
-      die Funktion \lstinline{draw} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}}
-    \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\
-                    \strut Bildschirm, auf den\\
-                    \strut gezeichnet werden soll}}}
-    \pause
-    \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}}
-    \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\
-                    \strut für draw(), typischerweise\\
-                    \strut ein Zeiger auf ein struct}}}
-    \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean timer (GtkWidget *widget)
-    {
-      /* Rechenbefehle */
-      ...
-
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-  
-    ...
-
-    g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft nach 50 Millisekunden
-      die Funktion \lstinline{timer} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\
-                    \strut neu gezeichnet werden.}}}
-    \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}}
-    \pause
-    \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}}
-    \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\
-                    \strut die Funktion erneut aufgerufen werden.}}}
-    \pause
-    \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}}
-    \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\
-                    \strut eines Zeigers (später)}}}
-  \end{picture}
-
-\end{frame}
-
-\fi
-
-\end{document}
diff --git a/20191121/hp-musterloesung-20191121.pdf b/20191121/hp-musterloesung-20191121.pdf
deleted file mode 100644
index 46f1fc22f6d49b43ffee889895dc86131df827d7..0000000000000000000000000000000000000000
Binary files a/20191121/hp-musterloesung-20191121.pdf and /dev/null differ
diff --git a/20191121/hp-musterloesung-20191121.tex b/20191121/hp-musterloesung-20191121.tex
deleted file mode 100644
index 555e15469b37738e160d5f72659239372065bb41..0000000000000000000000000000000000000000
--- a/20191121/hp-musterloesung-20191121.tex
+++ /dev/null
@@ -1,392 +0,0 @@
-% hp-musterloesung-20191121.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Zahlensysteme, Mikrocontroller
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 21.\ November 2019}
-
-  \exercise{Zahlensysteme}
-
-  Wandeln Sie ohne Hilfsmittel
-
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Dezimal:
-        \begin{itemize}
-          \item[(a)]
-            0010\,0000$_2$
-          \item[(b)]
-            42$_{16}$
-          \item[(c)]
-            17$_8$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Hexadezimal:
-        \begin{itemize}
-          \item[(d)]
-            0010\,0000$_2$
-          \item[(e)]
-            42$_{10}$
-          \item[(f)]
-            192.168.20.254$_{256}$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Binär:
-        \begin{itemize}
-          \item[(g)]
-            750$_8$
-          \item[(h)]
-            42$_{10}$
-          \item[(i)]
-            AFFE$_{16}$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}
-  
-  \medskip
-
-  Berechnen Sie ohne Hilfsmittel:
-  \begin{itemize}
-    \item[(j)]
-      750$_8$ \& 666$_8$
-    \item[(k)]
-      A380$_{16}$ + B747$_{16}$
-    \item[(l)]
-      AFFE$_{16} >> 1$
-  \end{itemize}
-
-  Die tiefgestellte Zahl steht für die Basis des Zahlensystems.
-  Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12}
-
-  (In der Klausur sind Hilfsmittel zugelassen,
-  daher ist dies \emph{keine\/} typische Klausuraufgabe.)
-
-  \solution
-
-  Wandeln Sie ohne Hilfsmittel
-
-  \begin{itemize}
-    \item
-      nach Dezimal:
-      \begin{itemize}
-        \item[(a)]
-          $0010\,0000_2 = 32_{10}$
-
-          Eine Eins mit fünf Nullen dahinter steht binär für $2^5 = 32$:\\
-          mit $1$ anfangen und fünfmal verdoppeln.
-        \item[(b)]
-          $42_{16} = 4 \cdot 16 + 2 \cdot 1 = 64 + 2 = 66$
-        \item[(c)]
-          $17_8 = 1 \cdot 8 + 7 \cdot 1 = 8 + 7 = 15$
-      \end{itemize}
-      Umwandlung von und nach Dezimal ist immer rechenaufwendig.
-      Umwandlungen zwischen Binär, Oktal und Hexadezimal gehen ziffernweise
-      und sind daher wesentlich einfacher.
-    \item
-      nach Hexadezimal:
-      \begin{itemize}
-        \item[(d)]
-          $0010\,0000_2 = 20_{16}$
-
-          Umwandlung von Binär nach Hexadezimal geht ziffernweise:\\
-          Vier Binärziffern werden zu einer Hex-Ziffer.
-        \item[(e)]
-          $\rm 42_{10} = 32_{10} + 10_{10} = 20_{16} + A_{16} = 2A_{16}$
-        \item[(f)]
-          $\rm 192.168.20.254_{256} = C0\,A8\,14\,FE_{16}$
-
-          Umwandlung von der Basis 256 nach Hexadezimal geht ziffernweise:\\
-          Eine 256er-Ziffer wird zu zwei Hex-Ziffern.
-
-          Da die 256er-Ziffern dezimal angegeben sind,
-          müssen wir viermal Dezimal nach Hexadezimal umwandeln.
-          Hierfür bieten sich unterschiedliche Wege an.
-
-          $\rm 192_{10} = 128_{10} + 64_{10} = 1100\,0000_{2} = C0_{16}$
-
-          $\rm 168_{10} = 10_{10} \cdot 16_{10} + 8_{10} = A_{16} \cdot 10_{16} + 8_{16} = A8_{16}$
-
-          $20_{10} = 16_{10} + 4_{10} = 10_{16} + 4_{16} = 14$
-          
-          $\rm 254_{10} = 255_{10} - 1_{10} = FF_{16} - 1_{16} = FE_{16}$
-      \end{itemize}
-    \item
-      nach Binär:
-      \begin{itemize}
-        \item[(g)]
-          $750_8 = 111\,101\,000_2$
-
-          Umwandlung von Oktal nach Binär geht ziffernweise:\\
-          Eine Oktalziffer wird zu drei Binärziffern.
-        \item[(h)]
-          $\rm 42_{10} = 2A_{16}$ (siehe oben) $= 0010\,1010_{16}$
-
-          Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\
-          Eine Hex-Ziffer wird zu vier Binärziffern.
-        \item[(i)]
-          $\rm AFFE_{16} = 1010\,1111\,1111\,1110_2$
-
-          Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\
-          Eine Hex-Ziffer wird zu vier Binärziffern.
-      \end{itemize}
-  \end{itemize}
-  
-  \medskip
-
-  Berechnen Sie ohne Hilfsmittel:
-  \begin{itemize}
-    \item[(j)]
-      $750_8\,\&\,666_8
-      = 111\,101\,000_2\,\&\,110\,110\,110_2
-      = 110\,100\,000_2
-      = 640_8$
-
-      Binäre Und-Operationen lassen sich am leichtesten
-      in binärer Schreibweise durchführen.
-      Umwandlung zwischen Oktal und Binär geht ziffernweise:
-      Eine Oktalziffer wird zu drei Binärziffern und umgekehrt.
-
-      Mit etwas Übung funktionieren diese Operationen
-      auch direkt mit Oktalzahlen im Kopf.
-
-    \item[(k)]
-      $\rm\phantom{+}A380_{16}$\\
-      $\rm+\kern2ptB747_{16}$\\[-\medskipamount]
-      \rule{1.4cm}{0.5pt}\\
-      $\rm 15AC7_{16}$
-      \begin{picture}(0,0)
-        \put(-1.4,0.35){\mbox{\scriptsize\bf 1}}
-      \end{picture}
-
-      Mit Hexadezimalzahlen (und Binär- und Oktal- und sonstigen Zahlen)
-      kann man genau wie mit Dezimalzahlen schriftlich rechnen.
-      Man muß nur daran denken, daß der "`Zehner"'-Überlauf nicht bei
-      $10_{10}$ stattfindet, sondern erst bei $10_{16} = 16_{10}$
-      (hier: $\rm 8_{16} + 4_{16} = C_{16}$ und
-      $\rm 3_{16} + 7_{16} = A_{16}$, aber
-      $\rm A_{16} + B_{16} = 10_{10} + 11_{10}
-      = 21_{10} = 16_{10} + 5_{10} = 10_{16} + 5_{16} =  15_{16}$).
-
-    \item[(l)]
-      $\rm AFFE_{16} >> 1
-      = 1010\,1111\,1111\,1110_2 >> 1
-      = 0101\,0111\,1111\,1111_2
-      = 57FF_{16}$
-
-      Bit-Verschiebungen lassen sich am leichtesten
-      in binärer Schreibweise durchführen.
-      Umwandlung zwischen Hexadezimal und Binär geht ziffernweise:
-      Eine Hex-Ziffer wird zu vier Binärziffern und umgekehrt.
-
-      Mit etwas Übung funktionieren diese Operationen
-      auch direkt mit Hexadezimalzahlen im Kopf.
-
-  \end{itemize}
-
-  \exercise{Mikrocontroller}
-
-  \begin{minipage}[t]{10cm}
-    An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen:
-    \begin{itemize}
-      \item
-        von links nach rechts an die Ports A, B, C und D,
-      \item
-        von oben nach unten an die Bits Nr.\ 0 bis 7.
-    \end{itemize}
-
-    Wir betrachten das folgende Programm (\gitfile{hp}{20191121}{aufgabe-2.c}):
-
-    \begin{lstlisting}[gobble=6]
-      #include <avr/io.h>
-
-      int main (void)
-      {
-        DDRA = 0xff;
-        DDRB = 0xff;
-        DDRC = 0xff;
-        DDRD = 0xff;
-        PORTA = 0x1f;
-        PORTB = 0x10;
-        PORTD = 0x10;
-        PORTC = 0xfc;
-        while (1);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{3cm}
-    \strut\\[-\baselineskip]
-    \includegraphics[width=3cm]{leds.jpg}
-  \end{minipage}
-
-  \vspace*{-3cm}
-
-  \strut\hfill
-  \begin{minipage}{11.8cm}
-    \begin{itemize}
-      \item[(a)]
-        Was bewirkt dieses Programm? \points{4}
-      \item[(b)]
-        Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2}
-      \item[(c)]
-        Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken?
-        \points{2}
-      \item[(d)]
-        Schreiben Sie das Programm so um,
-        daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3}
-      \item[(e)]
-        Wozu dient das \lstinline{while (1)}? \points{2}
-      \item
-        Alle Antworten bitte mit Begründung.
-    \end{itemize}
-  \end{minipage}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Was bewirkt dieses Programm?}
-
-      \newcommand{\x}{$\bullet$}
-      \renewcommand{\o}{$\circ$}
-
-      \begin{minipage}[t]{0.75\textwidth}\parskip\smallskipamount
-        Es läßt die LEDs in dem rechts abgebildeten Muster aufleuchten,\\
-        das z.\,B.\ als die Ziffer 4 gelesen werden kann.
-
-        (Das Zeichen \x\ steht für eine leuchtende, \o\ für eine nicht leuchtende LED.)
-
-        Die erste Spalte (Port A) von unten nach oben gelesen (Bit 7 bis 0)\\
-        entspricht der Binärdarstellung von \lstinline{0x1f}: 0001\,1111.
-
-        Die dritte Spalte (Port C) von unten nach oben gelesen (Bit 7 bis 0)\\
-        entspricht der Binärdarstellung von \lstinline{0xfc}: 1111\,1100.
-
-        Die zweite und vierte Spalte (Port B und D) von unten nach oben gelesen\\
-        (Bit 7 bis 0) entsprechen der Binärdarstellung von \lstinline{0x10}: 0001\,0000.
-
-        Achtung: Die Zuweisung der Werte an die Ports erfolgt im Programm\\
-        \emph{nicht\/} in der Reihenfolge A B C D, sondern in der Reihenfolge A B D C.
-      \end{minipage}\hfill
-      \begin{minipage}[t]{0.15\textwidth}
-        \vspace*{-0.5cm}%
-        \begin{tabular}{cccc}
-          \x & \o & \o & \o \\
-          \x & \o & \o & \o \\
-          \x & \o & \x & \o \\
-          \x & \o & \x & \o \\
-          \x & \x & \x & \x \\
-          \o & \o & \x & \o \\
-          \o & \o & \x & \o \\
-          \o & \o & \x & \o \\
-        \end{tabular}
-      \end{minipage}
-
-    \item[(b)]
-      \textbf{Wozu dienen die ersten vier Zeilen des Hauptprogramms?}
-
-      Mit diesen Zeilen werden alle jeweils 8 Bits aller 4 Ports
-      als Output-Ports konfiguriert.
-
-    \item[(c)]
-      \textbf{Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken?}
-
-      Der Komma-Operator in C bewirkt, daß der erste Wert berechnet
-      und wieder verworfen wird und stattdessen der zweite Wert weiterverarbeitet wird.
-      Konkret hier hätte das zur Folge,
-      daß \lstinline{DDRA}, \lstinline{DDRB} und \lstinline{DDRC}
-      gelesen und die gelesenen Werte ignoriert werden;
-      anschließend wird \lstinline{DDRD} der Wert \lstinline{0xff} zugewiesen.
-      Damit würde also nur einer von vier Ports überhaupt konfiguriert.
-
-      Da es sich bei den \lstinline{DDR}-Variablen
-      um \lstinline{volatile}-Variable handelt,
-      nimmt der Compiler an, daß der Lesezugriff schon irgendeinen Sinn hätte.
-      Der Fehler bliebe also unbemerkt.
-
-    \item[(d)]
-      \textbf{Schreiben Sie das Programm so um,
-      daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint.}
-
-      Hierzu vertauschen wir die Zuweisungen
-      an \lstinline{PORTA} und \lstinline{PORTD}
-      sowie die Zuweisungen
-      an \lstinline{PORTB} und \lstinline{PORTC}:
-
-      \begin{lstlisting}[gobble=8]
-          PORTD = 0x1f;
-          PORTC = 0x10;
-          PORTA = 0x10;
-          PORTB = 0xfc;
-      \end{lstlisting}
-
-      Damit ergibt sich eine Spiegelung an der vertikalen Achse.
-
-      Alternativ kann man auch an der horizontalen Achse spiegeln.
-      Dafür muß man die Bits in den Hexadezimalzahlen umdrehen:
-
-      \begin{lstlisting}[gobble=8]
-          PORTA = 0xf8;
-          PORTB = 0x08;
-          PORTD = 0x08;
-          PORTC = 0x3f;
-      \end{lstlisting}
-
-      Die Frage, welche der beiden Spiegelungen gewünscht ist,
-      wäre übrigens \emph{auch in der Klausur zulässig}.
-
-    \item[(e)]
-      \textbf{Wozu dient das \lstinline{while (1)}?}
-
-      Mit dem \lstinline{return}-Befehl am Ende des Hauptprogramms
-      gibt das Programm die Kontrolle an das Betriebssystem zurück.
-
-      Dieses Programm jedoch läuft auf einem Mikrocontroller,
-      auf dem es kein Betriebssystem gibt.
-      Wenn das \lstinline{return} ausgeführt würde,
-      hätte es ein undefiniertes Verhalten zur Folge.
-
-      Um dies zu verhindern, endet das Programm in einer Endlosschleife,
-      mit der wir den Mikrocontroller anweisen,
-      nach der Ausführung des Programms \emph{nichts mehr\/} zu tun
-      (im Gegensatz zu: \emph{irgendetwas Undefiniertes\/} zu tun).
-
-  \end{itemize}
-
-\end{document}
diff --git a/20191121/hp-uebung-20191121.pdf b/20191121/hp-uebung-20191121.pdf
deleted file mode 100644
index 7174bc43762852d23b27262bc9656dd227e1f0ec..0000000000000000000000000000000000000000
Binary files a/20191121/hp-uebung-20191121.pdf and /dev/null differ
diff --git a/20191121/hp-uebung-20191121.tex b/20191121/hp-uebung-20191121.tex
deleted file mode 100644
index c5c73ba1e6a83673b2b1b9f8cb61ce9157403ba4..0000000000000000000000000000000000000000
--- a/20191121/hp-uebung-20191121.tex
+++ /dev/null
@@ -1,172 +0,0 @@
-% hp-uebung-20191121.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Zahlensysteme, Mikrocontroller
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 21.\ November 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  14 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Zahlensysteme}
-
-  Wandeln Sie ohne Hilfsmittel
-
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Dezimal:
-        \begin{itemize}
-          \item[(a)]
-            0010\,0000$_2$
-          \item[(b)]
-            42$_{16}$
-          \item[(c)]
-            17$_8$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Hexadezimal:
-        \begin{itemize}
-          \item[(d)]
-            0010\,0000$_2$
-          \item[(e)]
-            42$_{10}$
-          \item[(f)]
-            192.168.20.254$_{256}$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.3\textwidth}
-    \begin{itemize}
-      \item
-        nach Binär:
-        \begin{itemize}
-          \item[(g)]
-            750$_8$
-          \item[(h)]
-            42$_{10}$
-          \item[(i)]
-            AFFE$_{16}$
-        \end{itemize}
-    \end{itemize}
-  \end{minipage}
-  
-  \medskip
-
-  Berechnen Sie ohne Hilfsmittel:
-  \begin{itemize}
-    \item[(j)]
-      750$_8$ \& 666$_8$
-    \item[(k)]
-      A380$_{16}$ + B747$_{16}$
-    \item[(l)]
-      AFFE$_{16} >> 1$
-  \end{itemize}
-
-  Die tiefgestellte Zahl steht für die Basis des Zahlensystems.
-  Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12}
-
-  (In der Klausur sind Hilfsmittel zugelassen,
-  daher ist dies \emph{keine\/} typische Klausuraufgabe.)
-
-  \exercise{Mikrocontroller}
-
-  \begin{minipage}[t]{10cm}
-    An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen:
-    \begin{itemize}
-      \item
-        von links nach rechts an die Ports A, B, C und D,
-      \item
-        von oben nach unten an die Bits Nr.\ 0 bis 7.
-    \end{itemize}
-
-    Wir betrachten das folgende Programm (\gitfile{hp}{20191121}{aufgabe-2.c}):
-
-    \begin{lstlisting}[gobble=6]
-      #include <avr/io.h>
-
-      int main (void)
-      {
-        DDRA = 0xff;
-        DDRB = 0xff;
-        DDRC = 0xff;
-        DDRD = 0xff;
-        PORTA = 0x1f;
-        PORTB = 0x10;
-        PORTD = 0x10;
-        PORTC = 0xfc;
-        while (1);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{3cm}
-    \strut\\[-\baselineskip]
-    \includegraphics[width=3cm]{leds.jpg}
-  \end{minipage}
-
-  \vspace*{-3cm}
-
-  \strut\hfill
-  \begin{minipage}{11.8cm}
-    \begin{itemize}
-      \item[(a)]
-        Was bewirkt dieses Programm? \points{4}
-      \item[(b)]
-        Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2}
-      \item[(c)]
-        Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken?
-        \points{2}
-      \item[(d)]
-        Schreiben Sie das Programm so um,
-        daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3}
-      \item[(e)]
-        Wozu dient das \lstinline{while (1)}? \points{2}
-      \item
-        Alle Antworten bitte mit Begründung.
-    \end{itemize}
-  \end{minipage}
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191121/io-ports-and-interrupts.pdf b/20191121/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20191121/io-ports-and-interrupts.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/io-ports-and-interrupts.pdf
\ No newline at end of file
diff --git a/20191121/leds.jpg b/20191121/leds.jpg
deleted file mode 120000
index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000
--- a/20191121/leds.jpg
+++ /dev/null
@@ -1 +0,0 @@
-../common/leds.jpg
\ No newline at end of file
diff --git a/20191121/logo-hochschule-bochum-cvh-text-v2.pdf b/20191121/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191121/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191121/logo-hochschule-bochum.pdf b/20191121/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191121/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191121/maerchen.c b/20191121/maerchen.c
deleted file mode 100644
index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000
--- a/20191121/maerchen.c
+++ /dev/null
@@ -1,4 +0,0 @@
-Vor langer, langer Zeit
-gab es einmal
-#include "hexe.h"
-Die lebte in einem Wald.
diff --git a/20191121/pgscript.sty b/20191121/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191121/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191121/pgslides.sty b/20191121/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191121/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191121/photo-20191121-171959.jpg b/20191121/photo-20191121-171959.jpg
deleted file mode 100644
index 7f883cb22da56b08d6ab0bb1f785853f5ad6f5cb..0000000000000000000000000000000000000000
Binary files a/20191121/photo-20191121-171959.jpg and /dev/null differ
diff --git a/20191121/pruzzel-1.txt b/20191121/pruzzel-1.txt
deleted file mode 100644
index dcce889f5cf56ab4370569cda6b35ff33906644d..0000000000000000000000000000000000000000
--- a/20191121/pruzzel-1.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-cassini/home/peter/bo/2019ws/hp/20191121> cat hello-5.c
-extern int pruzzel (const char *bla);
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
-cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.c
-#include <stdio.h>
-
-int pruzzel (const char *bla)
-{
-  printf ("%s", bla);
-  return 42;
-}
-cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O pruzzel.c -o pruzzel
-/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
-(.text+0x20): undefined reference to `main'
-collect2: error: ld returned 1 exit status
-cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-5.c -o hello-5
-/tmp/ccfdwwB5.o: In function `main':
-hello-5.c:(.text+0xc): undefined reference to `pruzzel'
-collect2: error: ld returned 1 exit status
-cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-5.c pruzzel.c -o hello-5
-cassini/home/peter/bo/2019ws/hp/20191121> ./hello-5
-Hello, world!
-cassini/home/peter/bo/2019ws/hp/20191121>
diff --git a/20191121/pruzzel-2.txt b/20191121/pruzzel-2.txt
deleted file mode 100644
index 633b11aa29b11e8573b8e2f28bea3f5f29a0753e..0000000000000000000000000000000000000000
--- a/20191121/pruzzel-2.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-cassini/home/peter/bo/2019ws/hp/20191121> cat hello-6.c
-#include "pruzzel.h"
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
-cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-6.c pruzzel.c -o hello-6cassini/home/peter/bo/2019ws/hp/20191121> ./hello-
-cassini/home/peter/bo/2019ws/hp/20191121> ./hello-6
-Hello, world!
-cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.c
-#include <stdio.h>
-
-int pruzzel (const char *bla)
-{
-  printf ("%s", bla);
-  return 42;
-}
-cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.h
-extern int pruzzel (const char *bla);
-cassini/home/peter/bo/2019ws/hp/20191121>
diff --git a/20191121/pruzzel.c b/20191121/pruzzel.c
deleted file mode 100644
index a03f3ffc532054611cad3d9e137ccd973c874399..0000000000000000000000000000000000000000
--- a/20191121/pruzzel.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int pruzzel (const char *bla)
-{
-  printf ("%s", bla);
-  return 42;
-}
diff --git a/20191121/pruzzel.h b/20191121/pruzzel.h
deleted file mode 100644
index 5b56ad93ce5dfca18c86f429c2b7d34a3cf01f6c..0000000000000000000000000000000000000000
--- a/20191121/pruzzel.h
+++ /dev/null
@@ -1 +0,0 @@
-extern int pruzzel (const char *bla);
diff --git a/20191128/aufgabe-3.c b/20191128/aufgabe-3.c
deleted file mode 100644
index 4c95eb6ad4881c904448309c6b7c46fa101cc109..0000000000000000000000000000000000000000
--- a/20191128/aufgabe-3.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdint.h>
-#include <avr/io.h>
-#include <avr/interrupt.h>
-
-uint8_t counter = 1;
-uint8_t leds = 0;
-
-ISR (TIMER0_COMP_vect)
-{
-  if (counter == 0)
-    {
-      leds = (leds + 1) % 8;
-      PORTC = leds << 4;
-    }
-  counter++;
-}
-
-void init (void)
-{
-  cli ();
-  TCCR0 = (1 << CS01) | (1 << CS00);
-  TIMSK = 1 << OCIE0;
-  sei ();
-  DDRC = 0x70;
-}
-
-int main (void)
-{
-  init ();
-  while (1)
-    ; /* do nothing */
-  return 0;
-}
diff --git a/20191128/dates.c b/20191128/dates.c
deleted file mode 100644
index 97a49feb32b4dc3388facb89732464e68af2a30e..0000000000000000000000000000000000000000
--- a/20191128/dates.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <stdio.h>
-#include "dates.h"
-
-int is_leap_year (int year)
-{
-  if (year % 4 == 0)
-    if (year % 100 == 0)
-      if (year % 400 == 0)
-        return 1;
-      else
-        return 0;
-    else
-      return 1;
-  else
-    return 0;
-}
-
-int days_in_month (int month, int year)
-{
-  if (month == 2)
-    if (is_leap_year (year))
-      return 29;
-    else
-      return 28;
-  else if (month == 4 || month == 6 || month == 9 || month == 11)
-    return 30;
-  else
-    return 31;
-}
-
-void date_print (date *d)
-{
-  printf ("%02d.%02d.%04d", d->day, d->month, d->year);
-}
-
-int date_set (date *d, char day, char month, int year)
-{
-  d->year = year;
-  if (month > 0 && month <= 12)
-    d->month = month;
-  else
-    return 0;
-  if (day > 0 && day <= days_in_month (month, year))
-    d->day = day;
-  else
-    return 0;
-  return 1;
-}
-
-void date_next (date *d)
-{
-  d->day++;
-  if (d->day > days_in_month (d->month, d->year))
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
diff --git a/20191128/dates.h b/20191128/dates.h
deleted file mode 100644
index 1f931a6fb73e2dc493a6f517227e5c37a75252cb..0000000000000000000000000000000000000000
--- a/20191128/dates.h
+++ /dev/null
@@ -1,10 +0,0 @@
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-extern void date_print (date *d);
-extern int date_set (date *d, char day, char month, int year);
-extern void date_next (date *d);
diff --git a/20191128/gtk-1.c b/20191128/gtk-1.c
deleted file mode 100644
index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000
--- a/20191128/gtk-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-2.c b/20191128/gtk-2.c
deleted file mode 100644
index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000
--- a/20191128/gtk-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-3.c b/20191128/gtk-3.c
deleted file mode 100644
index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000
--- a/20191128/gtk-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-4.c b/20191128/gtk-4.c
deleted file mode 100644
index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000
--- a/20191128/gtk-4.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-5.c b/20191128/gtk-5.c
deleted file mode 100644
index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000
--- a/20191128/gtk-5.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-6.c b/20191128/gtk-6.c
deleted file mode 100644
index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000
--- a/20191128/gtk-6.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/gtk-7.c b/20191128/gtk-7.c
deleted file mode 100644
index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000
--- a/20191128/gtk-7.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data)
-{
-  printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y);
-  return FALSE;
-}
-
-gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data)
-{
-  printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-  gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK);
-  g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL);
-
-  gtk_widget_add_events (window, GDK_KEY_PRESS_MASK);
-  g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191128/higher-math-1.c b/20191128/higher-math-1.c
deleted file mode 100644
index 62b6239b58c07468a8e675e3d6016ddbb0723d38..0000000000000000000000000000000000000000
--- a/20191128/higher-math-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER);
-  return 0;
-}
diff --git a/20191128/higher-math-2.c b/20191128/higher-math-2.c
deleted file mode 100644
index e4c228d9793a09ce4884b8bbf284d371fa3bbffb..0000000000000000000000000000000000000000
--- a/20191128/higher-math-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER vier
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER);
-  return 0;
-}
diff --git a/20191128/higher-math-3.c b/20191128/higher-math-3.c
deleted file mode 100644
index 11f51b66457848a3af2825e8bd5a5262671df2fc..0000000000000000000000000000000000000000
--- a/20191128/higher-math-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4);
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER
-  return 0;
-}
diff --git a/20191128/higher-math-4.c b/20191128/higher-math-4.c
deleted file mode 100644
index 2be0072342a27850e35869964df2874b3908816f..0000000000000000000000000000000000000000
--- a/20191128/higher-math-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4;
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER);
-  return 0;
-}
diff --git a/20191128/higher-math-5.c b/20191128/higher-math-5.c
deleted file mode 100644
index ba0687bd87c9c5f5dd6354e311b4072ccb8c4fe6..0000000000000000000000000000000000000000
--- a/20191128/higher-math-5.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 2 + 2
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER);
-  return 0;
-}
diff --git a/20191128/higher-math-6.c b/20191128/higher-math-6.c
deleted file mode 100644
index 82fae73abc293a425a7295082f6effab1ebeed5d..0000000000000000000000000000000000000000
--- a/20191128/higher-math-6.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER (2 + 2)
-
-int main (void)
-{
-  printf ("Drei mal vier = %d.\n", 3 * VIER);
-  return 0;
-}
diff --git a/20191128/hp-20191128.pdf b/20191128/hp-20191128.pdf
deleted file mode 100644
index 563b9a13967299971a69b572711f8473dee7c7d3..0000000000000000000000000000000000000000
Binary files a/20191128/hp-20191128.pdf and /dev/null differ
diff --git a/20191128/hp-20191128.tex b/20191128/hp-20191128.tex
deleted file mode 100644
index 6bceba84fdcd51ebad1a256bb42d7d8a20c48ec5..0000000000000000000000000000000000000000
--- a/20191128/hp-20191128.tex
+++ /dev/null
@@ -1,759 +0,0 @@
-% hp-20191128.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Präprozessor, Bibliotheken
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{28.\ November 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \color{orange}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \color{red}
-        \item[3.3] Bibliotheken verwenden
-        \color{black}
-        \item[3.4] Projekt organisieren: make
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \color{medgreen}
-        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\subsection{Bit-Operationen}
-\subsubsection{Zahlensysteme}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{rlrlrc}
-    \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\
-           001 & \bf 1                 & 0001 & \bf 1 &       1001 & \bf 9\\
-           010 & \bf 2                 & 0010 & \bf 2 &       1010 & \bf A\\
-           011 & \bf 3                 & 0011 & \bf 3 &       1011 & \bf B\\[\smallskipamount]
-           100 & \bf 4                 & 0100 & \bf 4 &       1100 & \bf C\\
-           101 & \bf 5                 & 0101 & \bf 5 &       1101 & \bf D\\
-           110 & \bf 6                 & 0110 & \bf 6 &       1110 & \bf E\\
-           111 & \bf 7                 & 0111 & \bf 7 &       1111 & \bf F\\
-  \end{tabular}
-
-  \medskip
-
-  \begin{itemize}
-    \item
-      Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\
-      in Binär-Zahlen umrechnen.
-    \item
-      Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 4 Bits.
-    \item
-      Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\
-      gruppiert zu jeweils 3 Bits.
-    \item
-      Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\
-      die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen.
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Bit-Operationen in C}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  \begin{tabular}{lll}
-    C-Operator     & Verknüpfung              & Anwendung                \\[\smallskipamount]
-    \lstinline,&,  & Und                      & Bits gezielt löschen     \\
-    \lstinline,|,  & Oder                     & Bits gezielt setzen      \\
-    \lstinline,^,  & Exklusiv-Oder            & Bits gezielt invertieren \\
-    \lstinline,~,  & Nicht                    & Alle Bits invertieren    \\[\smallskipamount]
-    \lstinline,<<, & Verschiebung nach links  & Maske generieren         \\
-    \lstinline,>>, & Verschiebung nach rechts & Bits isolieren
-  \end{tabular}
-
-  \bigskip
-
-  Numerierung der Bits: von rechts ab 0
-
-  \medskip
-
-  \begin{tabular}{ll}
-    Bit Nr.\ 3 auf 1 setzen: &
-    \lstinline,a |= 1 << 3;, \\
-    Bit Nr.\ 4 auf 0 setzen: &
-    \lstinline,a &= ~(1 << 4);, \\
-    Bit Nr.\ 0 invertieren: &
-    \lstinline,a ^= 1 << 0;,
-  \end{tabular}
-
-  \smallskip
-
-  ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad
-  \lstinline{if (a & (1 << 1))}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsection
-
-  C-Datentypen für Bit-Operationen:
-  \smallskip\par
-  \lstinline{#include <stdint.h>}
-  \medskip\par
-  \begin{tabular}{lllll}
-                    & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\
-    mit Vorzeichen  & \lstinline,int8_t,
-                    & \lstinline,int16_t,
-                    & \lstinline,int32_t,
-                    & \lstinline,int64_t, \\
-    ohne Vorzeichen & \lstinline,uint8_t,
-                    & \lstinline,uint16_t,
-                    & \lstinline,uint32_t,
-                    & \lstinline,uint64_t,
-  \end{tabular}
-
-  \bigskip
-  \bigskip
-
-  Ausgabe:
-  \smallskip\par
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-    #include <inttypes.h>
-    ...
-    uint64_t x = 42;
-    printf ("Die Antwort lautet: %" PRIu64 "\n", x);
-  \end{lstlisting}
-
-\iffalse
-
-  \bigskip
-
-  Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.
-
-  \smallskip
-
-  \begin{tabular}[t]{ll}
-    \lstinline|void set_bit (int i);|   & Bei Index $i$ auf 1 setzen \\
-    \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\
-    \lstinline|int get_bit (int i);|    & Bei Index $i$ lesen
-  \end{tabular}
-
-  \medskip
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen.
-    \item
-      Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen.
-    \item
-      Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|).
-  \end{itemize}
-
-\fi
-
-\end{frame}
-
-\subsection{I/O-Ports}
-
-\begin{frame}[fragile]
-
-%  \showsection
-  \showsubsection
-  \vspace*{-1.5\medskipamount}
-  {\large\textbf{\color{structure}4.3\quad Interrupts}}
-
-  \bigskip
-
-  Kommunikation mit externen Geräten
-
-  \bigskip
-
-  \begin{center}
-    \includegraphics{io-ports-and-interrupts.pdf}
-  \end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  In Output-Port schreiben = Aktoren ansteuern
-
-  Beispiel: LED
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0x70;
-    PORTC = 0x40;
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 0111\,0000\\
-                binär: 0100\,0000
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Aus Input-Port lesen = Sensoren abfragen
-
-  Beispiel: Taster
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/io.h>
-    ...
-    DDRC = 0xfd;
-    while ((PINC & 0x02) == 0)
-      ; /* just wait */
-  \end{lstlisting}
-  \begin{picture}(0,0)(-1.5,-0.42)
-    \put(3,0.67){\begin{minipage}{3cm}
-                \color{red}%
-                binär: 1111\,1101\\
-                binär: 0000\,0010
-              \end{minipage}}
-    \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}}
-  \end{picture}
-
-  \bigskip
-
-  \lstinline{DDR} = Data Direction Register\\
-  Bit = 1 für Output-Port\\
-  Bit = 0 für Input-Port
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-  
-  \bigskip
-
-  Praktikumsaufgabe: Druckknopfampel
-
-\end{frame}
-
-\begin{frame}
-  \textbf{Pull-Up- und Pull-Down-Widerstände}
-  \smallskip
-  \begin{center}
-    \includegraphics[width=8cm]{pull-up-pull-down.jpg}
-  \end{center}
-\end{frame}
-
-\subsection{Interrupts}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: eingebaute Uhr\hfill
-  \makebox(0,0)[tr]{%
-    \only<1->{\begin{minipage}[t]{4.7cm}
-        \vspace*{-0.3cm}%
-        statt Zählschleife (\lstinline{_delay_ms}):\\
-        Hauptprogramm kann\\
-        andere Dinge tun
-      \end{minipage}}%
-    }
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-
-    ...
-
-
-    ISR (TIMER0B_COMP_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}}
-    \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}}
-    \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}}
-    \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}}
-  \end{picture}
-
-  Initialisierung über spezielle Ports:
-  \lstinline{TCCR0B}, \lstinline{TIMSK0}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster\hfill
-  \makebox(0,0)[tr]{%
-    \begin{minipage}[t]{4.7cm}
-      \vspace*{-0.3cm}%
-      statt \newterm{Busy Waiting\/}:\\
-      Hauptprogramm kann\\
-      andere Dinge tun
-    \end{minipage}}
-
-  \medskip
-
-  \begin{lstlisting}
-    #include <avr/interrupt.h>
-    ...
-
-    ISR (INT0_vect)
-    {
-      PORTD ^= 0x40;
-    }
-  \end{lstlisting}
-
-  \medskip
-
-  Initialisierung über spezielle Ports:
-  \lstinline{EICRA}, \lstinline{EIMSK}
-
-  \bigskip
-
-  \emph{Details: siehe Datenblatt und Schaltplan}
-
-  \vspace*{-2.5cm}\hfill
-  {\color{red}Herstellerspezifisch!}%
-  \hspace*{1cm}
-
-\end{frame}
-
-\subsection{volatile-Variable}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster
-
-  \vspace*{-2.5pt}
-
-  \begin{minipage}[t]{5cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        volatile uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        ...
-
-        while (1)
-          {
-            while (!key_pressed)
-              ;  /* just wait */
-            PORTD ^= 0x40;
-            key_pressed = 0;
-          }
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm}
-        \begin{center}
-          \textbf{volatile}:\\
-          Speicherzugriff\\
-          nicht wegoptimieren
-        \end{center}
-      \end{minipage}}}
-    \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}}
-  \end{picture}
-
-\end{frame}
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\subsection{Der Präprozessor}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \lstinline{#include}: %\pause:
-  Text einbinden
-  \begin{itemize}
-    \pause
-    \item
-      \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header
-    \pause
-    \item
-      \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header
-  \end{itemize}
-
-  \pause
-  \bigskip
-
-  \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren
-  \begin{itemize}
-    \pause
-    \item
-      Kein Semikolon!
-    \pause
-    \item
-      Berechnungen in Klammern setzen:\\
-      \lstinline{#define VIER (2 + 2)}
-    \pause
-    \item
-      Konvention: Großbuchstaben
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliotheken einbinden}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Inhalt der Header-Datei: externe Deklarationen
-
-  \pause
-  \smallskip
-  \lstinline{extern int answer (void);}
-
-  \pause
-  \smallskip
-  \lstinline{extern int printf (__const char *__restrict __format, ...);}
-
-  \pause
-  \bigskip
-  Funktion wird "`anderswo"' definiert
-  \begin{itemize}
-    \pause
-    \item
-      separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben
-    \pause
-    \item
-      Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker}
-    \pause
-    \item
-      vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\
-      \pause
-      = Datei \file{libfoo.a} in Standard-Verzeichnis
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Bibliothek verwenden (Beispiel: GTK+)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \lstinline{#include <gtk/gtk.h>}
-    \pause
-    \smallskip
-    \item
-      Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\
-      welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc}
-      übergeben muß\alt<4->{.}{:}
-      \pause
-      \begin{onlyenv}<3>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡pkg-config --cflags --libs gtk+-3.0¿
-          -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-
-          atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1
-          .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/
-          include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc
-          lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf
-          buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I
-          /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu
-          de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk
-          -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib
-          -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk
-          -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai
-          ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject
-          -2.0 -lglib-2.0
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \pause
-    \arrowitem
-      Compiler-Aufruf:
-      \begin{onlyenv}<4>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk-
-          3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp
-          i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g
-          nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu
-          de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa
-          ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.
-          0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in
-          clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/
-          libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l
-          ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux
-          -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0
-          -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix
-          buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-      \begin{onlyenv}<5->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs)
-                 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-  \end{itemize}
-  \pause[6]
-  \begin{picture}(0,0)
-    \color{red}
-    \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}}
-    \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\
-                     \strut u.\,a.\ viele Include-Verzeichnisse:\\
-                     \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}}
-    \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}}
-    \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\
-                      \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      /* Zeichenbefehle */
-      ...
-
-      return FALSE;
-    }
-  
-    ...
-
-    g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\
-      die Funktion \lstinline{draw} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}}
-    \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\
-                    \strut Bildschirm, auf den\\
-                    \strut gezeichnet werden soll}}}
-    \pause
-    \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}}
-    \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\
-                    \strut für draw(), typischerweise\\
-                    \strut ein Zeiger auf ein struct}}}
-    \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean timer (GtkWidget *widget)
-    {
-      /* Rechenbefehle */
-      ...
-
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-  
-    ...
-
-    g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft nach 50 Millisekunden
-      die Funktion \lstinline{timer} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\
-                    \strut neu gezeichnet werden.}}}
-    \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}}
-    \pause
-    \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}}
-    \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\
-                    \strut die Funktion erneut aufgerufen werden.}}}
-    \pause
-    \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}}
-    \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\
-                    \strut eines Zeigers (später)}}}
-  \end{picture}
-
-\end{frame}
-
-\end{document}
diff --git a/20191128/hp-musterloesung-20191128.pdf b/20191128/hp-musterloesung-20191128.pdf
deleted file mode 100644
index a8adbf2b369d7073ba44f6aa9791ac4bb8d4ac2d..0000000000000000000000000000000000000000
Binary files a/20191128/hp-musterloesung-20191128.pdf and /dev/null differ
diff --git a/20191128/hp-musterloesung-20191128.tex b/20191128/hp-musterloesung-20191128.tex
deleted file mode 100644
index fcfee6bff213e6bb5404d0c0bfdae3918e7b4d70..0000000000000000000000000000000000000000
--- a/20191128/hp-musterloesung-20191128.tex
+++ /dev/null
@@ -1,278 +0,0 @@
-% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 28.\ November 2019}
-
-  \exercise{Datum-Bibliothek}
-
-  Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019
-  in eine \file{.c}- und eine \file{.h}-Datei. \points{4}
-
-  Hinweis: Schreiben Sie zusätzlich ein Test-Programm.
-
-  \solution
-
-  Die Dateien \gitfile{hp}{20191128}{dates.c} und \gitfile{hp}{20191128}{dates.h} enthalten die Bibliothek,
-  die Datei \gitfile{hp}{20191128}{test-dates.c} ein Programm zum Testen der Bibliothek.
-
-  \exercise{Text-Grafik-Bibliothek}
-
-  Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      \lstinline|void clear (char c)|\\
-      Bildschirm auf Zeichen \lstinline|c| löschen,\\
-      also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen
-    \item
-      \lstinline|void put_point (int x, int y, char c)|\\
-      Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"')
-    \item
-      \lstinline|char get_point (int x, int y)|\\
-      Punkt lesen
-%    \item
-%      \lstinline|void fill (int x, int y, char c, char o)|\\
-%      Fläche in der "`Farbe"' \lstinline|o|,
-%      die den Punkt \lstinline|(x, y)| enthält,
-%      mit der "`Farbe"' \lstinline|c| ausmalen
-    \item
-      \lstinline|void display (void)|\\
-      das Gezeichnete auf dem Bildschirm ausgeben
-  \end{itemize}
-
-  Hinweise:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      Eine C-Bibliothek besteht aus (mindestens)
-      einer \file{.h}-Datei und einer \file{.c}-Datei.
-    \item
-      Verwenden Sie ein Array als "`Bildschirm"'.
-
-      Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\
-      alle Grafikoperationen erfolgen auf dem Array.
-    \item
-      Verwenden Sie Präprozessor-Konstante,
-      z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\
-      um Höhe und Breite des "`Bildschirms"' festzulegen:
-      \begin{lstlisting}[gobble=8]
-        #define WIDTH 72
-        #define HEIGHT 24
-      \end{lstlisting}
-    \item
-     Schreiben Sie zusätzlich ein Test-Programm,
-     das alle Funktionen der Bibliothek benutzt,\\
-     um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"')
-     auszugeben.
-  \end{itemize}
-  \points{8}
-
-  \solution
-
-  Siehe die Dateien \gitfile{hp}{20191128}{textgraph.c} und \gitfile{hp}{20191128}{textgraph.h} (Bibliothek)
-  sowie \gitfile{hp}{20191128}{test-textgraph.c} (Test-Programm).
-
-  Diese Lösung erfüllt zusätzlich die Aufgabe,
-  bei fehlerhafter Benutzung (Koordinaten außerhalb des Zeichenbereichs)
-  eine sinnvolle Fehlermeldung auszugeben,
-  anstatt unkontrolliert Speicher zu überschreiben und abzustürzen.
-
-  Das Schlüsselwort \lstinline{static}
-  bei der Deklaration der Funktion \lstinline{check_coordinates()}
-  bedeutet, daß diese Funktion nur lokal (d.\,h.\ innerhalb der Bibliothek)
-  verwendet und insbesondere nicht nach außen
-  (d.\,h.\ für die Benutzung durch das Hauptprogramm) exportiert wird.
-  Dies dient dazu, nicht unnötig Bezeichner zu reservieren
-  (Vermeidung von "`Namensraumverschmutzung"').
-
-  Man beachte die Verwendung einfacher Anführungszeichen (Apostrophe)
-  bei der Angabe von \lstinline{char}-Kon"-stanten (\lstinline{'*'})
-  im Gegensatz zur Verwendung doppelter Anführungszeichen
-  bei der Angabe von String-Konstanten
-  (String = Array von \lstinline{char}s, abgeschlossen mit Null-Symbol).
-  Um das einfache Anführungszeichen selbst als \lstinline{char}-Konstante anzugeben,
-  ist ein vorangestellter Backslash erforderlich: \lstinline{'\''} ("`Escape-Sequenz"').
-  Entsprechendes gilt für die Verwendung doppelter Anführungszeichen
-  innerhalb von String-Konstanten:
-  \lstinline{printf ("Your name is: \"%s\"", name);}
-
-  \exercise{LED-Blinkmuster}
-
-  Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller
-  (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}).
-
-  \begin{minipage}[t]{7cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdint.h>
-      #include <avr/io.h>
-      #include <avr/interrupt.h>
-
-      uint8_t counter = 1;
-      uint8_t leds = 0;
-
-      ISR (TIMER0_COMP_vect)
-      {
-        if (counter == 0)
-          {
-            leds = (leds + 1) % 8;
-            PORTC = leds << 4;
-          }
-        counter++;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill\begin{minipage}[t]{8.5cm}
-    \begin{lstlisting}[gobble=6]
-      void init (void)
-      {
-        cli ();
-        TCCR0 = (1 << CS01) | (1 << CS00);
-        TIMSK = 1 << OCIE0;
-        sei ();
-        DDRC = 0x70;
-      }
-
-      int main (void)
-      {
-        init ();
-        while (1)
-          ; /* do nothing */
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\
-  Sobald das Programm läuft, blinken diese in charakteristischer Weise:
-  \begin{quote}
-    \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}}
-    \begin{tabular}{|c|c|c|c|}\hline
-      \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline
-      1 & aus & aus & an  \\\hline
-      2 & aus & an  & aus \\\hline
-      3 & aus & an  & an  \\\hline
-      4 & an  & aus & aus \\\hline
-      5 & an  & aus & an  \\\hline
-      6 & an  & an  & aus \\\hline
-      7 & an  & an  & an  \\\hline
-      8 & aus & aus & aus \\\hline
-    \end{tabular}
-  \end{quote}
-  Jede Phase dauert etwas länger als eine halbe Sekunde.
-  Nach 8 Phasen wiederholt sich das Schema.
-
-  Erklären Sie das Verhalten des Programms anhand des Quelltextes:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item[(a)]
-      Wieso macht das Programm überhaupt etwas,
-      wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts} passiert?
-      \points{1}
-    \item[(b)]
-      Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen,
-      wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert,
-      wobei die Variable \lstinline|counter| auf 1 initialisiert,
-      fortwährend erhöht und nirgendwo zurückgesetzt wird?
-      \points{2}
-    \item[(c)]
-      Wie kommt das oben beschriebene Blinkmuster zustande?
-      \points{2}
-    \item[(d)]
-      Wieso dauert eine Phase ungefähr eine halbe Sekunde?
-      \points{2}
-    \item[(e)]
-      Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?
-      \points{1}
-  \end{itemize}
-
-  \goodbreak
-  Hinweis:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item
-      Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers
-      etwa 488mal pro Sekunde aufgerufen wird.
-      Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports.
-      Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären.
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}\itemsep0pt
-    \item[(a)]
-      \textbf{Wieso macht das Programm überhaupt etwas,
-      wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts} passiert?}
-
-      Das Blinken wird durch einen Interrupt-Handler implementiert.
-      Dieser wird nicht durch das Hauptprogramm,
-      sondern durch ein Hardware-Ereignis (hier: Uhr) aufgerufen.
-
-    \item[(b)]
-      \textbf{Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen,
-      wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert,
-      wobei die Variable \lstinline|counter| auf 1 initialisiert,
-      fortwährend erhöht und nirgendwo zurückgesetzt wird?}
-
-      Die vorzeichenlose 8-Bit-Variable \lstinline{counter} kann nur
-      Werte von 0 bis 255 annehmen; bei einem weiteren
-      INkrementieren springt sie wieder auf 0 (Überlauf),
-      und die \lstinline{if}-Bedingung ist erfüllt.
-
-    \item[(c)]
-      \textbf{Wie kommt das oben beschriebene Blinkmuster zustande?}
-
-      In jedem Aufruf des Interrupt-Handlers wird die Variable
-      \lstinline{leds} um 1 erhöht und anschließend modulo 8 genommen.
-      Sie durchläuft daher immer wieder die Zahlen von 0 bis 7.
-
-      Durch die Schiebeoperation \lstinline{leds << 4} werden die 3 Bits 
-      der Variablen \lstinline{leds} an diejenigen Stellen im Byte
-      geschoben, an denen die LEDs an den Mikro-Controller
-      angeschlossen sind (Bits 4, 5 und 6).
-
-      Entsprechend durchläuft das Blinkmuster immer wieder
-      die Binärdarstellungen der Zahlen von 0 bis 7
-      (genauer: von 1 bis 7 und danach 0).
-
-    \item[(d)]
-      \textbf{Wieso dauert eine Phase ungefähr eine halbe Sekunde?}
-
-      Der Interrupt-Handler wird gemäß Hinweis 488mal pro Sekunde aufgerufen.
-      Bei jedem 256sten Aufruf ändert sich das LED-Muster.
-      Eine Phase dauert somit $\frac{256}{488} \approx 0.52$ Sekunden.
-
-    \item[(e)]
-      \textbf{Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?}
-
-      Deklaration eines Interrupt-Handlers für den Timer-Interrupt Nr.\ 0
-  \end{itemize}
-
-\end{document}
diff --git a/20191128/hp-uebung-20191128.pdf b/20191128/hp-uebung-20191128.pdf
deleted file mode 100644
index 57e696f883ec090230bdc8ea12b0d99a13f870a5..0000000000000000000000000000000000000000
Binary files a/20191128/hp-uebung-20191128.pdf and /dev/null differ
diff --git a/20191128/hp-uebung-20191128.tex b/20191128/hp-uebung-20191128.tex
deleted file mode 100644
index fcdad3840edabcf67ce1a0db6d184956c112395a..0000000000000000000000000000000000000000
--- a/20191128/hp-uebung-20191128.tex
+++ /dev/null
@@ -1,206 +0,0 @@
-% hp-uebung-20191121.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 28.\ November 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  10 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Datum-Bibliothek}
-
-  Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019
-  in eine \file{.c}- und eine \file{.h}-Datei. \points{4}
-
-  Hinweis: Schreiben Sie zusätzlich ein Test-Programm.
-
-  \exercise{Text-Grafik-Bibliothek}
-
-  Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      \lstinline|void clear (char c)|\\
-      Bildschirm auf Zeichen \lstinline|c| löschen,\\
-      also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen
-    \item
-      \lstinline|void put_point (int x, int y, char c)|\\
-      Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"')
-    \item
-      \lstinline|char get_point (int x, int y)|\\
-      Punkt lesen
-%    \item
-%      \lstinline|void fill (int x, int y, char c, char o)|\\
-%      Fläche in der "`Farbe"' \lstinline|o|,
-%      die den Punkt \lstinline|(x, y)| enthält,
-%      mit der "`Farbe"' \lstinline|c| ausmalen
-    \item
-      \lstinline|void display (void)|\\
-      das Gezeichnete auf dem Bildschirm ausgeben
-  \end{itemize}
-
-  Hinweise:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      Eine C-Bibliothek besteht aus (mindestens)
-      einer \file{.h}-Datei und einer \file{.c}-Datei.
-    \item
-      Verwenden Sie ein Array als "`Bildschirm"'.
-
-      Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\
-      alle Grafikoperationen erfolgen auf dem Array.
-    \item
-      Verwenden Sie Präprozessor-Konstante,
-      z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\
-      um Höhe und Breite des "`Bildschirms"' festzulegen:
-      \begin{lstlisting}[gobble=8]
-        #define WIDTH 72
-        #define HEIGHT 24
-      \end{lstlisting}
-    \item
-     Schreiben Sie zusätzlich ein Test-Programm,
-     das alle Funktionen der Bibliothek benutzt,\\
-     um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"')
-     auszugeben.
-  \end{itemize}
-  \points{8}
-
-  \clearpage
-  \exercise{LED-Blinkmuster}
-
-  Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller
-  (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}).
-
-  \begin{minipage}[t]{7cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdint.h>
-      #include <avr/io.h>
-      #include <avr/interrupt.h>
-
-      uint8_t counter = 1;
-      uint8_t leds = 0;
-
-      ISR (TIMER0_COMP_vect)
-      {
-        if (counter == 0)
-          {
-            leds = (leds + 1) % 8;
-            PORTC = leds << 4;
-          }
-        counter++;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill\begin{minipage}[t]{8.5cm}
-    \begin{lstlisting}[gobble=6]
-      void init (void)
-      {
-        cli ();
-        TCCR0 = (1 << CS01) | (1 << CS00);
-        TIMSK = 1 << OCIE0;
-        sei ();
-        DDRC = 0x70;
-      }
-
-      int main (void)
-      {
-        init ();
-        while (1)
-          ; /* do nothing */
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\
-  Sobald das Programm läuft, blinken diese in charakteristischer Weise:
-  \begin{quote}
-    \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}}
-    \begin{tabular}{|c|c|c|c|}\hline
-      \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline
-      1 & aus & aus & an  \\\hline
-      2 & aus & an  & aus \\\hline
-      3 & aus & an  & an  \\\hline
-      4 & an  & aus & aus \\\hline
-      5 & an  & aus & an  \\\hline
-      6 & an  & an  & aus \\\hline
-      7 & an  & an  & an  \\\hline
-      8 & aus & aus & aus \\\hline
-    \end{tabular}
-  \end{quote}
-  Jede Phase dauert etwas länger als eine halbe Sekunde.
-  Nach 8 Phasen wiederholt sich das Schema.
-
-  Erklären Sie das Verhalten des Programms anhand des Quelltextes:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item[(a)]
-      Wieso macht das Programm überhaupt etwas,
-      wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts} passiert?
-      \points{1}
-    \item[(b)]
-      Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen,
-      wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert,
-      wobei die Variable \lstinline|counter| auf 1 initialisiert,
-      fortwährend erhöht und nirgendwo zurückgesetzt wird?
-      \points{2}
-    \item[(c)]
-      Wie kommt das oben beschriebene Blinkmuster zustande?
-      \points{2}
-    \item[(d)]
-      Wieso dauert eine Phase ungefähr eine halbe Sekunde?
-      \points{2}
-    \item[(e)]
-      Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?
-      \points{1}
-  \end{itemize}
-
-  Hinweis:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item
-      Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers
-      etwa 488mal pro Sekunde aufgerufen wird.
-      Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports.
-      Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären.
-  \end{itemize}
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191128/io-ports-and-interrupts.pdf b/20191128/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20191128/io-ports-and-interrupts.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/io-ports-and-interrupts.pdf
\ No newline at end of file
diff --git a/20191128/leds.jpg b/20191128/leds.jpg
deleted file mode 120000
index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000
--- a/20191128/leds.jpg
+++ /dev/null
@@ -1 +0,0 @@
-../common/leds.jpg
\ No newline at end of file
diff --git a/20191128/logo-hochschule-bochum-cvh-text-v2.pdf b/20191128/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191128/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191128/logo-hochschule-bochum.pdf b/20191128/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191128/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191128/pgscript.sty b/20191128/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191128/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191128/pgslides.sty b/20191128/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191128/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191128/pull-up-pull-down.jpg b/20191128/pull-up-pull-down.jpg
deleted file mode 100644
index 15405df71575bb0ee9ea7eab8c47525c5a9aa1b3..0000000000000000000000000000000000000000
Binary files a/20191128/pull-up-pull-down.jpg and /dev/null differ
diff --git a/20191128/test-dates.c b/20191128/test-dates.c
deleted file mode 100644
index 5127c11be08532c3d54ba8e85a36abc5400a8566..0000000000000000000000000000000000000000
--- a/20191128/test-dates.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <stdio.h>
-#include "dates.h"
-
-void check (char day, char month, int year)
-{
-  date d;
-  if (date_set (&d, day, month, year))
-    {
-      date_print (&d);
-      printf (" --> ");
-      date_next (&d);
-      date_print (&d);
-      printf ("\n");
-    }
-  else
-    printf ("%02d.%02d.%04d: invalid date\n", day, month, year);
-}
-
-int main (void)
-{
-  check (6, 11, 2016);
-  check (29, 11, 2016);
-  check (30, 11, 2016);
-  check (31, 11, 2016);
-  check (29, 12, 2016);
-  check (30, 12, 2016);
-  check (31, 12, 2016);
-  check (28, 2, 2016);
-  check (29, 2, 2016);
-  check (30, 2, 2016);
-  check (28, 2, 2015);
-  check (29, 2, 2015);
-  check (30, 2, 2015);
-  check (31, 12, 2008);
-  check (28, 2, 2000);
-  check (29, 2, 2000);
-  check (30, 2, 2000);
-  check (28, 2, 1900);
-  check (29, 2, 1900);
-  check (30, 2, 1900);
-  return 0;
-}
diff --git a/20191128/test-textgraph.c b/20191128/test-textgraph.c
deleted file mode 100644
index 4033f61ba55d794afbb5b6c03a0bb55dcc5d3e4e..0000000000000000000000000000000000000000
--- a/20191128/test-textgraph.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <stdio.h>
-#include "textgraph.h"
-
-int main (void)
-{
-  clear (' ');
-  put_point (-5, 10, 'X');
-  for (int i = 17; i < 23; i++)
-    put_point (i, 5, '*');
-  put_point (15, 6, '*');
-  put_point (14, 7, '*');
-  put_point (13, 8, '*');
-  put_point (13, 9, '*');
-  put_point (14, 10, '*');
-  put_point (15, 11, '*');
-  for (int i = 17; i < 23; i++)
-    put_point (i, 12, '*');
-  put_point (24, 11, '*');
-  put_point (25, 10, '*');
-  put_point (26, 9, '*');
-  put_point (26, 8, '*');
-  put_point (25, 7, '*');
-  put_point (24, 6, '*');
-  put_point (18, 8, 'O');
-  put_point (21, 8, 'O');
-  put_point (17, 10, '`');
-  for (int i = 18; i < 22; i++)
-    put_point (i, 10, '-');
-  put_point (22, 10, '\'');
-  put_point (13, 42, 'Y');
-  printf ("get_point (%d, %d): '%c'\n", 13, 9, get_point (13, 9));
-  printf ("get_point (%d, %d): '%c'\n", 14, 9, get_point (14, 9));
-  printf ("get_point (%d, %d): '%c'\n", 94, 9, get_point (94, 9));
-  display ();
-  return 0;
-}
diff --git a/20191128/textgraph.c b/20191128/textgraph.c
deleted file mode 100644
index a17f9a91173f9fe871967f5aef509798c0efbb64..0000000000000000000000000000000000000000
--- a/20191128/textgraph.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdio.h>
-#include "textgraph.h"
-
-char buffer[HEIGHT][WIDTH];
-
-void clear (char c)
-{
-  for (int y = 0; y < HEIGHT; y++)
-    for (int x = 0; x < WIDTH; x++)
-      buffer[y][x] = c;
-}
-
-static int check_coordinates (int x, int y, char *function)
-{
-  if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT)
-    return 1;
-  else
-    {
-      fprintf (stderr, "coordinates (%d,%d) out of range in %s\n", x, y, function);
-      return 0;
-    }
-}
-
-void put_point (int x, int y, char c)
-{
-  if (check_coordinates (x, y, "put_point"))
-    buffer[y][x] = c;
-}
-
-char get_point (int x, int y)
-{
-  if (check_coordinates (x, y, "get_point"))
-    return buffer[y][x];
-  else
-    return 0;
-}
-
-void display (void)
-{
-  for (int y = 0; y < HEIGHT; y++)
-    {
-      for (int x = 0; x < WIDTH; x++)
-        printf ("%c", buffer[y][x]);
-      printf ("\n");
-    }
-}
diff --git a/20191128/textgraph.h b/20191128/textgraph.h
deleted file mode 100644
index 419e0fbd04f3b5d07d42509ab1980513d434eb07..0000000000000000000000000000000000000000
--- a/20191128/textgraph.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef TEXTGRAPH_H
-#define TEXTGRAPH_H
-
-#define WIDTH 40
-#define HEIGHT 20
-
-extern void clear (char c);
-extern void put_point (int x, int y, char c);
-extern char get_point (int x, int y);
-extern void display (void);
-
-#endif
diff --git a/20191205/aufgabe-1.c b/20191205/aufgabe-1.c
deleted file mode 100644
index f5e5c52a701ead8b9ab933b7c56616c84a192fc3..0000000000000000000000000000000000000000
--- a/20191205/aufgabe-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void delete_char_from_string (char *s, int pos)
-{
-  for (int i = strlen (s) - 1; i > pos; i--)
-    s[i - 1] = s[i];
-}
-
-int main (void)
-{
-  char test[] = "Hochschule Boochum";
-  delete_char_from_string (test, 12);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191205/aufgabe-2.c b/20191205/aufgabe-2.c
deleted file mode 100644
index 2bcd5e63a71f212b7243d1f7d9c92406d1e41e77..0000000000000000000000000000000000000000
--- a/20191205/aufgabe-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char buffer[100];
-  fgets (buffer, 100, stdin);
-  for (char *p = buffer; *p; p++)
-    printf ("%02x", *p);
-  printf ("\n");
-}
diff --git a/20191205/gtk-1.c b/20191205/gtk-1.c
deleted file mode 100644
index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000
--- a/20191205/gtk-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-10.c b/20191205/gtk-10.c
deleted file mode 100644
index f7fb2d5b1c4d3f1082a15b8f3a23fb5480fdd4f1..0000000000000000000000000000000000000000
--- a/20191205/gtk-10.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-
-double x = 5;
-double y = 95;
-double vx = 0.5;
-double vy = 0.7;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-11.c b/20191205/gtk-11.c
deleted file mode 100644
index 1fa3d7169dc09ed0a5e89abffdce3cb297509842..0000000000000000000000000000000000000000
--- a/20191205/gtk-11.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-
-double x = 5;
-double y = 95;
-double vx = 0.5;
-double vy = 0.7;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-12.c b/20191205/gtk-12.c
deleted file mode 100644
index e0c274336e1ea7a21983daaa95a563796b532e25..0000000000000000000000000000000000000000
--- a/20191205/gtk-12.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-
-double x = 5;
-double y = 95;
-double vx = 5.0;
-double vy = 0.7;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-13.c b/20191205/gtk-13.c
deleted file mode 100644
index a91d9abf14066d773103a8fca1e2c41abad40be3..0000000000000000000000000000000000000000
--- a/20191205/gtk-13.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 0.7;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-14.c b/20191205/gtk-14.c
deleted file mode 100644
index 47095bb576288741f0753f63966ba853cbc3ad4e..0000000000000000000000000000000000000000
--- a/20191205/gtk-14.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 70.0;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-15.c b/20191205/gtk-15.c
deleted file mode 100644
index 8c93bc8ce1f7e09b7b58ab36732abfebb99d5b51..0000000000000000000000000000000000000000
--- a/20191205/gtk-15.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 70.0;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  if (x + 5 >= WIDTH)
-    vx = -vx;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-16.c b/20191205/gtk-16.c
deleted file mode 100644
index 0901dd7f491ca219cceb6c1f344291de0c154f38..0000000000000000000000000000000000000000
--- a/20191205/gtk-16.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-#define RADIUS 5
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 70.0;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  if (x + RADIUS >= WIDTH)
-    vx = -vx;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-17.c b/20191205/gtk-17.c
deleted file mode 100644
index 978156ac66b448bf164108a7900b18041428bb0c..0000000000000000000000000000000000000000
--- a/20191205/gtk-17.c
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-#define RADIUS 5
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 70.0;
-double dt = 0.05;
-double g = 9.81;
-double k = 0.1;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += (-k * vx) * dt;
-  vy += (-g - k * vy) * dt;
-  if (x + RADIUS >= WIDTH)
-    vx = -vx;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-18.c b/20191205/gtk-18.c
deleted file mode 100644
index a26e54921f6106789e9ded8c34b2bb2028f7e943..0000000000000000000000000000000000000000
--- a/20191205/gtk-18.c
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-#define RADIUS 5
-
-double x = 5;
-double y = 95;
-double vx = 50.0;
-double vy = 70.0;
-double dt = 0.05;
-double g = 9.81;
-double k = 0.3;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += (-k * vx) * dt;
-  vy += (-g - k * vy) * dt;
-  if (x + RADIUS >= WIDTH)
-    vx = -vx;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-2.c b/20191205/gtk-2.c
deleted file mode 100644
index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000
--- a/20191205/gtk-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-3.c b/20191205/gtk-3.c
deleted file mode 100644
index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000
--- a/20191205/gtk-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-4.c b/20191205/gtk-4.c
deleted file mode 100644
index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000
--- a/20191205/gtk-4.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-5.c b/20191205/gtk-5.c
deleted file mode 100644
index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000
--- a/20191205/gtk-5.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <gtk/gtk.h>
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-6.c b/20191205/gtk-6.c
deleted file mode 100644
index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000
--- a/20191205/gtk-6.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-7.c b/20191205/gtk-7.c
deleted file mode 100644
index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000
--- a/20191205/gtk-7.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-#include <gtk/gtk.h>
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
-  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };
-
-  gdk_cairo_set_source_rgba (c, &red);
-  cairo_rectangle (c, 10, 10, 60, 40);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &yellow);
-  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, 10, 70);
-  cairo_line_to (c, 70, 70);
-  cairo_line_to (c, 40, 18);
-  cairo_close_path (c);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data)
-{
-  printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y);
-  return FALSE;
-}
-
-gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data)
-{
-  printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-  gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK);
-  g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL);
-
-  gtk_widget_add_events (window, GDK_KEY_PRESS_MASK);
-  g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-8.c b/20191205/gtk-8.c
deleted file mode 100644
index 80e5747c13d94699d4883018a5b2457fed9885cb..0000000000000000000000000000000000000000
--- a/20191205/gtk-8.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-
-double x = 5;
-double y = 95;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += 0.5;
-  y -= 0.7;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/gtk-9.c b/20191205/gtk-9.c
deleted file mode 100644
index 7beb24ccbed561b4f7451838ea1120fe71cf8b1c..0000000000000000000000000000000000000000
--- a/20191205/gtk-9.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-
-double x = 5;
-double y = 95;
-double vx = 0.5;
-double vy = 0.7;
-double dt = 0.05;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, y, 5, 0, 2 * G_PI);
-  cairo_fill (c);
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  x += vx * dt;
-  y += vy * dt;
-  vx += 0.0 * dt;
-  vy += (-g) * dt;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  GtkWidget *button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-  gtk_container_add (GTK_CONTAINER (vbox), button);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  gtk_widget_set_size_request (drawing_area, 100, 100);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_widget_show (drawing_area);
-  gtk_widget_show (button);
-  gtk_widget_show (vbox);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/hp-20191205.pdf b/20191205/hp-20191205.pdf
deleted file mode 100644
index d3cb9e3cf0c36c35101d1c56096155b99db8bd70..0000000000000000000000000000000000000000
Binary files a/20191205/hp-20191205.pdf and /dev/null differ
diff --git a/20191205/hp-20191205.tex b/20191205/hp-20191205.tex
deleted file mode 100644
index 00aba63404fa43e5db265a2a66163dbf9b010ad3..0000000000000000000000000000000000000000
--- a/20191205/hp-20191205.tex
+++ /dev/null
@@ -1,461 +0,0 @@
-% hp-20191205.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Bibliotheken, Differentialgleichungen
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{5.\ Dezember 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \color{medgreen}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \color{black}
-        \item[3.4] Projekt organisieren: make
-%        \vspace*{-\smallskipamount}
-%        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{red}
-        \item[5.1] Differentialgleichungen
-        \color{black}
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\subsection{Der Präprozessor}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \lstinline{#include}: %\pause:
-  Text einbinden
-  \begin{itemize}
-%    \pause
-    \item
-      \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header
-%    \pause
-    \item
-      \lstinline{#include "pruzzel.h"}: auch aktuelles Verzeichnis -- eigene Header
-  \end{itemize}
-
-%  \pause
-  \bigskip
-
-  \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren
-  \begin{itemize}
-%    \pause
-    \item
-      Kein Semikolon!
-%    \pause
-    \item
-      Berechnungen in Klammern setzen:\\
-      \lstinline{#define VIER (2 + 2)}
-%    \pause
-    \item
-      Konvention: Großbuchstaben
-  \end{itemize}
-
-%  \pause
-  \bigskip
-
-  Nur Präprozessor laufen lassen:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -E hello-6.c¿
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{Bibliotheken einbinden}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  Inhalt der Header-Datei: externe Deklarationen
-
-%  \pause
-  \smallskip
-  \lstinline{extern int pruzzel (const char *s);}
-
-%  \pause
-  \smallskip
-  \lstinline{extern int printf (__const char *__restrict __format, ...);}
-
-%  \pause
-  \bigskip
-  Funktion wird "`anderswo"' definiert
-  \begin{itemize}
-%    \pause
-    \item
-      separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben
-%    \pause
-    \item
-      Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker}
-%    \pause
-    \item
-      vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\
-%      \pause
-      = Datei \file{libfoo.a} in Standard-Verzeichnis
-  \end{itemize}
-
-%  \pause
-  \bigskip
-
-  Quelltexte separat compilieren:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O hello-6.c -c¿
-    $ ¡gcc -Wall -O pruzzel.c -c¿
-    $ ¡gcc hello-6.o pruzzel.o -o hello-6.c¿
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{Bibliothek verwenden (Beispiel: GTK+)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      \lstinline{#include <gtk/gtk.h>}
-%    \pause
-    \smallskip
-    \item
-      Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\
-      welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc}
-      übergeben muß\alt<2->{.}{:}
-%      \pause
-      \begin{onlyenv}<1>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡pkg-config --cflags --libs gtk+-3.0¿
-          -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-
-          atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1
-          .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/
-          include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc
-          lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf
-          buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I
-          /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu
-          de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk
-          -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib
-          -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk
-          -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai
-          ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject
-          -2.0 -lglib-2.0
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \pause
-    \arrowitem
-      Compiler-Aufruf:
-      \begin{onlyenv}<2>
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk-
-          3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp
-          i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g
-          nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu
-          de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa
-          ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.
-          0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in
-          clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/
-          libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l
-          ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux
-          -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0
-          -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix
-          buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-      \begin{onlyenv}<3->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs)
-                 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-  \end{itemize}
-  \pause[3]
-  \begin{picture}(0,0)
-    \color{red}
-    \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}}
-    \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\
-                     \strut u.\,a.\ viele Include-Verzeichnisse:\\
-                     \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}}
-    \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}}
-    \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\
-                      \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      /* Zeichenbefehle */
-      ...
-
-      return FALSE;
-    }
-  
-    ...
-
-    g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\
-      die Funktion \lstinline{draw} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}}
-    \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\
-                    \strut Bildschirm, auf den\\
-                    \strut gezeichnet werden soll}}}
-    \pause
-    \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}}
-    \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\
-                    \strut für draw(), typischerweise\\
-                    \strut ein Zeiger auf ein struct}}}
-    \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Selbst geschriebene Funktion übergeben: \newterm{Callback}
-
-  \bigskip
-
-  \begin{lstlisting}[xleftmargin=1em]
-    gboolean timer (GtkWidget *widget)
-    {
-      /* Rechenbefehle */
-      ...
-
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-  
-    ...
-
-    g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-  \end{lstlisting}
-
-  \medskip
-
-  \begin{itemize}
-    \arrowitem 
-      GTK+ ruft nach 50 Millisekunden
-      die Funktion \lstinline{timer} auf.
-  \end{itemize}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\
-                    \strut neu gezeichnet werden.}}}
-    \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}}
-    \pause
-    \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}}
-    \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\
-                    \strut die Funktion erneut aufgerufen werden.}}}
-    \pause
-    \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}}
-    \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\
-                    \strut eines Zeigers (später)}}}
-  \end{picture}
-
-\end{frame}
-
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -- Schräger Wurf
-
-  \strut\hfill
-  \begin{minipage}{2.5cm}
-    \vspace*{0.6cm}
-    \begin{align*}
-      x'(t) &= v_x(t) \\[0.65cm]
-      y'(t) &= v_y(t) \\[0.75cm]
-      v_x'(t) &= 0 \\[0.65cm]
-      v_y'(t) &= -g
-    \end{align*}
-    \vspace*{0.0cm}
-  \end{minipage}%
-  \only<1>{\hspace*{9.49cm}}\strut
-  \only<2->{\hfill$\Rightarrow$\hfill}%
-  \begin{onlyenv}<2-8>
-    \begin{minipage}{8.3cm}
-      \begin{align*}
-        x(t) &= \int v_x(t)\,dt
-          \visible<4->{= \int v_{0x}\,dt}
-          \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount]
-        y(t) &= \int v_y(t)\,dt
-          \visible<7->{= \int v_{0y} - g\cdot t\,dt}
-          \visible<8->{= y_0 + v_{0y}\cdot t
-                         - {\textstyle\frac12}gt^2}\\[\bigskipamount]
-        v_x(t) &= \int 0\,dt
-          \visible<3->{= v_{0x}} \\[\medskipamount]
-        v_y(t) &= \int -g\,dt
-          \visible<6->{= v_{0y} - g\cdot t}
-      \end{align*}
-    \end{minipage}%
-  \end{onlyenv}%
-  \begin{onlyenv}<9->
-    \begin{minipage}{3.5cm}
-      \vspace*{0.5cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡x += vx * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡y += vy * dt;¿
-      \end{lstlisting}
-      \vspace{0.90cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vx += 0 * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vy += -g * dt;¿
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{5.13cm}
-      Siehe: \file{gtk-16.c}
-    \end{minipage}
-  \end{onlyenv}%
-  \hfill\strut
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \medskip
-
-  \textbf{Beispiel 2: Mathematisches Pendel}
-
-  \vspace*{-2\bigskipamount}
-
-  \begin{picture}(0,0)
-    \put(8,-6.5){\includegraphics{pendulum.pdf}}
-  \end{picture}
-
-  \begin{eqnarray*}
-    \varphi'(t) &=& \omega(t) \\[\smallskipamount]
-    \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm}
-  \end{eqnarray*}
-  \vspace*{-1.5\medskipamount}
-  \begin{itemize}
-    \item
-      Von Hand (analytisch):\\
-      Lösung raten (Ansatz), Parameter berechnen
-    \item
-      Mit Computer (numerisch):\\
-      Eulersches Polygonzugverfahren
-  \end{itemize}
-  \smallskip
-  \begin{lstlisting}[gobble=0]
-    phi += dt * omega;
-    omega += - dt * g / l * sin (phi);
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  \textbf{Beispiel 3:} Praktikumsaufgabe
-
-\end{frame}
-
-\end{document}
diff --git a/20191205/hp-musterloesung-20191205.pdf b/20191205/hp-musterloesung-20191205.pdf
deleted file mode 100644
index 04cabb8d820e60a4e8eea3be1d596e9dafb89ffc..0000000000000000000000000000000000000000
Binary files a/20191205/hp-musterloesung-20191205.pdf and /dev/null differ
diff --git a/20191205/hp-musterloesung-20191205.tex b/20191205/hp-musterloesung-20191205.tex
deleted file mode 100644
index 7c1c21a6fa0de9ba870510a2c1c9d6986027e662..0000000000000000000000000000000000000000
--- a/20191205/hp-musterloesung-20191205.tex
+++ /dev/null
@@ -1,235 +0,0 @@
-% hp-musterloesung-20191205.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Löschen aus Strings, Hexdumps
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 5.\ Dezember 2019}
-
-  \exercise{Löschen aus Strings}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20191205}{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void delete_char_from_string (char *s, int pos)
-    {
-      for (int i = strlen (s) - 1; i > pos; i--)
-        s[i - 1] = s[i];
-    }
-
-    int main (void)
-    {
-      char test[] = "Hochschule Boochum";
-      delete_char_from_string (test, 12);
-      printf ("%s\n", test);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe des Programms lautet:
-  \lstinline[style=terminal]{Hochschule Bmmmmmm}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie, wie die Ausgabe zustandekommt.
-      \points{3}
-%      \workspace{12}
-    \item
-      Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um,
-      daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos}
-      löscht.\par
-      Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.
-      \points{4}
-%      \workspace{15}
-    \item
-      Was kann passieren, wenn Sie 
-      \lstinline{char test[] = "Hochschule Boochum";} \\
-      durch
-      \lstinline{char *test = "Hochschule Boochum";}
-      ersetzen? Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{9}
-    \item
-      Schreiben Sie eine Funktion
-      \lstinline{void delete_from_string (char *s, int pos, int length)},
-      die \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-      \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/}
-      \lstinline{void delete_char_from_string (char *s, int pos)}
-      \emph{wiederholt aufruft}. \par
-%      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
-%      arbeitet diese Funktion
-%      \lstinline{delete_from_string()}?
-%      Begründen Sie Ihre Antwort.
-%      \points{3}
-      \points{2}
-%      \workspace{15}
-    \item
-      Schreiben Sie eine \emph{optimierte\/} Funktion
-      \lstinline{void quick_delete_from_string (char *s, int pos, int length)},
-      die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-%      dafür aber höchstens $\mathcal{O}(n)$ an Rechenzeit benötigt.
-      aber mit einer einzigen Schleife auskommt.
-      \points{4}
-%      \workspace{15}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie, wie die Ausgabe zustandekommt.}
-
-      Die Zuweisung innerhalb der Schleife (Zeile 7)
-      kopiert ein Zeichen des Strings von rechts nach links.
-      Die Schleife läuft ebenfalls von rechts nach links
-      (\lstinline{i--} in Zeile 6).
-      Beides zusammen bewirkt, daß das Zeichen ganz rechts im String
-      (\lstinline{'m'}) immer weiter nach links kopiert wird
-      bis einschließlich zu Stelle \lstinline{pos}.
-      (Die Schleife endet zwar bereits vor \lstinline{pos} (\lstinline{i > pos}),
-      aber die Zuweisung erfolgt an die Stelle \lstinline{i - 1}).
-
-      Da das Stringendesymbol nicht verschoben wird,
-      ändert sich die Länge des Strings nicht.
-
-    \item
-      \textbf{Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um,
-      daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos}
-      löscht.}\par
-      \textbf{Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.}
-
-      Siehe \gitfile{hp}{20191205}{loesung-1b-1.c}.
-      Geändert wurden die Zeilen 6 und 7.
-      Die Schleife muß von links nach rechts gehen anstatt von rechts nach links,
-      und sie muß das Stringendesymbol mit erfassen.
-
-      Alternativ kann man auch nur Zeile 6 ändern,
-      siehe \gitfile{hp}{20191205}{loesung-1b-2.c}.
-
-    \item
-      \textbf{Was kann passieren, wenn Sie 
-      \lstinline{char test[] = "Hochschule Boochum";} \\
-      durch
-      \lstinline{char *test = "Hochschule Boochum";}
-      ersetzen? Begründen Sie Ihre Antwort.}
-
-      Das Array \lstinline{test[]} ist eine für das Programm schreibbare Variable.
-      Dies ist notwendig, um aus dem String ein Zeichen entfernen zu können.
-
-      Bei \lstinline{*test} ist nur der Zeiger selbst eine schreibbare Variable.
-      Die String-Konstante, auf die der Zeiger zeigt, ist typischerweise nur lesbar.
-      Der Versuch, aus diesem String ein Zeichen zu entfernen,
-      endet daher typischerweise in einem Speicherzugriffsfehler.
-
-    \item
-      \textbf{Schreiben Sie eine Funktion
-      \lstinline{void delete_from_string (char *s, int pos, int length)},
-      die \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-      \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/}
-      \lstinline{void delete_char_from_string (char *s, int pos)}
-      \emph{wiederholt aufruft}.}
-
-      Siehe \gitfile{hp}{20191205}{loesung-1d.c}.
-
-    \item
-      \textbf{Schreiben Sie eine \emph{optimierte\/} Funktion
-      \lstinline{void quick_delete_from_string (char *s, int pos, int}\break
-      \lstinline{length)},
-      die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-      aber mit einer einzigen Schleife auskommt.}
-
-      Die Funktion \lstinline{strlen()} ermittelt die Länge eines Strings,
-      indem sie den String von seinem Anfang bis zum Stringendesymbol durchgeht.
-      Der Aufruf von \lstinline{strlen()} innerhalb der Schleifenbedingung
-      (Zeile 6) enthält daher implizit eine weitere Schleife.
-
-      Wesentlich effizienter ist es,
-      wenn wir während des Durchlaufs unserer eigenen Schleife
-      selbst auf das Stringendesymbol achten und es als Abbruchkriterium verwenden
-      -- siehe \gitfile{hp}{20191205}{loesung-1e.c}.
-  \end{enumerate}
-
-  \exercise{Hexdumps}
-
-  Das folgende Programm (\gitfile{hp}{20191205}{aufgabe-2.c}) liest
-  einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus.
-  (Anders als z.\,B.\ \lstinline{scanf()}
-  akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen,
-  und sie vermeidet Pufferüberläufe.)
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char buffer[100];
-      fgets (buffer, 100, stdin);
-      for (char *p = buffer; *p; p++)
-        printf ("%02x", *p);
-      printf ("\n");
-    }
-  \end{lstlisting}
-  Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.}
-  erscheint die Ausgabe\\
-  \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}.
-
-  Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt,
-  also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a}
-  wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt.
-
-  \points{6}
-
-  Hinweis für die Klausur:
-  Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.
-
-  \solution
-
-  Siehe \gitfile{hp}{20191205}{loesung-2.c}.
-
-  Das Programm macht mehrfach davon Gebrauch,
-  daß in C Zeichen und Zahlen äquivalent sind.
-  Wenn z.\,B.\ die \lstinline{char}-Variable \lstinline{c}
-  den Wert \lstinline{'3'} (Ziffer 3) enthält,
-  dann hat der Ausdruck \lstinline{c - '0'} den Wert \lstinline{3} (Zahlenwert 3).
-  Hierfür ist es insbesondere nicht nötig, vorauszusetzen,
-  daß wir den ASCII-Zeichensatz verwenden und \lstinline{'0'}
-  den Wert \lstinline{48} hat.
-
-  Bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a}
-  gibt das Programm zusätzlich eine Leerzeile aus.
-  Die liegt daran, daß das \lstinline[style=cmd]{0a} am Ende
-  bereits eine Zeilenschaltung enthält und das Programm mit
-  \lstinline{printf ("\n")} eine zusätzliche Zeilenschaltung ausgibt.
-
-\end{document}
diff --git a/20191205/hp-uebung-20191205.pdf b/20191205/hp-uebung-20191205.pdf
deleted file mode 100644
index f08bca1e0441b3cf78bf8c9d7d665861b1efbcc4..0000000000000000000000000000000000000000
Binary files a/20191205/hp-uebung-20191205.pdf and /dev/null differ
diff --git a/20191205/hp-uebung-20191205.tex b/20191205/hp-uebung-20191205.tex
deleted file mode 100644
index 96c788e30aa8cf9c5bbf71e5eb1f8d825888bf07..0000000000000000000000000000000000000000
--- a/20191205/hp-uebung-20191205.tex
+++ /dev/null
@@ -1,153 +0,0 @@
-% hp-uebung-20191205.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Löschen aus Strings, Hexdumps
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 5.\ Dezember 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  10 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Löschen aus Strings}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20191205}{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void delete_char_from_string (char *s, int pos)
-    {
-      for (int i = strlen (s) - 1; i > pos; i--)
-        s[i - 1] = s[i];
-    }
-
-    int main (void)
-    {
-      char test[] = "Hochschule Boochum";
-      delete_char_from_string (test, 12);
-      printf ("%s\n", test);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe des Programms lautet:
-  \lstinline[style=terminal]{Hochschule Bmmmmmm}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie, wie die Ausgabe zustandekommt.
-      \points{3}
-%      \workspace{12}
-    \item
-      Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um,
-      daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos}
-      löscht.\par
-      Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.
-      \points{4}
-%      \workspace{15}
-    \item
-      Was kann passieren, wenn Sie 
-      \lstinline{char test[] = "Hochschule Boochum";} \\
-      durch
-      \lstinline{char *test = "Hochschule Boochum";}
-      ersetzen? Begründen Sie Ihre Antwort.
-      \points{2}
-%      \workspace{9}
-    \item
-      Schreiben Sie eine Funktion
-      \lstinline{void delete_from_string (char *s, int pos, int length)},
-      die \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-      \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/}
-      \lstinline{void delete_char_from_string (char *s, int pos)}
-      \emph{wiederholt aufruft}. \par
-%      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
-%      arbeitet diese Funktion
-%      \lstinline{delete_from_string()}?
-%      Begründen Sie Ihre Antwort.
-%      \points{3}
-      \points{2}
-%      \workspace{15}
-    \item
-      Schreiben Sie eine \emph{optimierte\/} Funktion
-      \lstinline{void quick_delete_from_string (char *s, int pos, int length)},
-      die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
-      aus dem String \lstinline{s} löscht,
-%      dafür aber höchstens $\mathcal{O}(n)$ an Rechenzeit benötigt.
-      aber mit einer einzigen Schleife auskommt.
-      \points{4}
-%      \workspace{15}
-  \end{enumerate}
-
-  \clearpage
-  \exercise{Hexdumps}
-
-  Das folgende Programm (\gitfile{hp}{20191205}{aufgabe-2.c}) liest
-  einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus.
-  (Anders als z.\,B.\ \lstinline{scanf()}
-  akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen,
-  und sie vermeidet Pufferüberläufe.)
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char buffer[100];
-      fgets (buffer, 100, stdin);
-      for (char *p = buffer; *p; p++)
-        printf ("%02x", *p);
-      printf ("\n");
-    }
-  \end{lstlisting}
-  Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.}
-  erscheint die Ausgabe\\
-  \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}.
-
-  Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt,
-  also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a}
-  wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt.
-
-  \points{6}
-
-  Hinweis für die Klausur:
-  Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191205/loesung-1b-1.c b/20191205/loesung-1b-1.c
deleted file mode 100644
index 9fe99b843731d937878761b6217635506d2821d4..0000000000000000000000000000000000000000
--- a/20191205/loesung-1b-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void delete_char_from_string (char *s, int pos)
-{
-  for (int i = pos; i < strlen (s); i++)
-    s[i] = s[i + 1];
-}
-
-int main (void)
-{
-  char test[] = "Hochschule Boochum";
-  delete_char_from_string (test, 12);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191205/loesung-1b-2.c b/20191205/loesung-1b-2.c
deleted file mode 100644
index 04c152e34637ae7f8c0abfec8ac0e3cd8faae2eb..0000000000000000000000000000000000000000
--- a/20191205/loesung-1b-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void delete_char_from_string (char *s, int pos)
-{
-  for (int i = pos + 1; i <= strlen (s); i++)
-    s[i - 1] = s[i];
-}
-
-int main (void)
-{
-  char test[] = "Hochschule Boochum";
-  delete_char_from_string (test, 12);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191205/loesung-1d.c b/20191205/loesung-1d.c
deleted file mode 100644
index 445d49ed2d21751b7a051a5d9e223f64726b21c6..0000000000000000000000000000000000000000
--- a/20191205/loesung-1d.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void delete_char_from_string (char *s, int pos)
-{
-  for (int i = pos; i < strlen (s); i++)
-    s[i] = s[i + 1];
-}
-
-void delete_from_string (char *s, int pos, int length)
-{
-  for (int i = 0; i < length; i++)
-    delete_char_from_string (s, pos);
-}
-
-int main (void)
-{
-  char test[] = "Hochschule Boochum";
-  delete_from_string (test, 12, 3);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191205/loesung-1e.c b/20191205/loesung-1e.c
deleted file mode 100644
index 060d2031759e8cd754ab67a764b727c27a731c44..0000000000000000000000000000000000000000
--- a/20191205/loesung-1e.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void quick_delete_char_from_string (char *s, int pos)
-{
-  for (int i = pos; s[i]; i++)
-    s[i] = s[i + 1];
-}
-
-int main (void)
-{
-  char test[] = "Hochschule Boochum";
-  quick_delete_char_from_string (test, 12);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/20191205/loesung-2.c b/20191205/loesung-2.c
deleted file mode 100644
index 872058ac9fecdcb59ac1104ca67841cb3dc974a9..0000000000000000000000000000000000000000
--- a/20191205/loesung-2.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-int read_hex (char c)
-{
-  if (c >= '0' && c <= '9')
-    return c - '0';
-  else if (c >= 'A' && c <= 'F')
-    return c - 'A' + 10;
-  else if (c >= 'a' && c <= 'f')
-    return c - 'a' + 10;
-  else
-    {
-      fprintf (stderr, "invalid hex digit '%c'\n", c);
-      return 0;
-    }
-}
-
-int main (void)
-{
-  char buffer[100];
-  fgets (buffer, 100, stdin);
-  for (char *p = buffer; p[0] && p[1]; p += 2)
-    {
-      char c = 16 * read_hex (p[0]) + read_hex (p[1]);
-      printf ("%c", c);
-    }
-  printf ("\n");
-}
diff --git a/20191205/logo-hochschule-bochum-cvh-text-v2.pdf b/20191205/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20191205/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20191205/logo-hochschule-bochum.pdf b/20191205/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20191205/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20191205/pendulum-0.c b/20191205/pendulum-0.c
deleted file mode 100644
index 6faebdc7ad779d89ab8e2eacd189240ace1fb406..0000000000000000000000000000000000000000
--- a/20191205/pendulum-0.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <gtk/gtk.h>
-#include <math.h>
-
-int width = 320;
-int height = 240;
-int gap = height / 20;
-int r = gap;
-double visual_length = height - 2 * gap - r;
-
-double phi0 = -0.5;
-double omega0 = 0.0;
-double t0 = 0.0;
-double g = 9.81;
-double l = 1.0;
-double dt = 0.02;
-
-double t = t0;
-double phi = phi0;
-double omega = omega0;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-
-  int x = width / 2 + visual_length * sin (phi);
-  int y = gap + visual_length * cos (phi);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, width / 2, gap);
-  cairo_line_to (c, x, y);
-  cairo_stroke (c);
-  cairo_arc (c, x, y, r, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  t += dt;
-  phi += omega * dt;
-  omega += - dt * g / l * sin (phi);
-
-  gtk_widget_queue_draw_area (widget, 0, 0, width, height);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_show (window);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_widget_show (drawing_area);
-  gtk_container_add (GTK_CONTAINER (window), drawing_area);
-  gtk_widget_set_size_request (drawing_area, width, height);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/pendulum-1.c b/20191205/pendulum-1.c
deleted file mode 100644
index 44f4c4fde79d96ed604882b0d5ce22a9035e1400..0000000000000000000000000000000000000000
--- a/20191205/pendulum-1.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <gtk/gtk.h>
-#include <math.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-#define GAP (HEIGHT / 20)
-#define r GAP
-#define visual_length (HEIGHT - 2 * GAP - r)
-
-#define phi0 (-0.5)
-#define omega0 0.0
-#define t0 0.0
-#define g 9.81
-#define l 1.0
-#define dt 0.02
-
-double t = t0;
-double phi = phi0;
-double omega = omega0;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-
-  int x = WIDTH / 2 + visual_length * sin (phi);
-  int y = GAP + visual_length * cos (phi);
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_move_to (c, WIDTH / 2, 10);
-  cairo_line_to (c, x, y);
-  cairo_stroke (c);
-  cairo_arc (c, x, y, r, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  t += dt;
-  phi += omega * dt;
-  omega += - dt * g / l * sin (phi);
-
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_show (window);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_widget_show (drawing_area);
-  gtk_container_add (GTK_CONTAINER (window), drawing_area);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/pendulum-2.c b/20191205/pendulum-2.c
deleted file mode 100644
index 4fbad9a50cc595e92fbb1075dd01405a08e84001..0000000000000000000000000000000000000000
--- a/20191205/pendulum-2.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <gtk/gtk.h>
-#include <math.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-#define GAP (HEIGHT / 20)
-#define r GAP
-#define visual_length (HEIGHT - 2 * GAP - r)
-
-#define phi0 (-0.5)
-#define omega0 0.0
-#define t0 0.0
-#define g 9.81
-#define l 1.0
-#define dt 0.02
-
-double t = t0;
-double phi = phi0;
-double omega = omega0;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 };
-
-  int x = WIDTH / 2 + visual_length * sin (phi);
-  int y = GAP + visual_length * cos (phi);
-
-  gdk_cairo_set_source_rgba (c, &orange);
-  cairo_move_to (c, WIDTH / 2, 10);
-  cairo_line_to (c, x, y);
-  cairo_stroke (c);
-  cairo_arc (c, x, y, r, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  t += dt;
-  phi += omega * dt;
-  omega += - dt * g / l * phi;
-
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_show (window);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_widget_show (drawing_area);
-  gtk_container_add (GTK_CONTAINER (window), drawing_area);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/pendulum-3.c b/20191205/pendulum-3.c
deleted file mode 100644
index 35b0b67aeb0d11aa2a81aba204c97ca96504ad89..0000000000000000000000000000000000000000
--- a/20191205/pendulum-3.c
+++ /dev/null
@@ -1,86 +0,0 @@
-#include <gtk/gtk.h>
-#include <math.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-#define GAP (HEIGHT / 20)
-#define r GAP
-#define visual_length (HEIGHT - 2 * GAP - r)
-
-#define phi0 (-0.5)
-#define omega0 0.0
-#define t0 0.0
-#define g 9.81
-#define l 1.0
-#define dt 0.02
-
-double t = t0;
-double phi_with_sin = phi0;
-double omega_with_sin= omega0;
-double phi_without_sin = phi0;
-double omega_without_sin= omega0;
-
-void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour)
-{
-  int x = WIDTH / 2 + visual_length * sin (phi);
-  int y = GAP + visual_length * cos (phi);
-
-  gdk_cairo_set_source_rgba (c, colour);
-  cairo_move_to (c, WIDTH / 2, 10);
-  cairo_line_to (c, x, y);
-  cairo_stroke (c);
-  cairo_arc (c, x, y, r, 0, 2 * G_PI);
-  cairo_fill (c);
-}
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue   = { 0.0, 0.5, 1.0, 1.0 };
-  GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 };
-  GdkRGBA green  = { 0.0, 0.5, 0.0, 1.0 };
-
-  double A = phi0;
-  double B = 0.5 * M_PI;  /* 90° */
-  double phi_analytic = A * sin (sqrt (g / l) * t + B);
-
-  draw_pendulum (c, phi_with_sin, &blue);
-  draw_pendulum (c, phi_without_sin, &orange);
-  draw_pendulum (c, phi_analytic, &green);
-
-  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
-                    FALSE to propagate the event further. */
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  t += dt;
-  phi_with_sin += omega_with_sin * dt;
-  omega_with_sin += - dt * g / l * sin (phi_with_sin);
-  phi_without_sin += omega_without_sin * dt;
-  omega_without_sin += - dt * g / l * phi_without_sin;
-
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_show (window);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_widget_show (drawing_area);
-  gtk_container_add (GTK_CONTAINER (window), drawing_area);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
-
-  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
-
-  gtk_main ();
-  return 0;
-}
diff --git a/20191205/pendulum.pdf b/20191205/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20191205/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20191205/pgscript.sty b/20191205/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191205/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191205/pgslides.sty b/20191205/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191205/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191205/photo-20191205-171706.jpg b/20191205/photo-20191205-171706.jpg
deleted file mode 100644
index b9783584460a8f8d659c4eea2b0e676268cd83e0..0000000000000000000000000000000000000000
Binary files a/20191205/photo-20191205-171706.jpg and /dev/null differ
diff --git a/20191205/photo-20191205-171706.txt b/20191205/photo-20191205-171706.txt
deleted file mode 100644
index db0f9c7de8cc180ed7ebd4bc5527c9ac20da0bb8..0000000000000000000000000000000000000000
--- a/20191205/photo-20191205-171706.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Schräger Wurf
diff --git a/20191212/Makefile-0 b/20191212/Makefile-0
deleted file mode 100644
index cc29dc9f8d2298b455e310e1a713fb4f704e0716..0000000000000000000000000000000000000000
--- a/20191212/Makefile-0
+++ /dev/null
@@ -1,8 +0,0 @@
-hello-6: hello-6.o pruzzel.o
-	gcc hello-6.o pruzzel.o -o hello-6
-
-hello-6.o: hello-6.c
-	gcc -Wall -O hello-6.c -c
-
-pruzzel.o: pruzzel.c
-	gcc -Wall -O pruzzel.c -c
diff --git a/20191212/Makefile-1 b/20191212/Makefile-1
deleted file mode 100644
index 78042b9f4f3c63a0ef2c70bbc2844f046c577ee8..0000000000000000000000000000000000000000
--- a/20191212/Makefile-1
+++ /dev/null
@@ -1,8 +0,0 @@
-hello-6: hello-6.o pruzzel.o
-	gcc hello-6.o pruzzel.o -o hello-6
-
-hello-6.o: hello-6.c pruzzel.h
-	gcc -Wall -O hello-6.c -c
-
-pruzzel.o: pruzzel.c pruzzel.h
-	gcc -Wall -O pruzzel.c -c
diff --git a/20191212/Makefile-2 b/20191212/Makefile-2
deleted file mode 100644
index 9c5c4bc67471500842f3d1ee985ced87265ab592..0000000000000000000000000000000000000000
--- a/20191212/Makefile-2
+++ /dev/null
@@ -1,13 +0,0 @@
-TARGET = hello-6
-OBJECTS = hello-6.o pruzzel.o
-HEADERS = pruzzel.h
-CFLAGS = -Wall -O
-
-$(TARGET): $(OBJECTS)
-	gcc $(OBJECTS) -o $(TARGET)
-
-%.o: %.c $(HEADERS)
-	gcc $(CFLAGS) $< -c
-
-clean:
-	rm -f $(OBJECTS) $(TARGET)
diff --git a/20191212/aufgabe-2.c b/20191212/aufgabe-2.c
deleted file mode 100644
index 5b0cb23fdd5ee15a4403808c18d2104ed49caf3f..0000000000000000000000000000000000000000
--- a/20191212/aufgabe-2.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include <gtk/gtk.h>
-
-#define WIDTH 320
-#define HEIGHT 240
-
-double t = 0.0;
-double dt = 0.2;
-
-int r = 5;
-
-double x = 10;
-double y = 200;
-double vx = 20;
-double vy = -60;
-double g = 9.81;
-
-gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-{
-  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-
-  gdk_cairo_set_source_rgba (c, &blue);
-  cairo_arc (c, x, y, r, 0, 2 * G_PI);
-  cairo_fill (c);
-
-  return FALSE;
-}
-
-gboolean timer (GtkWidget *widget)
-{
-  t += dt;
-  x += vx * dt;
-  y += vy * dt;
-  vx = vx;
-  vy = 0.5 * g * (t * t);
-  if (y + r >= HEIGHT)
-    vy = -vy * 0.9;
-  if (x + r >= WIDTH)
-    vx = -vx * 0.9;
-  if (x - r <= 0)
-    vx = -vx * 0.9;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (50, (GSourceFunc) timer, widget);
-  return FALSE;
-}
-
-int main (int argc, char **argv)
-{
-  gtk_init (&argc, &argv);
-
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_show (window);
-  gtk_window_set_title (GTK_WINDOW (window), "Hello");
-  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-  GtkWidget *drawing_area = gtk_drawing_area_new ();
-  gtk_widget_show (drawing_area);
-  gtk_container_add (GTK_CONTAINER (window), drawing_area);
-  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-  gtk_main ();
-  return 0;
-}
diff --git a/20191212/blink-3.c b/20191212/blink-3.c
deleted file mode 100644
index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000
--- a/20191212/blink-3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x01;
-  PORTD = 0x01;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x01;
-    }
-  return 0;
-}
diff --git a/20191212/hello-6.c b/20191212/hello-6.c
deleted file mode 100644
index c160a51f7a3c73664fdc20dd3a21429a77142644..0000000000000000000000000000000000000000
--- a/20191212/hello-6.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pruzzel.h"
-
-int main (void)
-{
-  pruzzel ("Hello, world!\n");
-  return 0;
-}
diff --git a/20191212/hp-20191212.pdf b/20191212/hp-20191212.pdf
deleted file mode 100644
index fb871bfd2d50562bc0429b3c25e19c07eaf1e75f..0000000000000000000000000000000000000000
Binary files a/20191212/hp-20191212.pdf and /dev/null differ
diff --git a/20191212/hp-20191212.tex b/20191212/hp-20191212.tex
deleted file mode 100644
index 92d6c381cc9629cb6ca5b64a1ae0a1485f032ec9..0000000000000000000000000000000000000000
--- a/20191212/hp-20191212.tex
+++ /dev/null
@@ -1,716 +0,0 @@
-% hp-20191212.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: make, Byte-Reihenfolge - Endianness
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{12.\ Dezember 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \color{red}
-        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \vspace*{-0.1cm}
-        \item[\dots]
-%        \item[4.3] Interrupts
-        \color{orange}
-        \item[4.4] volatile-Variable
-        \color{red}
-        \item[4.6] Byte-Reihenfolge -- Endianness
-        \item[4.7] Binärdarstellung negativer Zahlen
-        \item[4.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Differentialgleichungen
-        \color{black}
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -- Schräger Wurf
-
-  \strut\hfill
-  \begin{minipage}{2.5cm}
-    \vspace*{0.6cm}
-    \begin{align*}
-      x'(t) &= v_x(t) \\[0.65cm]
-      y'(t) &= v_y(t) \\[0.75cm]
-      v_x'(t) &= 0 \\[0.65cm]
-      v_y'(t) &= -g
-    \end{align*}
-    \vspace*{0.0cm}
-  \end{minipage}%
-%  \only<1>{\hspace*{9.49cm}}\strut
-  \only<1->{\hfill$\Rightarrow$\hfill}%
-  \begin{onlyenv}<1>
-    \begin{minipage}{8.3cm}
-      \begin{align*}
-        x(t) &= \int v_x(t)\,dt
-          \visible<1>{= \int v_{0x}\,dt}
-          \visible<1>{= x_0 + v_{0x}\cdot t}\\[\medskipamount]
-        y(t) &= \int v_y(t)\,dt
-          \visible<1>{= \int v_{0y} - g\cdot t\,dt}
-          \visible<1>{= y_0 + v_{0y}\cdot t
-                         - {\textstyle\frac12}gt^2}\\[\bigskipamount]
-        v_x(t) &= \int 0\,dt
-          \visible<1>{= v_{0x}} \\[\medskipamount]
-        v_y(t) &= \int -g\,dt
-          \visible<1>{= v_{0y} - g\cdot t}
-      \end{align*}
-    \end{minipage}%
-  \end{onlyenv}%
-  \begin{onlyenv}<2>
-    \begin{minipage}{3.5cm}
-      \vspace*{0.5cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡x += vx * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡y += vy * dt;¿
-      \end{lstlisting}
-      \vspace{0.90cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vx += 0 * dt;¿
-      \end{lstlisting}
-      \vspace{0.75cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=0.5em]
-        ¡vy += -g * dt;¿
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{5.13cm}
-      Siehe: \file{gtk-16.c}
-    \end{minipage}
-  \end{onlyenv}%
-  \hfill\strut
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsection
-  \showsubsection
-
-  \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung}
-
-  \medskip
-
-  \textbf{Beispiel 2: Mathematisches Pendel}
-
-  \vspace*{-2\bigskipamount}
-
-  \begin{picture}(0,0)
-    \put(8,-6.5){\includegraphics{pendulum.pdf}}
-  \end{picture}
-
-  \begin{eqnarray*}
-    \varphi'(t) &=& \omega(t) \\[\smallskipamount]
-    \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm}
-  \end{eqnarray*}
-  \vspace*{-1.5\medskipamount}
-  \begin{itemize}
-    \item
-      Von Hand (analytisch):\\
-      Lösung raten (Ansatz), Parameter berechnen
-    \item
-      Mit Computer (numerisch):\\
-      Eulersches Polygonzugverfahren
-  \end{itemize}
-  \smallskip
-  \begin{lstlisting}[gobble=0]
-    phi += dt * omega;
-    omega += - dt * g / l * sin (phi);
-  \end{lstlisting}
-
-%  \pause
-  \bigskip
-
-  \textbf{Beispiel 3:} Praktikumsaufgabe
-
-\end{frame}
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\setcounter{subsection}{3}
-\subsection{Projekt organisieren: make}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \begin{itemize}
-    \item
-      \only<4->{explizite und implizite} Regeln
-      \begin{onlyenv}<2>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          hello-6: hello-6.o pruzzel.o
-                  gcc hello-6.o pruzzel.o -o hello-6
-
-          pruzzel.o: pruzzel.c pruzzel.h
-                  gcc -Wall -O pruzzel.c -c
-
-          hello-6.o: hello-6.c pruzzel.h
-                  gcc -Wall -O hello-6.c -c
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<4>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = hello-6
-          OBJECTS = hello-6.o pruzzel.o
-          HEADERS = pruzzel.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          %.o: %.c $(HEADERS)
-                  gcc $(CFLAGS) $< -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-      \end{onlyenv}
-    \item
-      Makros
-      \begin{onlyenv}<3>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = hello-6
-          OBJECTS = hello-6.o pruzzel.o
-          HEADERS = pruzzel.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          pruzzel.o: pruzzel.c $(HEADERS)
-                  gcc $(CFLAGS) pruzzel.c -c
-
-          hello-6.o: hello-6.c $(HEADERS)
-                  gcc $(CFLAGS) hello-6.c -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \begin{onlyenv}<5->
-      \smallskip
-      \arrowitem
-        3 Sprachen: C, Präprozessor, make
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\setcounter{subsection}{3}
-\subsection{volatile-Variable}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster
-
-  \vspace*{-2.5pt}
-
-  \begin{minipage}[t]{5cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        volatile uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        ...
-
-        while (1)
-          {
-            while (!key_pressed)
-              ;  /* just wait */
-            PORTD ^= 0x40;
-            key_pressed = 0;
-          }
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm}
-        \begin{center}
-          \textbf{volatile}:\\
-          Speicherzugriff\\
-          nicht wegoptimieren
-        \end{center}
-      \end{minipage}}}
-    \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Was ist eigentlich \lstinline{PORTD}?
-
-  \bigskip
-  \pause
-
-  \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E}
-
-  \bigskip
-  \pause
-  \lstinline{PORTD = 0x01;}\\
-  \textarrow\quad
-  \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\
-  \pause
-  \begin{picture}(0,2)(0,-1.7)
-    \color{red}
-    \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$}
-    \pause
-    \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\
-      auf \lstinline|volatile uint8_t|}}}$}
-    \pause
-    \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}}
-    \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}}
-  \end{picture}
-
-  \pause
-  \textarrow\quad
-  \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B|
-
-  \pause
-  \bigskip
-  \bigskip
-
-  \textarrow\quad
-  \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee.
-
-\end{frame}
-
-\subsection{Byte-Reihenfolge -- Endianness}
-\subsubsection{Konzept}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \pause
-  \bigskip
-
-  $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$
-
-  \pause
-  \bigskip
-  Speicherzellen:
-
-  \medskip
-  \begin{tabular}{|c|c|l}\cline{1-2}
-    \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & \pause für Menschen leichter lesbar \pause \\
-    \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
-    \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & \pause bei Additionen effizienter
-  \end{tabular}
-
-  \pause
-  \medskip
-  \textarrow\ Geschmackssache
-  \pause\\
-  \quad\textbf{\dots\ außer bei Datenaustausch!}
-
-%  \pause
-%  \bigskip
-%
-%  Aber: nicht verwechseln! \qquad $0304_{16} = 772$
-
-\end{frame}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \medskip
-
-  \textarrow\ Geschmackssache\\
-  \textbf{\dots\ außer bei Datenaustausch!}
-
-  \begin{itemize}
-    \item
-      Dateiformate
-    \item
-      Datenübertragung
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Dateiformate}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen
-  \begin{itemize}
-    \item
-      RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
-    \item
-      Au-Dateien (\file{.au}): Big-Endian
-    \pause
-    \item
-      ältere AIFF-Dateien (\file{.aiff}): Big-Endian
-    \item
-      neuere AIFF-Dateien (\file{.aiff}): Little-Endian
-  \end{itemize}
-
-  \pause
-  \bigskip
-
-  Grafik-Formate: Reihenfolge der Bits in den Bytes
-  \begin{itemize}
-    \item
-      PBM-Dateien: Big-Endian\only<4->{, MSB first}
-    \item
-      XBM-Dateien: Little-Endian\only<4->{, LSB first}
-  \end{itemize}
-  \only<4->{MSB/LSB = most/least significant bit}
-
-\end{frame}
-
-\subsubsection{Datenübertragung}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  \begin{itemize}
-    \item
-      RS-232 (serielle Schnittstelle): LSB first
-    \item
-      I$^2$C: MSB first
-    \item
-      USB: beides
-    \pause
-    \medskip
-    \item
-      Ethernet: LSB first
-    \item
-      TCP/IP (Internet): Big-Endian
-  \end{itemize}
-
-\end{frame}
-
-\iffalse
-
-\subsection{Binärdarstellung negativer Zahlen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\
-  \pause
-  \textarrow\ 255 + 1 = 0
-
-  \pause
-  \medskip
-
-  8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\
-  \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\
-  \pause
-  \textarrow\ Zweierkomplement
-
-  \pause
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 127 + 1 = $-128$
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  16-Bit-Zahlen ohne Vorzeichen:
-  \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff}
-  = 0 bis 65535\hfill 0 bis 255\\
-  \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0
-
-  \medskip
-
-  16-Bit-Zahlen mit Vorzeichen:
-  \lstinline{int16_t}\hfill\lstinline{int8_t}\\
-  \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill
-  \lstinline{0xff} = 255 = $-1$\\
-  \textarrow\ Zweierkomplement
-
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 32767 + 1 = $-32768$
-
-  \bigskip
-  Literatur: \url{http://xkcd.com/571/}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Frage: \emph{Für welche Zahl steht der Speicherinhalt\,
-  \raisebox{2pt}{%
-    \tabcolsep0.25em
-    \begin{tabular}{|c|c|}\hline
-      \rule{0pt}{11pt}a3 & 90 \\\hline
-    \end{tabular}}
-  (hexadezimal)?}
-  
-  \pause
-  \smallskip
-  Antwort: \emph{Das kommt darauf an.} ;--)
-
-  \pause
-  \medskip
-  Little-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,: & $-28509$\\
-    als \lstinline,uint16_t,: & $37027$\\
-    \lstinline,int32_t, oder größer: & $37027$
-      & (zusätzliche Bytes mit Nullen aufgefüllt)
-  \end{tabular}
-
-  \pause
-  \medskip
-  Big-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,:   & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,:  & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,:  & $-23664$\\
-    als \lstinline,uint16_t,: & $41872$\\
-    als \lstinline,int32_t,:  & $-1550843904$ & (zusätzliche Bytes\\
-    als \lstinline,uint32_t,: & $2744123392$  & mit Nullen aufgefüllt)\\
-    als \lstinline,int64_t,:  & $-6660823848880963584$\\
-    als \lstinline,uint64_t,: & $11785920224828588032$\\
-  \end{tabular}
-
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Speicherausrichtung -- Alignment}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdint.h>
-
-    uint8_t a;
-    uint16_t b;
-    uint8_t c;
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"'
-  \begin{itemize}
-    \item
-      2-Byte-Operation: effizienter
-    \pause
-    \item
-      \dots\ oder sogar nur dann erlaubt
-    \pause
-    \arrowitem
-      Compiler optimiert Speicherausrichtung
-  \end{itemize}
-
-  \medskip
-
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t dummy;
-      uint16_t b;
-      uint8_t c;¿
-    \end{lstlisting}
-  \end{minipage}
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t c;
-      uint16_t b;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \vspace{-1.75cm}
-  \strut\hfill
-  \begin{minipage}{6.5cm}
-    Fazit:
-    \begin{itemize}
-      \item
-        \textbf{Adressen von Variablen\\
-        sind systemabhängig}
-      \item
-        Bei Definition von Datenformaten\\
-        Alignment beachten \textarrow\ effizienter
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\fi
-
-\end{document}
diff --git a/20191212/hp-2019ws-p3.pdf b/20191212/hp-2019ws-p3.pdf
deleted file mode 100644
index f549f7d5ba5a30f4cc25991dec6dc10e82757086..0000000000000000000000000000000000000000
Binary files a/20191212/hp-2019ws-p3.pdf and /dev/null differ
diff --git a/20191212/hp-2019ws-p3.tex b/20191212/hp-2019ws-p3.tex
deleted file mode 100644
index 3c90f913bee9b1eff89af4b9fc4acb76e142ab97..0000000000000000000000000000000000000000
--- a/20191212/hp-2019ws-p3.tex
+++ /dev/null
@@ -1,175 +0,0 @@
-% hp-2019ws-p1.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Versuch 3, 12. und 19.12.2019: Weltraum-Simulation
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{multicol}
-%\usepackage{sfmath}
-
-\sloppy
-\raggedcolumns
-\pagestyle{empty}
-\addtolength{\textheight}{1cm}
-\newcommand{\sep}{~$\cdot$~}
-\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
-
-\begin{document}
-
-  \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
-  \par\bigskip\bigskip
-  \begin{center}
-    \Large\textbf{Praktikumsversuch 3: Weltraum-Simulation}
-    \par\medskip
-    \normalsize Hardwarenahe Programmierung\sep
-    Wintersemester 2019/20\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Schreiben Sie ein C-Programm,
-  das die Bahnen von mindestens 3 Massenpunkten unter Einfluß der Gravitation
-  simuliert und in bewegter Grafik darstellt.
-
-  \begin{multicols}{2}
-
-    \begin{itemize}
-      \item
-        Zwei Massenpunkte ("`Himmelskörper"') mit den Massen $m_i$ und $m_j$
-        an den Orten $\vec{r}_i$ und $\vec{r}_j$ ziehen einander an.
-        Diese Kraft heißt Gravitation. Sie hat den Betrag:
-        \begin{equation}
-          |\vec{F}_{ij}| = \frac{m_j\cdot m_i\cdot G}{|\vec{r}_j - \vec{r}_i|^2}
-        \end{equation}
-        Hierbei ist $G$ eine Konstante (Gravitationskonstante).
-      \item
-        Die auf einen Himmelskörper wirkende Gesamtkraft $\vec{F}_i$
-        ergibt sich als Summe der von allen anderen Himmelskörpern herrührenden
-        Gravitationskräfte:
-        \begin{equation}
-          \vec{F}_i = \sum_{j=0,\,j\ne i}^{N - 1} \vec{F}_{ij}
-        \end{equation}
-      \item
-        Die Gravitationskraft beschleunigt jeden Himmelskörper gemäß:
-        \begin{equation}
-          \vec{F_i} = m_i\cdot \vec{a_i}
-        \end{equation}
-      \item
-        Beispiel: Wir betrachten zwei Himmelskörper. Einer davon ("`Zentralgestirn"')
-        ruht im Zentrum ($\vec{r}_0 = 0$, $\vec{v}_0 = 0$)
-        und hat eine wesentlich größere Masse als der andere
-        ("`Satellit"', $m_1 \ll m_0$).  Mit geeignetem Anfangsort $\vec{r}_1$
-        und geeigneter Anfangsgeschwindigkeit $\vec{v}_1$ beschreibt dann
-        der Satellit eine elliptische Umlaufbahn um das Zentralgestirn.
-      \item
-        Wir rechnen in zwei Dimensionen $x$ und $y$.
-      \item
-        Für die Zerlegung einer Kraft $\vec{F}_{ij}$ in $x$- und $y$-Komponenten
-        benötigen Sie nur die Grundrechenarten und die Wurzelfunktion,
-        jedoch insbesondere \emph{keine} trigonometrischen Funktionen:
-        \begin{equation}
-          \vec{F}_{ij} = |\vec{F}_{ij}| \cdot \frac{\vec{r}_j - \vec{r}_i}{|\vec{r}_j - \vec{r}_i|}
-        \end{equation}
-      \columnbreak
-      \item
-        Die Wurzelfunktion \lstinline{sqrt()} finden Sie
-        in der Mathematik-Bibliothek.
-        Um diese zu nutzen, verwenden Sie \lstinline{#include <math.h>} im Quelltext,
-        und geben Sie beim \lstinline[style=cmd]{gcc}-Aufruf
-        \lstinline[style=cmd]{-lm} mit an.
-      \item
-        Für die Simulation betrachten wir das System in kurzen Zeitintervallen $dt$
-        und berechnen die Änderungen des Ortes $\vec{r}_i = (x_i,y_i)$
-        und der Geschwindigkeit $\vec{v}_i = (v_{xi},v_{yi})$ jedes Himmelskörpers
-        mit Hilfe des expliziten Eulerschen Polygonzugverfahrens.
-        \par
-        (Wer möchte, darf natürlich auch andere Verfahren anwenden,
-        beispielsweise das klassische Runge-Kutta-Verfahren 4.~Ordnung.)
-      \item
-        Für eine derartige Simulation
-        einschließlich ihrer Darstellung als bewegte Grafik
-        können Sie sich von dem Beispiel-Programm \gitfile{hp}{20191205}{gtk-16.c}
-        inspirieren lassen. (Compilieren mit:
-        \lstinline[style=cmd]{gcc}
-        \lstinline[style=cmd]{-Wall}
-        \lstinline[style=cmd]{-O}
-        \lstinline[style=cmd]{gtk-16.c}
-        \lstinline[style=cmd]{$(pkg-config}
-        \lstinline[style=cmd]{--cflags}
-        \lstinline[style=cmd]{--libs}
-        \lstinline[style=cmd]{gtk+-3.0)}
-        \lstinline[style=cmd]{-o}
-        \lstinline[style=cmd]{gtk-16})
-      \item
-        In einer \file{GTK+}-\lstinline{drawing_area}
-        liegt der Nullpunkt der Zeichnung oben links,
-        eine Längeneinheit entspricht einem Pixel,
-        und die $y$-Koordinate wächst nach unten.
-        Es empfiehlt sich, die Koordinaten so umzurechnen,
-        daß der Nullpunkt in der Mitte der Zeichnung liegt,
-        die Längeneinheit Ihrem persönlichen Geschmack entspricht
-        und die $y$-Koordinate nach oben wächst.
-      \item
-        Beispiel-Szenarien für 3 oder mehr Körper:
-        \vspace{-\smallskipamount}
-        \begin{itemize}\itemsep0pt
-          \item 
-            Planet mit Mond umkreist Sonne
-          \item
-            Sonne mit mehreren Planeten, die sich gegenseitig beeinflussen
-          \item
-            zwei Sonnen umkreisen sich gegenseitig, Planet kreist drumherum
-          \item
-            Raumsonde besucht nacheinander mehrere Planeten
-        \end{itemize}
-    \end{itemize}
-
-    \bigskip
-
-    \strut\hfill\emph{Viel Erfolg!}\qquad\qquad
-
-  \end{multicols}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 10.\ Dezember 2019
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2018, 2019\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
-%    und Beispielprogramme\\
-    herunterladen unter:\\
-    \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-
-  \endgroup
-
-\end{document}
diff --git a/20191212/hp-musterloesung-20191212.pdf b/20191212/hp-musterloesung-20191212.pdf
deleted file mode 100644
index 3109fa543d7a837fd607de5b91bd064fb7c8c0db..0000000000000000000000000000000000000000
Binary files a/20191212/hp-musterloesung-20191212.pdf and /dev/null differ
diff --git a/20191212/hp-musterloesung-20191212.tex b/20191212/hp-musterloesung-20191212.tex
deleted file mode 100644
index 62a56dc09db86e3255baf1dbb1e15de3fb447a8a..0000000000000000000000000000000000000000
--- a/20191212/hp-musterloesung-20191212.tex
+++ /dev/null
@@ -1,325 +0,0 @@
-% hp-musterloesung-20191212.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Kondensator, hüpfender Ball
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{gnuplot-lua-tikz}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 12.\ Dezember 2019}
-
-  \exercise{Kondensator}
-
-  Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$
-  ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen
-  und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen.
-
-  \begin{enumerate}[(a)]
-    \item
-      Schreiben Sie ein C-Programm, das
-      den zeitlichen Spannungsverlauf in einer Tabelle darstellt.
-      \points{5}
-    \item
-      Schreiben Sie ein C-Programm, das ermittelt,
-      wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist.
-      \points{4}
-    \item
-      Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve:
-      \begin{math}
-        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
-      \end{math}\\
-      \points{3}
-  \end{enumerate}
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$.
-      Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant
-      und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls
-      aus dem Kondensator herausfließt.
-      Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls.
-    \item
-      Für den Vergleich mit der exakten theoretischen Entladekurve
-      benötigen Sie die Exponentialfunktion \lstinline{exp()}.
-      Diese finden Sie in der Mathematik-Bibliothek:
-      \lstinline{#include <math.h>} im Quelltext,
-      beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben.
-    \item
-      $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}
-    \item
-      \textbf{Schreiben Sie ein C-Programm, das
-      den zeitlichen Spannungsverlauf in einer Tabelle darstellt.}
-
-      In dem Programm \gitfile{hp}{20191212}{loesung-1a.c}
-      arbeiten wir, dem ersten Hinweis folgend,
-      mit einem Zeitintervall von \lstinline{dt = 0.01}.
-      Mit dieser Schrittweite lassen wir uns eine Tabelle ausgeben,
-      die jeweils die Zeit und durch die Simulation berechnete Spannung ausgibt.
-
-      Wir simulieren, wie die Ladung $Q = C \cdot U$ des Kondensators
-      im Laufe der Zeit abfließt.
-      Dazu berechnen wir in jedem Zeitschritt zunächst den Strom $I = U / R$,
-      der aus dem Kondensator fließt.
-      Dieser Strom bewirkt, daß innerhalb des Zeitintervalls $dt$
-      die Ladung $dQ = I \cdot dt$ aus dem Kondensator abfließt.
-      Am Ende des Zeitintervalls berechnen wir die zur neuen Ladung $Q$
-      gehörende neue Spannung $U = Q / C$.
-
-      Für eine einfache Ausgabe der Tabelle
-      verwenden wir die Formatspezifikationen \lstinline{%10.3lf} für drei 
-      bzw.\ \lstinline{%15.8lf} für acht Nachkommastellen Genauigkeit.
-      Damit schreiben wir jeweils eine \emph{lange Fließkommazahl\/} (\lstinline{%lf})
-      rechtsbündig in ein Feld der Breite 10 bzw.\ 15
-      und lassen uns 3 bzw.\ 8 Nachkommastellen ausgeben. 
-
-      Wir compilieren das Programm mit:
-      \lstinline[style=cmd]{gcc -Wall -O loesung-1a.c -o loesung-1a}
-
-    \item
-      \textbf{Schreiben Sie ein C-Programm, das ermittelt,
-      wie lange es dauert, bis die Spannung unter \boldmath $0.1\,{\rm V}$ gefallen ist.}
-
-      Wir ändern das Programm \gitfile{hp}{20191212}{loesung-1a.c} so ab,
-      daß zum einen die Schleife abbricht, sobald die Spannung 
-      den Wert $0.1\,{\rm V}$ unterschreitet (\gitfile{hp}{20191212}{loesung-1b.c}),
-      und daß zum anderen nicht jedesmal eine Zeile für die Tabelle ausgegeben wird,
-      sondern erst am Ende die Zeit (und die Spannung).
-
-      Der Ausgabe entnehmen wir, daß die Spannung bei etwa $t = 12.90\,{\rm s}$
-      den Wert $0.1\,{\rm V}$ unterschreitet.
-
-    \item
-      \textbf{Vergleichen Sie die berechneten Werte
-      mit der exakten theoretischen Entladekurve:\\
-      \boldmath  
-      \begin{math}
-        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
-      \end{math}}
-
-      Wir ändern das Programm \gitfile{hp}{20191212}{loesung-1a.c} so ab,
-      daß es zusätzlich zur Zeit und zur simulierten Spannung
-      die exakte Spannung $U_0 \cdot e^{-\frac{t}{RC}}$
-      gemäß der theoretischen Entladekurve ausgibt (\gitfile{hp}{20191212}{loesung-1c.c}),
-
-      Da dieses Programm die Exponentialfunktion verwendet, müssen wir nun
-      beim Compilieren zusätzlich \lstinline[style=cmd]{-lm}\hspace{1pt}
-      für das Einbinden der Mathematik-Bibliothek angeben.
-
-      Der erweiterten Tabelle können wir entnehmen,
-      daß die durch die Simulation berechnete Spannung
-      mit der Spannung $U_0 \cdot e^{-\frac{t}{RC}}$
-      gemäß der theoretischen Entladekurve
-      bis auf wenige Prozent übereinstimmt.
-      Dies ist für viele praktische Anwendungen ausreichend,
-      wenn auch nicht für Präzisionsmessungen.
-
-      Wenn Sie die Ausgabe des Programms, z.\,B.\ mit
-      \lstinline{./loesung-1c > loesung-1c.dat},
-      in einer Datei \gitfile{hp}{20191212}{loesung-1c.dat} speichern,
-      können Sie sich die beiden Kurven graphisch darstellen lassen,
-      z.\,B.\ mit \file{gnuplot} und dem folgenden Befehl:\\
-      \lstinline[style=cmd]{plot "loesung-1c.dat" using 1:2 with lines title "Simulation",}\\
-      \lstinline[style=cmd]{     "loesung-1c.dat" using 1:3 with lines title "Theorie"}
-
-      \begin{center}
-        \input{loesung-1c.tikz}
-      \end{center}
-
-      Der Unterschied zwischen der simulierten und der theoretischen Entladungskurve
-      ist mit bloßem Auge nicht sichtbar.
-  \end{itemize}
-
-  \vfill
-
-  \exercise{Fehlerhaftes Programm: Hüpfender Ball}
-
-  Das auf der nächsten Seite abgedruckte GTK+-Programm
-  (Datei: \gitfile{hp}{20191212}{aufgabe-2.c}) soll einen
-  hüpfenden Ball darstellen, ist jedoch fehlerhaft.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Warum sieht man lediglich ein leeres Fenster?
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?
-      \points{3}
-    \item
-      Nach der Fehlerbehebung in Aufgabenteil (a)
-      zeigt das Programm einen unbeweglichen Ball.
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?
-      \points{2}
-    \item
-      Erklären Sie das merkwürdige Hüpfverhalten des Balls.
-      Wie kommt es zustande?
-      Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5}
-    \item
-      Welche Befehle muß man in welcher Weise ändern,
-      um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2}
-  \end{enumerate}
-
-  Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung
-  ist ausdrücklich erlaubt -- auch in der Klausur.
-
-  Allgemeiner Hinweis:
-  Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung
-  als PDF-Datei betrachten und darin auf die Dateinamen klicken,
-  können Sie die Beispiel-Programme direkt herunterladen.
-  Dadurch vermeiden Sie Übertragungsfehler.
-
-  \clearpage
-
-  \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting}
-    #include <gtk/gtk.h>
-
-    #define WIDTH 320
-    #define HEIGHT 240
-
-    double t = 0.0;
-    double dt = 0.2;
-
-    int r = 5;
-
-    double x = 10;
-    double y = 200;
-    double vx = 20;
-    double vy = -60;
-    double g = 9.81;
-
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-
-      gdk_cairo_set_source_rgba (c, &blue);
-      cairo_arc (c, x, y, r, 0, 2 * G_PI);
-      cairo_fill (c);
-
-      return FALSE;
-    }
-
-    gboolean timer (GtkWidget *widget)
-    {
-      t += dt;
-      x += vx * dt;
-      y += vy * dt;
-      vx = vx;
-      vy = 0.5 * g * (t * t);
-      if (y + r >= HEIGHT)
-        vy = -vy * 0.9;
-      if (x + r >= WIDTH)
-        vx = -vx * 0.9;
-      if (x - r <= 0)
-        vx = -vx * 0.9;
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-
-    int main (int argc, char **argv)
-    {
-      gtk_init (&argc, &argv);
-
-      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-      gtk_widget_show (window);
-      gtk_window_set_title (GTK_WINDOW (window), "Hello");
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-      GtkWidget *drawing_area = gtk_drawing_area_new ();
-      gtk_widget_show (drawing_area);
-      gtk_container_add (GTK_CONTAINER (window), drawing_area);
-      gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-      gtk_main ();
-      return 0;
-    }
-  \end{lstlisting}\vss}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Warum sieht man lediglich ein leeres Fenster?
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?}
-
-      Die für das Zeichnen zuständige Callback-Funktion wurde zwar geschrieben,
-      aber nicht installiert.
-      Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm:
-
-      \lstinline{g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);}
-
-      Dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm
-      \gitfile{hp}{20191205}{gtk-16.c}.
-
-    \item
-      \textbf{Nach der Fehlerbehebung in Aufgabenteil (a)
-      zeigt das Programm einen unbeweglichen Ball.
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?}
-
-      Die Timer-Callback-Funktion wurde zwar geschrieben, aber nicht installiert.
-      Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm:
-
-      \lstinline{g_timeout_add (50, (GSourceFunc) timer, drawing_area);}
-
-      Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm
-      \gitfile{hp}{20191205}{gtk-16.c}.
-
-    \item
-      \textbf{Erklären Sie das merkwürdige Hüpfverhalten des Balls.
-      Wie kommt es zustande?
-      Was an diesem Verhalten ist korrekt, und was ist fehlerhaft?}
-
-      Die Geschwindigkeit in $y$-Richtung wächst immer weiter.
-      Der Grund dafür ist, daß die $y$-Komponente der Geschwindigkeit
-      nicht auf physikalisch sinnvolle Weise berechnet wird.
-      In der dafür zuständigen Zeile
-      \lstinline{vy = 0.5 * g * (t * t);}
-      wird stattdessen der Weg in $y$-Richtung bei einer gleichmäßig
-      beschleunigten Bewegung berechnet und als Geschwindigkeit verwendet.
-
-    \item
-      \textbf{Welche Befehle muß man in welcher Weise ändern,
-      um ein realistischeres Hüpf-Verhalten zu bekommen?}
-
-      Da der Ball am Boden abprallen soll, ist es \emph{nicht\/} sinnvoll,
-      die $y$-Komponente der Geschwindigkeit über die bekannte physikalische
-      Formel $v_y = -g\cdot t$ für die Geschwindigkeit in einer
-      gleichmäßig beschleunigten Bewegung zu berechnen.
-
-      Stattdessen ist es sinnvoll, die \emph{Geschwindigkeitsänderung\/}
-      innerhalb des Zeitintervalls \lstinline{dt}
-      zur Geschwindigkeitskomponente zu addieren:
-      \lstinline{vy += g * dt;}
-
-      Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm
-      \gitfile{hp}{20191205}{gtk-16.c}.
-  \end{enumerate}
-
-\end{document}
diff --git a/20191212/hp-uebung-20191212.pdf b/20191212/hp-uebung-20191212.pdf
deleted file mode 100644
index 2888f67433125420b003af45b31c55ea65dc4ee0..0000000000000000000000000000000000000000
Binary files a/20191212/hp-uebung-20191212.pdf and /dev/null differ
diff --git a/20191212/hp-uebung-20191212.tex b/20191212/hp-uebung-20191212.tex
deleted file mode 100644
index bf99681d8f579298f3b337f2060fac229be36bd4..0000000000000000000000000000000000000000
--- a/20191212/hp-uebung-20191212.tex
+++ /dev/null
@@ -1,193 +0,0 @@
-% hp-uebung-20191212.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Kondensator, hüpfender Ball
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 12.\ Dezember 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  12 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Kondensator}
-
-  Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$
-  ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen
-  und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen.
-
-  \begin{enumerate}[(a)]
-    \item
-      Schreiben Sie ein C-Programm, das
-      den zeitlichen Spannungsverlauf in einer Tabelle darstellt.
-      \points{5}
-    \item
-      Schreiben Sie ein C-Programm, das ermittelt,
-      wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist.
-      \points{4}
-    \item
-      Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve:
-      \begin{math}
-        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
-      \end{math}\\
-      \points{3}
-  \end{enumerate}
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$.
-      Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant
-      und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls
-      aus dem Kondensator herausfließt.
-      Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls.
-    \item
-      Für den Vergleich mit der exakten theoretischen Entladekurve
-      benötigen Sie die Exponentialfunktion \lstinline{exp()}.
-      Diese finden Sie in der Mathematik-Bibliothek:
-      \lstinline{#include <math.h>} im Quelltext,
-      beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben.
-    \item
-      $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$
-  \end{itemize}
-
-  \exercise{Fehlerhaftes Programm: Hüpfender Ball}
-
-  Das auf der nächsten Seite abgedruckte GTK+-Programm
-  (Datei: \gitfile{hp}{20191212}{aufgabe-2.c}) soll einen
-  hüpfenden Ball darstellen, ist jedoch fehlerhaft.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Warum sieht man lediglich ein leeres Fenster?
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?
-      \points{3}
-    \item
-      Nach der Fehlerbehebung in Aufgabenteil (a)
-      zeigt das Programm einen unbeweglichen Ball.
-      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?
-      \points{2}
-    \item
-      Erklären Sie das merkwürdige Hüpfverhalten des Balls.
-      Wie kommt es zustande?
-      Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5}
-    \item
-      Welche Befehle muß man in welcher Weise ändern,
-      um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2}
-  \end{enumerate}
-
-  Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung
-  ist ausdrücklich erlaubt -- auch in der Klausur.
-
-  Allgemeiner Hinweis:
-  Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung
-  als PDF-Datei betrachten und darin auf die Dateinamen klicken,
-  können Sie die Beispiel-Programme direkt herunterladen.
-  Dadurch vermeiden Sie Übertragungsfehler.
-
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \clearpage
-
-  \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting}
-    #include <gtk/gtk.h>
-
-    #define WIDTH 320
-    #define HEIGHT 240
-
-    double t = 0.0;
-    double dt = 0.2;
-
-    int r = 5;
-
-    double x = 10;
-    double y = 200;
-    double vx = 20;
-    double vy = -60;
-    double g = 9.81;
-
-    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
-    {
-      GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
-
-      gdk_cairo_set_source_rgba (c, &blue);
-      cairo_arc (c, x, y, r, 0, 2 * G_PI);
-      cairo_fill (c);
-
-      return FALSE;
-    }
-
-    gboolean timer (GtkWidget *widget)
-    {
-      t += dt;
-      x += vx * dt;
-      y += vy * dt;
-      vx = vx;
-      vy = 0.5 * g * (t * t);
-      if (y + r >= HEIGHT)
-        vy = -vy * 0.9;
-      if (x + r >= WIDTH)
-        vx = -vx * 0.9;
-      if (x - r <= 0)
-        vx = -vx * 0.9;
-      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-      g_timeout_add (50, (GSourceFunc) timer, widget);
-      return FALSE;
-    }
-
-    int main (int argc, char **argv)
-    {
-      gtk_init (&argc, &argv);
-
-      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-      gtk_widget_show (window);
-      gtk_window_set_title (GTK_WINDOW (window), "Hello");
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-
-      GtkWidget *drawing_area = gtk_drawing_area_new ();
-      gtk_widget_show (drawing_area);
-      gtk_container_add (GTK_CONTAINER (window), drawing_area);
-      gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
-
-      gtk_main ();
-      return 0;
-    }
-  \end{lstlisting}\vss}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191212/loesung-1a.c b/20191212/loesung-1a.c
deleted file mode 100644
index f355706a6ff6f95bd72897123a985fb2b7ead7c3..0000000000000000000000000000000000000000
--- a/20191212/loesung-1a.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <math.h>
-
-int main (void)
-{
-  double C = 0.0001;
-  double U0 = 5.0;
-  double U = U0;
-  double R = 33000.0;
-  double t = 0.0;
-  double dt = 0.01;
-  double Q = C * U;
-  while (U > 0.09)
-    {
-      printf ("%10.3lf%15.8lf\n", t, U);
-      double I = U / R;
-      Q -= I * dt;
-      U = Q / C;
-      t += dt;
-    }
-  return 0;
-}
diff --git a/20191212/loesung-1b.c b/20191212/loesung-1b.c
deleted file mode 100644
index f5fc22022ef10a1b986bbd11fba8298a7547792d..0000000000000000000000000000000000000000
--- a/20191212/loesung-1b.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <math.h>
-
-int main (void)
-{
-  double C = 0.0001;
-  double U0 = 5.0;
-  double U = U0;
-  double R = 33000.0;
-  double t = 0.0;
-  double dt = 0.01;
-  double Q = C * U;
-  while (U >= 0.1)
-    {
-      double I = U / R;
-      Q -= I * dt;
-      U = Q / C;
-      t += dt;
-    }
-  printf ("%10.3lf%15.8lf\n", t, U);
-  return 0;
-}
diff --git a/20191212/loesung-1c.c b/20191212/loesung-1c.c
deleted file mode 100644
index 71802e036dd56534470028b61f646d297d1d8840..0000000000000000000000000000000000000000
--- a/20191212/loesung-1c.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <math.h>
-
-int main (void)
-{
-  double C = 0.0001;
-  double U0 = 5.0;
-  double U = U0;
-  double R = 33000.0;
-  double t = 0.0;
-  double dt = 0.01;
-  double Q = C * U;
-  while (U > 0.09)
-    {
-      printf ("%10.3lf%15.8lf%15.8lf\n", t, U, U0 * exp (-t / (R * C)));
-      double I = U / R;
-      Q -= I * dt;
-      U = Q / C;
-      t += dt;
-    }
-  return 0;
-}
diff --git a/20191212/loesung-1c.dat b/20191212/loesung-1c.dat
deleted file mode 100644
index 4df706295bde25a74e025c5335f43617d93129a8..0000000000000000000000000000000000000000
--- a/20191212/loesung-1c.dat
+++ /dev/null
@@ -1,1324 +0,0 @@
-     0.000     5.00000000     5.00000000
-     0.010     4.98484848     4.98487142
-     0.020     4.96974288     4.96978861
-     0.030     4.95468306     4.95475144
-     0.040     4.93966887     4.93975977
-     0.050     4.92470017     4.92481346
-     0.060     4.90977684     4.90991237
-     0.070     4.89489873     4.89505637
-     0.080     4.88006570     4.88024532
-     0.090     4.86527762     4.86547908
-     0.100     4.85053436     4.85075752
-     0.110     4.83583577     4.83608050
-     0.120     4.82118172     4.82144789
-     0.130     4.80657208     4.80685956
-     0.140     4.79200671     4.79231537
-     0.150     4.77748548     4.77781518
-     0.160     4.76300825     4.76335887
-     0.170     4.74857489     4.74894630
-     0.180     4.73418527     4.73457733
-     0.190     4.71983925     4.72025184
-     0.200     4.70553671     4.70596970
-     0.210     4.69127751     4.69173077
-     0.220     4.67706151     4.67753493
-     0.230     4.66288860     4.66338203
-     0.240     4.64875864     4.64927196
-     0.250     4.63467149     4.63520458
-     0.260     4.62062703     4.62117977
-     0.270     4.60662513     4.60719739
-     0.280     4.59266566     4.59325732
-     0.290     4.57874849     4.57935942
-     0.300     4.56487349     4.56550358
-     0.310     4.55104054     4.55168966
-     0.320     4.53724951     4.53791754
-     0.330     4.52350027     4.52418709
-     0.340     4.50979269     4.51049818
-     0.350     4.49612666     4.49685070
-     0.360     4.48250203     4.48324450
-     0.370     4.46891869     4.46967948
-     0.380     4.45537651     4.45615549
-     0.390     4.44187537     4.44267243
-     0.400     4.42841514     4.42923016
-     0.410     4.41499570     4.41582857
-     0.420     4.40161693     4.40246753
-     0.430     4.38827870     4.38914691
-     0.440     4.37498088     4.37586660
-     0.450     4.36172336     4.36262646
-     0.460     4.34850602     4.34942639
-     0.470     4.33532873     4.33626626
-     0.480     4.32219137     4.32314595
-     0.490     4.30909382     4.31006534
-     0.500     4.29603596     4.29702430
-     0.510     4.28301767     4.28402273
-     0.520     4.27003883     4.27106049
-     0.530     4.25709932     4.25813747
-     0.540     4.24419901     4.24525356
-     0.550     4.23133781     4.23240862
-     0.560     4.21851557     4.21960256
-     0.570     4.20573219     4.20683524
-     0.580     4.19298755     4.19410655
-     0.590     4.18028152     4.18141637
-     0.600     4.16761400     4.16876459
-     0.610     4.15498487     4.15615109
-     0.620     4.14239401     4.14357576
-     0.630     4.12984130     4.13103847
-     0.640     4.11732663     4.11853912
-     0.650     4.10484988     4.10607759
-     0.660     4.09241094     4.09365377
-     0.670     4.08000970     4.08126753
-     0.680     4.06764603     4.06891877
-     0.690     4.05531983     4.05660738
-     0.700     4.04303098     4.04433324
-     0.710     4.03077937     4.03209623
-     0.720     4.01856489     4.01989625
-     0.730     4.00638742     4.00773319
-     0.740     3.99424685     3.99560692
-     0.750     3.98214307     3.98351735
-     0.760     3.97007597     3.97146436
-     0.770     3.95804544     3.95944783
-     0.780     3.94605136     3.94746767
-     0.790     3.93409363     3.93552375
-     0.800     3.92217214     3.92361597
-     0.810     3.91028677     3.91174422
-     0.820     3.89843741     3.89990839
-     0.830     3.88662397     3.88810838
-     0.840     3.87484632     3.87634406
-     0.850     3.86310436     3.86461535
-     0.860     3.85139798     3.85292212
-     0.870     3.83972708     3.84126427
-     0.880     3.82809154     3.82964169
-     0.890     3.81649127     3.81805428
-     0.900     3.80492614     3.80650193
-     0.910     3.79339606     3.79498454
-     0.920     3.78190092     3.78350199
-     0.930     3.77044062     3.77205419
-     0.940     3.75901504     3.76064102
-     0.950     3.74762408     3.74926239
-     0.960     3.73626765     3.73791819
-     0.970     3.72494562     3.72660831
-     0.980     3.71365791     3.71533265
-     0.990     3.70240440     3.70409110
-     1.000     3.69118499     3.69288357
-     1.010     3.67999958     3.68170996
-     1.020     3.66884807     3.67057015
-     1.030     3.65773035     3.65946404
-     1.040     3.64664632     3.64839154
-     1.050     3.63559587     3.63735255
-     1.060     3.62457892     3.62634695
-     1.070     3.61359534     3.61537465
-     1.080     3.60264506     3.60443555
-     1.090     3.59172795     3.59352955
-     1.100     3.58084393     3.58265655
-     1.110     3.56999288     3.57181645
-     1.120     3.55917472     3.56100915
-     1.130     3.54838934     3.55023454
-     1.140     3.53763665     3.53949254
-     1.150     3.52691654     3.52878304
-     1.160     3.51622891     3.51810594
-     1.170     3.50557367     3.50746115
-     1.180     3.49495072     3.49684857
-     1.190     3.48435996     3.48626810
-     1.200     3.47380130     3.47571964
-     1.210     3.46327463     3.46520310
-     1.220     3.45277985     3.45471838
-     1.230     3.44231689     3.44426538
-     1.240     3.43188562     3.43384401
-     1.250     3.42148597     3.42345417
-     1.260     3.41111783     3.41309577
-     1.270     3.40078111     3.40276871
-     1.280     3.39047571     3.39247290
-     1.290     3.38020154     3.38220824
-     1.300     3.36995851     3.37197464
-     1.310     3.35974651     3.36177200
-     1.320     3.34956546     3.35160023
-     1.330     3.33941526     3.34145924
-     1.340     3.32929582     3.33134893
-     1.350     3.31920705     3.32126921
-     1.360     3.30914885     3.31122000
-     1.370     3.29912112     3.30120118
-     1.380     3.28912378     3.29121269
-     1.390     3.27915674     3.28125441
-     1.400     3.26921990     3.27132626
-     1.410     3.25931318     3.26142816
-     1.420     3.24943647     3.25156000
-     1.430     3.23958969     3.24172171
-     1.440     3.22977276     3.23191317
-     1.450     3.21998557     3.22213432
-     1.460     3.21022803     3.21238506
-     1.470     3.20050007     3.20266529
-     1.480     3.19080158     3.19297494
-     1.490     3.18113249     3.18331390
-     1.500     3.17149269     3.17368209
-     1.510     3.16188211     3.16407943
-     1.520     3.15230065     3.15450583
-     1.530     3.14274822     3.14496119
-     1.540     3.13322474     3.13544543
-     1.550     3.12373012     3.12595846
-     1.560     3.11426427     3.11650019
-     1.570     3.10482711     3.10707055
-     1.580     3.09541854     3.09766944
-     1.590     3.08603849     3.08829677
-     1.600     3.07668685     3.07895246
-     1.610     3.06736356     3.06963642
-     1.620     3.05806852     3.06034857
-     1.630     3.04880164     3.05108882
-     1.640     3.03956285     3.04185710
-     1.650     3.03035206     3.03265330
-     1.660     3.02116917     3.02347735
-     1.670     3.01201411     3.01432917
-     1.680     3.00288680     3.00520866
-     1.690     2.99378714     2.99611575
-     1.700     2.98471506     2.98705036
-     1.710     2.97567047     2.97801239
-     1.720     2.96665328     2.96900177
-     1.730     2.95766343     2.96001841
-     1.740     2.94870081     2.95106223
-     1.750     2.93976535     2.94213316
-     1.760     2.93085697     2.93323110
-     1.770     2.92197559     2.92435597
-     1.780     2.91312112     2.91550770
-     1.790     2.90429348     2.90668620
-     1.800     2.89549259     2.89789139
-     1.810     2.88671837     2.88912320
-     1.820     2.87797074     2.88038153
-     1.830     2.86924961     2.87166631
-     1.840     2.86055492     2.86297746
-     1.850     2.85188657     2.85431491
-     1.860     2.84324449     2.84567856
-     1.870     2.83462859     2.83706834
-     1.880     2.82603881     2.82848418
-     1.890     2.81747506     2.81992599
-     1.900     2.80893725     2.81139369
-     1.910     2.80042532     2.80288721
-     1.920     2.79193919     2.79440647
-     1.930     2.78347876     2.78595139
-     1.940     2.77504398     2.77752189
-     1.950     2.76663476     2.76911790
-     1.960     2.75825101     2.76073933
-     1.970     2.74989268     2.75238612
-     1.980     2.74155967     2.74405818
-     1.990     2.73325191     2.73575544
-     2.000     2.72496933     2.72747782
-     2.010     2.71671185     2.71922525
-     2.020     2.70847939     2.71099764
-     2.030     2.70027187     2.70279493
-     2.040     2.69208923     2.69461704
-     2.050     2.68393139     2.68646389
-     2.060     2.67579826     2.67833542
-     2.070     2.66768978     2.67023153
-     2.080     2.65960587     2.66215217
-     2.090     2.65154646     2.65409725
-     2.100     2.64351147     2.64606671
-     2.110     2.63550083     2.63806046
-     2.120     2.62751447     2.63007844
-     2.130     2.61955230     2.62212057
-     2.140     2.61161426     2.61418677
-     2.150     2.60370028     2.60627699
-     2.160     2.59581028     2.59839113
-     2.170     2.58794419     2.59052914
-     2.180     2.58010193     2.58269093
-     2.190     2.57228344     2.57487644
-     2.200     2.56448864     2.56708560
-     2.210     2.55671747     2.55931832
-     2.220     2.54896984     2.55157455
-     2.230     2.54124569     2.54385421
-     2.240     2.53354494     2.53615723
-     2.250     2.52586753     2.52848354
-     2.260     2.51821339     2.52083306
-     2.270     2.51058244     2.51320574
-     2.280     2.50297461     2.50560149
-     2.290     2.49538984     2.49802025
-     2.300     2.48782805     2.49046195
-     2.310     2.48028918     2.48292652
-     2.320     2.47277315     2.47541389
-     2.330     2.46527990     2.46792399
-     2.340     2.45780936     2.46045675
-     2.350     2.45036145     2.45301211
-     2.360     2.44293611     2.44558999
-     2.370     2.43553328     2.43819033
-     2.380     2.42815287     2.43081305
-     2.390     2.42079483     2.42345810
-     2.400     2.41345909     2.41612541
-     2.410     2.40614558     2.40881490
-     2.420     2.39885423     2.40152651
-     2.430     2.39158497     2.39426017
-     2.440     2.38433775     2.38701582
-     2.450     2.37711248     2.37979338
-     2.460     2.36990911     2.37259280
-     2.470     2.36272757     2.36541401
-     2.480     2.35556778     2.35825694
-     2.490     2.34842970     2.35112152
-     2.500     2.34131325     2.34400770
-     2.510     2.33421836     2.33691539
-     2.520     2.32714497     2.32984455
-     2.530     2.32009302     2.32279510
-     2.540     2.31306243     2.31576698
-     2.550     2.30605315     2.30876013
-     2.560     2.29906511     2.30177448
-     2.570     2.29209825     2.29480996
-     2.580     2.28515249     2.28786652
-     2.590     2.27822779     2.28094408
-     2.600     2.27132407     2.27404259
-     2.610     2.26444127     2.26716198
-     2.620     2.25757933     2.26030219
-     2.630     2.25073818     2.25346316
-     2.640     2.24391776     2.24664482
-     2.650     2.23711801     2.23984711
-     2.660     2.23033886     2.23306997
-     2.670     2.22358026     2.22631333
-     2.680     2.21684214     2.21957714
-     2.690     2.21012443     2.21286133
-     2.700     2.20342709     2.20616584
-     2.710     2.19675003     2.19949061
-     2.720     2.19009322     2.19283557
-     2.730     2.18345657     2.18620067
-     2.740     2.17684003     2.17958585
-     2.750     2.17024355     2.17299104
-     2.760     2.16366705     2.16641619
-     2.770     2.15711049     2.15986123
-     2.780     2.15057379     2.15332610
-     2.790     2.14405690     2.14681075
-     2.800     2.13755976     2.14031511
-     2.810     2.13108230     2.13383912
-     2.820     2.12462448     2.12738273
-     2.830     2.11818622     2.12094587
-     2.840     2.11176748     2.11452849
-     2.850     2.10536818     2.10813053
-     2.860     2.09898828     2.10175192
-     2.870     2.09262771     2.09539262
-     2.880     2.08628641     2.08905255
-     2.890     2.07996433     2.08273167
-     2.900     2.07366141     2.07642992
-     2.910     2.06737759     2.07014723
-     2.920     2.06111280     2.06388355
-     2.930     2.05486701     2.05763883
-     2.940     2.04864014     2.05141299
-     2.950     2.04243214     2.04520600
-     2.960     2.03624295     2.03901779
-     2.970     2.03007252     2.03284830
-     2.980     2.02392078     2.02669748
-     2.990     2.01778769     2.02056526
-     3.000     2.01167318     2.01445161
-     3.010     2.00557720     2.00835645
-     3.020     1.99949969     2.00227973
-     3.030     1.99344060     1.99622140
-     3.040     1.98739988     1.99018140
-     3.050     1.98137745     1.98415968
-     3.060     1.97537328     1.97815617
-     3.070     1.96938730     1.97217083
-     3.080     1.96341946     1.96620360
-     3.090     1.95746970     1.96025443
-     3.100     1.95153798     1.95432326
-     3.110     1.94562422     1.94841003
-     3.120     1.93972839     1.94251469
-     3.130     1.93385043     1.93663719
-     3.140     1.92799028     1.93077748
-     3.150     1.92214788     1.92493549
-     3.160     1.91632319     1.91911119
-     3.170     1.91051615     1.91330450
-     3.180     1.90472671     1.90751538
-     3.190     1.89895481     1.90174378
-     3.200     1.89320040     1.89598965
-     3.210     1.88746343     1.89025292
-     3.220     1.88174384     1.88453355
-     3.230     1.87604159     1.87883149
-     3.240     1.87035661     1.87314668
-     3.250     1.86468887     1.86747906
-     3.260     1.85903829     1.86182860
-     3.270     1.85340484     1.85619524
-     3.280     1.84778847     1.85057892
-     3.290     1.84218911     1.84497959
-     3.300     1.83660672     1.83939721
-     3.310     1.83104124     1.83383171
-     3.320     1.82549263     1.82828306
-     3.330     1.81996084     1.82275119
-     3.340     1.81444580     1.81723606
-     3.350     1.80894748     1.81173762
-     3.360     1.80346582     1.80625582
-     3.370     1.79800078     1.80079060
-     3.380     1.79255229     1.79534192
-     3.390     1.78712031     1.78990972
-     3.400     1.78170480     1.78449397
-     3.410     1.77630569     1.77909459
-     3.420     1.77092295     1.77371156
-     3.430     1.76555651     1.76834481
-     3.440     1.76020634     1.76299430
-     3.450     1.75487238     1.75765998
-     3.460     1.74955459     1.75234180
-     3.470     1.74425291     1.74703971
-     3.480     1.73896729     1.74175366
-     3.490     1.73369769     1.73648361
-     3.500     1.72844406     1.73122950
-     3.510     1.72320636     1.72599129
-     3.520     1.71798452     1.72076893
-     3.530     1.71277850     1.71556238
-     3.540     1.70758827     1.71037157
-     3.550     1.70241376     1.70519647
-     3.560     1.69725493     1.70003703
-     3.570     1.69211173     1.69489320
-     3.580     1.68698412     1.68976494
-     3.590     1.68187205     1.68465219
-     3.600     1.67677546     1.67955491
-     3.610     1.67169433     1.67447305
-     3.620     1.66662859     1.66940657
-     3.630     1.66157820     1.66435542
-     3.640     1.65654311     1.65931955
-     3.650     1.65152328     1.65429892
-     3.660     1.64651867     1.64929348
-     3.670     1.64152922     1.64430319
-     3.680     1.63655489     1.63932799
-     3.690     1.63159563     1.63436785
-     3.700     1.62665140     1.62942272
-     3.710     1.62172215     1.62449255
-     3.720     1.61680784     1.61957729
-     3.730     1.61190842     1.61467691
-     3.740     1.60702385     1.60979136
-     3.750     1.60215408     1.60492059
-     3.760     1.59729907     1.60006455
-     3.770     1.59245877     1.59522321
-     3.780     1.58763314     1.59039652
-     3.790     1.58282213     1.58558443
-     3.800     1.57802570     1.58078690
-     3.810     1.57324380     1.57600389
-     3.820     1.56847640     1.57123535
-     3.830     1.56372344     1.56648123
-     3.840     1.55898488     1.56174151
-     3.850     1.55426069     1.55701612
-     3.860     1.54955081     1.55230503
-     3.870     1.54485520     1.54760820
-     3.880     1.54017382     1.54292557
-     3.890     1.53550662     1.53825712
-     3.900     1.53085357     1.53360279
-     3.910     1.52621462     1.52896254
-     3.920     1.52158973     1.52433633
-     3.930     1.51697885     1.51972412
-     3.940     1.51238195     1.51512587
-     3.950     1.50779897     1.51054153
-     3.960     1.50322988     1.50597106
-     3.970     1.49867464     1.50141442
-     3.980     1.49413320     1.49687156
-     3.990     1.48960553     1.49234246
-     4.000     1.48509157     1.48782705
-     4.010     1.48059129     1.48332531
-     4.020     1.47610465     1.47883719
-     4.030     1.47163161     1.47436264
-     4.040     1.46717212     1.46990164
-     4.050     1.46272614     1.46545414
-     4.060     1.45829364     1.46102009
-     4.070     1.45387457     1.45659946
-     4.080     1.44946889     1.45219220
-     4.090     1.44507656     1.44779828
-     4.100     1.44069754     1.44341765
-     4.110     1.43633179     1.43905028
-     4.120     1.43197927     1.43469612
-     4.130     1.42763994     1.43035514
-     4.140     1.42331375     1.42602729
-     4.150     1.41900068     1.42171253
-     4.160     1.41470068     1.41741084
-     4.170     1.41041371     1.41312215
-     4.180     1.40613973     1.40884645
-     4.190     1.40187870     1.40458368
-     4.200     1.39763058     1.40033380
-     4.210     1.39339534     1.39609679
-     4.220     1.38917293     1.39187260
-     4.230     1.38496331     1.38766119
-     4.240     1.38076645     1.38346252
-     4.250     1.37658231     1.37927655
-     4.260     1.37241085     1.37510325
-     4.270     1.36825203     1.37094258
-     4.280     1.36410581     1.36679450
-     4.290     1.35997216     1.36265897
-     4.300     1.35585103     1.35853595
-     4.310     1.35174239     1.35442540
-     4.320     1.34764620     1.35032729
-     4.330     1.34356242     1.34624159
-     4.340     1.33949102     1.34216824
-     4.350     1.33543196     1.33810722
-     4.360     1.33138520     1.33405849
-     4.370     1.32735070     1.33002201
-     4.380     1.32332842     1.32599774
-     4.390     1.31931833     1.32198564
-     4.400     1.31532040     1.31798569
-     4.410     1.31133458     1.31399784
-     4.420     1.30736084     1.31002206
-     4.430     1.30339914     1.30605830
-     4.440     1.29944945     1.30210654
-     4.450     1.29551172     1.29816673
-     4.460     1.29158593     1.29423885
-     4.470     1.28767203     1.29032285
-     4.480     1.28376999     1.28641870
-     4.490     1.27987978     1.28252636
-     4.500     1.27600136     1.27864580
-     4.510     1.27213469     1.27477698
-     4.520     1.26827973     1.27091987
-     4.530     1.26443646     1.26707442
-     4.540     1.26060484     1.26324062
-     4.550     1.25678482     1.25941841
-     4.560     1.25297638     1.25560777
-     4.570     1.24917948     1.25180865
-     4.580     1.24539409     1.24802103
-     4.590     1.24162017     1.24424488
-     4.600     1.23785769     1.24048015
-     4.610     1.23410660     1.23672680
-     4.620     1.23036688     1.23298482
-     4.630     1.22663850     1.22925416
-     4.640     1.22292141     1.22553478
-     4.650     1.21921559     1.22182666
-     4.660     1.21552100     1.21812976
-     4.670     1.21183760     1.21444405
-     4.680     1.20816537     1.21076948
-     4.690     1.20450426     1.20710604
-     4.700     1.20085425     1.20345368
-     4.710     1.19721529     1.19981237
-     4.720     1.19358737     1.19618208
-     4.730     1.18997044     1.19256277
-     4.740     1.18636447     1.18895441
-     4.750     1.18276942     1.18535697
-     4.760     1.17918527     1.18177042
-     4.770     1.17561198     1.17819472
-     4.780     1.17204952     1.17462984
-     4.790     1.16849786     1.17107574
-     4.800     1.16495696     1.16753240
-     4.810     1.16142678     1.16399977
-     4.820     1.15790731     1.16047784
-     4.830     1.15439850     1.15696656
-     4.840     1.15090032     1.15346591
-     4.850     1.14741274     1.14997585
-     4.860     1.14393574     1.14649635
-     4.870     1.14046926     1.14302738
-     4.880     1.13701330     1.13956890
-     4.890     1.13356780     1.13612089
-     4.900     1.13013275     1.13268331
-     4.910     1.12670810     1.12925613
-     4.920     1.12329384     1.12583932
-     4.930     1.11988992     1.12243285
-     4.940     1.11649631     1.11903669
-     4.950     1.11311299     1.11565080
-     4.960     1.10973992     1.11227516
-     4.970     1.10637707     1.10890973
-     4.980     1.10302441     1.10555448
-     4.990     1.09968191     1.10220939
-     5.000     1.09634954     1.09887442
-     5.010     1.09302727     1.09554953
-     5.020     1.08971507     1.09223471
-     5.030     1.08641290     1.08892992
-     5.040     1.08312074     1.08563513
-     5.050     1.07983856     1.08235030
-     5.060     1.07656632     1.07907542
-     5.070     1.07330400     1.07581044
-     5.080     1.07005156     1.07255534
-     5.090     1.06680898     1.06931010
-     5.100     1.06357623     1.06607467
-     5.110     1.06035327     1.06284903
-     5.120     1.05714008     1.05963315
-     5.130     1.05393662     1.05642700
-     5.140     1.05074287     1.05323055
-     5.150     1.04755880     1.05004377
-     5.160     1.04438438     1.04686664
-     5.170     1.04121958     1.04369912
-     5.180     1.03806437     1.04054118
-     5.190     1.03491872     1.03739280
-     5.200     1.03178261     1.03425394
-     5.210     1.02865599     1.03112458
-     5.220     1.02553885     1.02800469
-     5.230     1.02243116     1.02489424
-     5.240     1.01933288     1.02179320
-     5.250     1.01624399     1.01870155
-     5.260     1.01316447     1.01561924
-     5.270     1.01009427     1.01254627
-     5.280     1.00703338     1.00948259
-     5.290     1.00398176     1.00642818
-     5.300     1.00093939     1.00338302
-     5.310     0.99790625     1.00034706
-     5.320     0.99488229     0.99732030
-     5.330     0.99186749     0.99430269
-     5.340     0.98886183     0.99129421
-     5.350     0.98586528     0.98829484
-     5.360     0.98287781     0.98530454
-     5.370     0.97989939     0.98232328
-     5.380     0.97693000     0.97935105
-     5.390     0.97396961     0.97638781
-     5.400     0.97101818     0.97343354
-     5.410     0.96807571     0.97048821
-     5.420     0.96514214     0.96755179
-     5.430     0.96221747     0.96462425
-     5.440     0.95930166     0.96170557
-     5.450     0.95639468     0.95879572
-     5.460     0.95349652     0.95589468
-     5.470     0.95060714     0.95300241
-     5.480     0.94772651     0.95011890
-     5.490     0.94485461     0.94724411
-     5.500     0.94199141     0.94437801
-     5.510     0.93913689     0.94152059
-     5.520     0.93629102     0.93867182
-     5.530     0.93345378     0.93583167
-     5.540     0.93062513     0.93300010
-     5.550     0.92780505     0.93017711
-     5.560     0.92499352     0.92736266
-     5.570     0.92219051     0.92455672
-     5.580     0.91939600     0.92175928
-     5.590     0.91660995     0.91897029
-     5.600     0.91383234     0.91618975
-     5.610     0.91106315     0.91341762
-     5.620     0.90830236     0.91065388
-     5.630     0.90554992     0.90789850
-     5.640     0.90280583     0.90515145
-     5.650     0.90007006     0.90241272
-     5.660     0.89734257     0.89968228
-     5.670     0.89462335     0.89696009
-     5.680     0.89191237     0.89424615
-     5.690     0.88920961     0.89154041
-     5.700     0.88651503     0.88884286
-     5.710     0.88382863     0.88615348
-     5.720     0.88115036     0.88347223
-     5.730     0.87848020     0.88079909
-     5.740     0.87581814     0.87813404
-     5.750     0.87316415     0.87547706
-     5.760     0.87051820     0.87282811
-     5.770     0.86788026     0.87018718
-     5.780     0.86525032     0.86755424
-     5.790     0.86262835     0.86492927
-     5.800     0.86001433     0.86231224
-     5.810     0.85740822     0.85970313
-     5.820     0.85481002     0.85710191
-     5.830     0.85221968     0.85450856
-     5.840     0.84963720     0.85192306
-     5.850     0.84706254     0.84934539
-     5.860     0.84449568     0.84677551
-     5.870     0.84193661     0.84421341
-     5.880     0.83938528     0.84165906
-     5.890     0.83684169     0.83911243
-     5.900     0.83430581     0.83657352
-     5.910     0.83177761     0.83404228
-     5.920     0.82925707     0.83151871
-     5.930     0.82674417     0.82900277
-     5.940     0.82423888     0.82649444
-     5.950     0.82174119     0.82399370
-     5.960     0.81925107     0.82150053
-     5.970     0.81676849     0.81901490
-     5.980     0.81429343     0.81653680
-     5.990     0.81182588     0.81406619
-     6.000     0.80936580     0.81160306
-     6.010     0.80691317     0.80914738
-     6.020     0.80446798     0.80669912
-     6.030     0.80203020     0.80425828
-     6.040     0.79959981     0.80182482
-     6.050     0.79717678     0.79939873
-     6.060     0.79476109     0.79697998
-     6.070     0.79235272     0.79456854
-     6.080     0.78995165     0.79216440
-     6.090     0.78755786     0.78976754
-     6.100     0.78517132     0.78737793
-     6.110     0.78279201     0.78499554
-     6.120     0.78041992     0.78262037
-     6.130     0.77805501     0.78025238
-     6.140     0.77569727     0.77789156
-     6.150     0.77334667     0.77553788
-     6.160     0.77100319     0.77319132
-     6.170     0.76866682     0.77085187
-     6.180     0.76633753     0.76851949
-     6.190     0.76401529     0.76619416
-     6.200     0.76170009     0.76387588
-     6.210     0.75939191     0.76156461
-     6.220     0.75709072     0.75926033
-     6.230     0.75479651     0.75696302
-     6.240     0.75250925     0.75467267
-     6.250     0.75022892     0.75238924
-     6.260     0.74795550     0.75011272
-     6.270     0.74568896     0.74784310
-     6.280     0.74342930     0.74558034
-     6.290     0.74117648     0.74332442
-     6.300     0.73893049     0.74107533
-     6.310     0.73669131     0.73883305
-     6.320     0.73445891     0.73659755
-     6.330     0.73223328     0.73436881
-     6.340     0.73001439     0.73214682
-     6.350     0.72780223     0.72993155
-     6.360     0.72559677     0.72772299
-     6.370     0.72339799     0.72552110
-     6.380     0.72120587     0.72332588
-     6.390     0.71902040     0.72113730
-     6.400     0.71684155     0.71895535
-     6.410     0.71466930     0.71677999
-     6.420     0.71250364     0.71461122
-     6.430     0.71034454     0.71244901
-     6.440     0.70819198     0.71029334
-     6.450     0.70604594     0.70814419
-     6.460     0.70390641     0.70600155
-     6.470     0.70177336     0.70386539
-     6.480     0.69964677     0.70173569
-     6.490     0.69752663     0.69961244
-     6.500     0.69541291     0.69749561
-     6.510     0.69330560     0.69538519
-     6.520     0.69120468     0.69328115
-     6.530     0.68911012     0.69118348
-     6.540     0.68702190     0.68909215
-     6.550     0.68494002     0.68700715
-     6.560     0.68286444     0.68492847
-     6.570     0.68079516     0.68285607
-     6.580     0.67873214     0.68078994
-     6.590     0.67667538     0.67873006
-     6.600     0.67462485     0.67667642
-     6.610     0.67258053     0.67462899
-     6.620     0.67054241     0.67258775
-     6.630     0.66851046     0.67055269
-     6.640     0.66648467     0.66852379
-     6.650     0.66446502     0.66650102
-     6.660     0.66245149     0.66448438
-     6.670     0.66044406     0.66247384
-     6.680     0.65844271     0.66046938
-     6.690     0.65644743     0.65847099
-     6.700     0.65445820     0.65647864
-     6.710     0.65247499     0.65449232
-     6.720     0.65049780     0.65251202
-     6.730     0.64852659     0.65053770
-     6.740     0.64656136     0.64856936
-     6.750     0.64460208     0.64660697
-     6.760     0.64264874     0.64465052
-     6.770     0.64070132     0.64269999
-     6.780     0.63875980     0.64075536
-     6.790     0.63682417     0.63881662
-     6.800     0.63489440     0.63688374
-     6.810     0.63297047     0.63495671
-     6.820     0.63105238     0.63303551
-     6.830     0.62914010     0.63112013
-     6.840     0.62723362     0.62921054
-     6.850     0.62533291     0.62730673
-     6.860     0.62343796     0.62540867
-     6.870     0.62154875     0.62351636
-     6.880     0.61966527     0.62162978
-     6.890     0.61778750     0.61974890
-     6.900     0.61591542     0.61787372
-     6.910     0.61404901     0.61600421
-     6.920     0.61218825     0.61414036
-     6.930     0.61033313     0.61228214
-     6.940     0.60848364     0.61042955
-     6.950     0.60663975     0.60858256
-     6.960     0.60480145     0.60674116
-     6.970     0.60296872     0.60490534
-     6.980     0.60114154     0.60307507
-     6.990     0.59931990     0.60125033
-     7.000     0.59750378     0.59943112
-     7.010     0.59569316     0.59761741
-     7.020     0.59388803     0.59580919
-     7.030     0.59208837     0.59400644
-     7.040     0.59029416     0.59220915
-     7.050     0.58850539     0.59041729
-     7.060     0.58672204     0.58863085
-     7.070     0.58494410     0.58684982
-     7.080     0.58317154     0.58507418
-     7.090     0.58140435     0.58330391
-     7.100     0.57964252     0.58153900
-     7.110     0.57788603     0.57977943
-     7.120     0.57613486     0.57802518
-     7.130     0.57438899     0.57627624
-     7.140     0.57264842     0.57453259
-     7.150     0.57091312     0.57279422
-     7.160     0.56918308     0.57106111
-     7.170     0.56745829     0.56933324
-     7.180     0.56573872     0.56761060
-     7.190     0.56402436     0.56589317
-     7.200     0.56231519     0.56418094
-     7.210     0.56061121     0.56247389
-     7.220     0.55891238     0.56077200
-     7.230     0.55721871     0.55907526
-     7.240     0.55553017     0.55738366
-     7.250     0.55384674     0.55569717
-     7.260     0.55216842     0.55401579
-     7.270     0.55049518     0.55233950
-     7.280     0.54882702     0.55066827
-     7.290     0.54716390     0.54900211
-     7.300     0.54550583     0.54734098
-     7.310     0.54385278     0.54568489
-     7.320     0.54220474     0.54403380
-     7.330     0.54056170     0.54238771
-     7.340     0.53892363     0.54074659
-     7.350     0.53729053     0.53911045
-     7.360     0.53566238     0.53747925
-     7.370     0.53403916     0.53585299
-     7.380     0.53242086     0.53423165
-     7.390     0.53080746     0.53261522
-     7.400     0.52919895     0.53100368
-     7.410     0.52759532     0.52939701
-     7.420     0.52599655     0.52779521
-     7.430     0.52440262     0.52619825
-     7.440     0.52281352     0.52460612
-     7.450     0.52122924     0.52301881
-     7.460     0.51964975     0.52143631
-     7.470     0.51807506     0.51985859
-     7.480     0.51650513     0.51828564
-     7.490     0.51493997     0.51671746
-     7.500     0.51337954     0.51515402
-     7.510     0.51182385     0.51359531
-     7.520     0.51027287     0.51204131
-     7.530     0.50872658     0.51049202
-     7.540     0.50718499     0.50894742
-     7.550     0.50564806     0.50740749
-     7.560     0.50411580     0.50587222
-     7.570     0.50258817     0.50434159
-     7.580     0.50106518     0.50281560
-     7.590     0.49954680     0.50129422
-     7.600     0.49803302     0.49977744
-     7.610     0.49652383     0.49826526
-     7.620     0.49501921     0.49675765
-     7.630     0.49351915     0.49525460
-     7.640     0.49202364     0.49375610
-     7.650     0.49053266     0.49226214
-     7.660     0.48904620     0.49077269
-     7.670     0.48756424     0.48928775
-     7.680     0.48608677     0.48780731
-     7.690     0.48461378     0.48633134
-     7.700     0.48314526     0.48485984
-     7.710     0.48168118     0.48339279
-     7.720     0.48022154     0.48193018
-     7.730     0.47876632     0.48047200
-     7.740     0.47731552     0.47901823
-     7.750     0.47586911     0.47756885
-     7.760     0.47442708     0.47612386
-     7.770     0.47298942     0.47468325
-     7.780     0.47155612     0.47324699
-     7.790     0.47012716     0.47181508
-     7.800     0.46870253     0.47038750
-     7.810     0.46728222     0.46896424
-     7.820     0.46586622     0.46754529
-     7.830     0.46445450     0.46613063
-     7.840     0.46304706     0.46472025
-     7.850     0.46164389     0.46331414
-     7.860     0.46024497     0.46191228
-     7.870     0.45885029     0.46051467
-     7.880     0.45745983     0.45912128
-     7.890     0.45607359     0.45773211
-     7.900     0.45469155     0.45634714
-     7.910     0.45331369     0.45496637
-     7.920     0.45194002     0.45358977
-     7.930     0.45057050     0.45221733
-     7.940     0.44920514     0.45084905
-     7.950     0.44784391     0.44948491
-     7.960     0.44648681     0.44812490
-     7.970     0.44513382     0.44676900
-     7.980     0.44378493     0.44541720
-     7.990     0.44244012     0.44406949
-     8.000     0.44109939     0.44272587
-     8.010     0.43976273     0.44138630
-     8.020     0.43843012     0.44005079
-     8.030     0.43710154     0.43871933
-     8.040     0.43577699     0.43739188
-     8.050     0.43445645     0.43606846
-     8.060     0.43313992     0.43474904
-     8.070     0.43182737     0.43343361
-     8.080     0.43051881     0.43212217
-     8.090     0.42921420     0.43081469
-     8.100     0.42791355     0.42951117
-     8.110     0.42661685     0.42821159
-     8.120     0.42532407     0.42691594
-     8.130     0.42403521     0.42562421
-     8.140     0.42275025     0.42433639
-     8.150     0.42146919     0.42305247
-     8.160     0.42019201     0.42177244
-     8.170     0.41891870     0.42049627
-     8.180     0.41764925     0.41922397
-     8.190     0.41638365     0.41795552
-     8.200     0.41512188     0.41669090
-     8.210     0.41386393     0.41543011
-     8.220     0.41260980     0.41417314
-     8.230     0.41135947     0.41291997
-     8.240     0.41011292     0.41167059
-     8.250     0.40887016     0.41042499
-     8.260     0.40763116     0.40918316
-     8.270     0.40639591     0.40794509
-     8.280     0.40516441     0.40671077
-     8.290     0.40393664     0.40548017
-     8.300     0.40271259     0.40425331
-     8.310     0.40149225     0.40303015
-     8.320     0.40027560     0.40181070
-     8.330     0.39906265     0.40059493
-     8.340     0.39785337     0.39938284
-     8.350     0.39664775     0.39817442
-     8.360     0.39544579     0.39696966
-     8.370     0.39424747     0.39576854
-     8.380     0.39305278     0.39457106
-     8.390     0.39186171     0.39337720
-     8.400     0.39067425     0.39218695
-     8.410     0.38949039     0.39100031
-     8.420     0.38831011     0.38981725
-     8.430     0.38713342     0.38863777
-     8.440     0.38596028     0.38746187
-     8.450     0.38479071     0.38628952
-     8.460     0.38362467     0.38512071
-     8.470     0.38246218     0.38395545
-     8.480     0.38130320     0.38279371
-     8.490     0.38014774     0.38163548
-     8.500     0.37899577     0.38048076
-     8.510     0.37784730     0.37932953
-     8.520     0.37670231     0.37818179
-     8.530     0.37556079     0.37703752
-     8.540     0.37442272     0.37589671
-     8.550     0.37328811     0.37475936
-     8.560     0.37215693     0.37362544
-     8.570     0.37102918     0.37249496
-     8.580     0.36990485     0.37136789
-     8.590     0.36878393     0.37024424
-     8.600     0.36766640     0.36912398
-     8.610     0.36655226     0.36800712
-     8.620     0.36544150     0.36689363
-     8.630     0.36433410     0.36578352
-     8.640     0.36323006     0.36467676
-     8.650     0.36212936     0.36357335
-     8.660     0.36103200     0.36247328
-     8.670     0.35993796     0.36137654
-     8.680     0.35884724     0.36028312
-     8.690     0.35775982     0.35919300
-     8.700     0.35667570     0.35810619
-     8.710     0.35559487     0.35702266
-     8.720     0.35451731     0.35594241
-     8.730     0.35344301     0.35486543
-     8.740     0.35237197     0.35379171
-     8.750     0.35130418     0.35272123
-     8.760     0.35023962     0.35165400
-     8.770     0.34917829     0.35058999
-     8.780     0.34812017     0.34952921
-     8.790     0.34706526     0.34847163
-     8.800     0.34601355     0.34741726
-     8.810     0.34496503     0.34636607
-     8.820     0.34391968     0.34531806
-     8.830     0.34287750     0.34427323
-     8.840     0.34183847     0.34323156
-     8.850     0.34080260     0.34219304
-     8.860     0.33976986     0.34115766
-     8.870     0.33874026     0.34012541
-     8.880     0.33771377     0.33909629
-     8.890     0.33669040     0.33807028
-     8.900     0.33567012     0.33704737
-     8.910     0.33465294     0.33602756
-     8.920     0.33363884     0.33501084
-     8.930     0.33262781     0.33399719
-     8.940     0.33161985     0.33298661
-     8.950     0.33061494     0.33197909
-     8.960     0.32961308     0.33097461
-     8.970     0.32861425     0.32997318
-     8.980     0.32761845     0.32897477
-     8.990     0.32662567     0.32797939
-     9.000     0.32563589     0.32698702
-     9.010     0.32464912     0.32599765
-     9.020     0.32366533     0.32501127
-     9.030     0.32268453     0.32402788
-     9.040     0.32170670     0.32304746
-     9.050     0.32073183     0.32207001
-     9.060     0.31975991     0.32109552
-     9.070     0.31879094     0.32012398
-     9.080     0.31782491     0.31915537
-     9.090     0.31686181     0.31818970
-     9.100     0.31590162     0.31722695
-     9.110     0.31494434     0.31626711
-     9.120     0.31398996     0.31531017
-     9.130     0.31303848     0.31435613
-     9.140     0.31208988     0.31340498
-     9.150     0.31114415     0.31245671
-     9.160     0.31020129     0.31151130
-     9.170     0.30926129     0.31056876
-     9.180     0.30832413     0.30962906
-     9.190     0.30738981     0.30869221
-     9.200     0.30645833     0.30775820
-     9.210     0.30552967     0.30682701
-     9.220     0.30460382     0.30589864
-     9.230     0.30368078     0.30497308
-     9.240     0.30276053     0.30405031
-     9.250     0.30184308     0.30313034
-     9.260     0.30092840     0.30221316
-     9.270     0.30001650     0.30129875
-     9.280     0.29910736     0.30038710
-     9.290     0.29820097     0.29947821
-     9.300     0.29729733     0.29857208
-     9.310     0.29639643     0.29766868
-     9.320     0.29549826     0.29676802
-     9.330     0.29460281     0.29587009
-     9.340     0.29371007     0.29497487
-     9.350     0.29282004     0.29408236
-     9.360     0.29193271     0.29319255
-     9.370     0.29104807     0.29230543
-     9.380     0.29016610     0.29142100
-     9.390     0.28928681     0.29053924
-     9.400     0.28841018     0.28966015
-     9.410     0.28753621     0.28878372
-     9.420     0.28666489     0.28790994
-     9.430     0.28579621     0.28703881
-     9.440     0.28493016     0.28617031
-     9.450     0.28406674     0.28530444
-     9.460     0.28320593     0.28444119
-     9.470     0.28234773     0.28358055
-     9.480     0.28149213     0.28272252
-     9.490     0.28063912     0.28186708
-     9.500     0.27978870     0.28101423
-     9.510     0.27894086     0.28016396
-     9.520     0.27809558     0.27931627
-     9.530     0.27725287     0.27847113
-     9.540     0.27641271     0.27762856
-     9.550     0.27557509     0.27678853
-     9.560     0.27474002     0.27595105
-     9.570     0.27390747     0.27511610
-     9.580     0.27307745     0.27428368
-     9.590     0.27224994     0.27345377
-     9.600     0.27142494     0.27262638
-     9.610     0.27060244     0.27180149
-     9.620     0.26978243     0.27097909
-     9.630     0.26896491     0.27015919
-     9.640     0.26814987     0.26934176
-     9.650     0.26733729     0.26852681
-     9.660     0.26652718     0.26771433
-     9.670     0.26571952     0.26690430
-     9.680     0.26491431     0.26609672
-     9.690     0.26411154     0.26529159
-     9.700     0.26331120     0.26448889
-     9.710     0.26251329     0.26368862
-     9.720     0.26171779     0.26289078
-     9.730     0.26092471     0.26209534
-     9.740     0.26013403     0.26130232
-     9.750     0.25934574     0.26051169
-     9.760     0.25855985     0.25972346
-     9.770     0.25777633     0.25893761
-     9.780     0.25699519     0.25815413
-     9.790     0.25621642     0.25737303
-     9.800     0.25544001     0.25659430
-     9.810     0.25466594     0.25581791
-     9.820     0.25389423     0.25504388
-     9.830     0.25312485     0.25427219
-     9.840     0.25235781     0.25350284
-     9.850     0.25159309     0.25273581
-     9.860     0.25083068     0.25197110
-     9.870     0.25007059     0.25120871
-     9.880     0.24931280     0.25044862
-     9.890     0.24855731     0.24969084
-     9.900     0.24780410     0.24893534
-     9.910     0.24705318     0.24818213
-     9.920     0.24630454     0.24743121
-     9.930     0.24555816     0.24668255
-     9.940     0.24481404     0.24593616
-     9.950     0.24407218     0.24519202
-     9.960     0.24333257     0.24445014
-     9.970     0.24259520     0.24371051
-     9.980     0.24186006     0.24297311
-     9.990     0.24112715     0.24223794
-    10.000     0.24039646     0.24150500
-    10.010     0.23966799     0.24077427
-    10.020     0.23894172     0.24004576
-    10.030     0.23821766     0.23931945
-    10.040     0.23749579     0.23859533
-    10.050     0.23677610     0.23787341
-    10.060     0.23605860     0.23715367
-    10.070     0.23534327     0.23643611
-    10.080     0.23463011     0.23572073
-    10.090     0.23391911     0.23500750
-    10.100     0.23321026     0.23429644
-    10.110     0.23250356     0.23358752
-    10.120     0.23179901     0.23288075
-    10.130     0.23109659     0.23217612
-    10.140     0.23039629     0.23147362
-    10.150     0.22969812     0.23077325
-    10.160     0.22900207     0.23007499
-    10.170     0.22830812     0.22937885
-    10.180     0.22761628     0.22868482
-    10.190     0.22692653     0.22799288
-    10.200     0.22623888     0.22730304
-    10.210     0.22555331     0.22661528
-    10.220     0.22486981     0.22592961
-    10.230     0.22418839     0.22524601
-    10.240     0.22350903     0.22456448
-    10.250     0.22283173     0.22388501
-    10.260     0.22215648     0.22320760
-    10.270     0.22148328     0.22253224
-    10.280     0.22081212     0.22185892
-    10.290     0.22014299     0.22118764
-    10.300     0.21947589     0.22051839
-    10.310     0.21881081     0.21985116
-    10.320     0.21814775     0.21918595
-    10.330     0.21748669     0.21852276
-    10.340     0.21682764     0.21786157
-    10.350     0.21617059     0.21720238
-    10.360     0.21551553     0.21654519
-    10.370     0.21486245     0.21588998
-    10.380     0.21421135     0.21523676
-    10.390     0.21356223     0.21458552
-    10.400     0.21291507     0.21393624
-    10.410     0.21226987     0.21328893
-    10.420     0.21162663     0.21264358
-    10.430     0.21098534     0.21200018
-    10.440     0.21034599     0.21135873
-    10.450     0.20970858     0.21071922
-    10.460     0.20907309     0.21008164
-    10.470     0.20843954     0.20944599
-    10.480     0.20780790     0.20881227
-    10.490     0.20717818     0.20818046
-    10.500     0.20655037     0.20755057
-    10.510     0.20592446     0.20692258
-    10.520     0.20530045     0.20629649
-    10.530     0.20467833     0.20567229
-    10.540     0.20405809     0.20504999
-    10.550     0.20343973     0.20442957
-    10.560     0.20282325     0.20381102
-    10.570     0.20220863     0.20319435
-    10.580     0.20159588     0.20257954
-    10.590     0.20098498     0.20196659
-    10.600     0.20037593     0.20135550
-    10.610     0.19976873     0.20074625
-    10.620     0.19916337     0.20013885
-    10.630     0.19855985     0.19953329
-    10.640     0.19795815     0.19892956
-    10.650     0.19735828     0.19832765
-    10.660     0.19676022     0.19772757
-    10.670     0.19616398     0.19712930
-    10.680     0.19556954     0.19653284
-    10.690     0.19497691     0.19593819
-    10.700     0.19438607     0.19534534
-    10.710     0.19379702     0.19475428
-    10.720     0.19320976     0.19416501
-    10.730     0.19262427     0.19357752
-    10.740     0.19204056     0.19299181
-    10.750     0.19145862     0.19240787
-    10.760     0.19087845     0.19182570
-    10.770     0.19030003     0.19124529
-    10.780     0.18972336     0.19066663
-    10.790     0.18914844     0.19008973
-    10.800     0.18857526     0.18951457
-    10.810     0.18800382     0.18894115
-    10.820     0.18743411     0.18836947
-    10.830     0.18686613     0.18779952
-    10.840     0.18629987     0.18723129
-    10.850     0.18573533     0.18666478
-    10.860     0.18517249     0.18609999
-    10.870     0.18461136     0.18553690
-    10.880     0.18405193     0.18497552
-    10.890     0.18349420     0.18441584
-    10.900     0.18293816     0.18385785
-    10.910     0.18238380     0.18330155
-    10.920     0.18183112     0.18274693
-    10.930     0.18128012     0.18219399
-    10.940     0.18073079     0.18164272
-    10.950     0.18018312     0.18109312
-    10.960     0.17963711     0.18054518
-    10.970     0.17909275     0.17999890
-    10.980     0.17855005     0.17945428
-    10.990     0.17800899     0.17891130
-    11.000     0.17746956     0.17836997
-    11.010     0.17693178     0.17783027
-    11.020     0.17639562     0.17729221
-    11.030     0.17586109     0.17675577
-    11.040     0.17532818     0.17622096
-    11.050     0.17479688     0.17568776
-    11.060     0.17426719     0.17515618
-    11.070     0.17373911     0.17462621
-    11.080     0.17321263     0.17409784
-    11.090     0.17268774     0.17357107
-    11.100     0.17216444     0.17304589
-    11.110     0.17164273     0.17252230
-    11.120     0.17112260     0.17200030
-    11.130     0.17060405     0.17147988
-    11.140     0.17008707     0.17096103
-    11.150     0.16957165     0.17044375
-    11.160     0.16905780     0.16992803
-    11.170     0.16854550     0.16941388
-    11.180     0.16803476     0.16890128
-    11.190     0.16752556     0.16839023
-    11.200     0.16701791     0.16788073
-    11.210     0.16651180     0.16737277
-    11.220     0.16600721     0.16686635
-    11.230     0.16550416     0.16636146
-    11.240     0.16500263     0.16585810
-    11.250     0.16450263     0.16535626
-    11.260     0.16400413     0.16485594
-    11.270     0.16350715     0.16435713
-    11.280     0.16301167     0.16385983
-    11.290     0.16251770     0.16336404
-    11.300     0.16202522     0.16286974
-    11.310     0.16153424     0.16237695
-    11.320     0.16104474     0.16188564
-    11.330     0.16055672     0.16139582
-    11.340     0.16007019     0.16090748
-    11.350     0.15958513     0.16042062
-    11.360     0.15910154     0.15993523
-    11.370     0.15861941     0.15945132
-    11.380     0.15813875     0.15896886
-    11.390     0.15765954     0.15848787
-    11.400     0.15718178     0.15800833
-    11.410     0.15670547     0.15753024
-    11.420     0.15623061     0.15705360
-    11.430     0.15575718     0.15657840
-    11.440     0.15528519     0.15610464
-    11.450     0.15481463     0.15563231
-    11.460     0.15434549     0.15516141
-    11.470     0.15387778     0.15469193
-    11.480     0.15341148     0.15422388
-    11.490     0.15294660     0.15375724
-    11.500     0.15248313     0.15329202
-    11.510     0.15202106     0.15282820
-    11.520     0.15156039     0.15236578
-    11.530     0.15110111     0.15190477
-    11.540     0.15064323     0.15144515
-    11.550     0.15018674     0.15098692
-    11.560     0.14973162     0.15053007
-    11.570     0.14927789     0.15007461
-    11.580     0.14882553     0.14962053
-    11.590     0.14837455     0.14916782
-    11.600     0.14792493     0.14871648
-    11.610     0.14747667     0.14826651
-    11.620     0.14702977     0.14781789
-    11.630     0.14658423     0.14737064
-    11.640     0.14614003     0.14692474
-    11.650     0.14569718     0.14648018
-    11.660     0.14525568     0.14603698
-    11.670     0.14481551     0.14559511
-    11.680     0.14437667     0.14515458
-    11.690     0.14393917     0.14471538
-    11.700     0.14350299     0.14427752
-    11.710     0.14306813     0.14384097
-    11.720     0.14263459     0.14340575
-    11.730     0.14220237     0.14297185
-    11.740     0.14177145     0.14253925
-    11.750     0.14134184     0.14210797
-    11.760     0.14091353     0.14167799
-    11.770     0.14048652     0.14124932
-    11.780     0.14006080     0.14082194
-    11.790     0.13963638     0.14039585
-    11.800     0.13921324     0.13997105
-    11.810     0.13879138     0.13954754
-    11.820     0.13837080     0.13912531
-    11.830     0.13795149     0.13870435
-    11.840     0.13753346     0.13828467
-    11.850     0.13711669     0.13786626
-    11.860     0.13670118     0.13744912
-    11.870     0.13628694     0.13703324
-    11.880     0.13587395     0.13661861
-    11.890     0.13546221     0.13620524
-    11.900     0.13505172     0.13579312
-    11.910     0.13464247     0.13538225
-    11.920     0.13423446     0.13497262
-    11.930     0.13382769     0.13456424
-    11.940     0.13342215     0.13415708
-    11.950     0.13301784     0.13375116
-    11.960     0.13261476     0.13334647
-    11.970     0.13221290     0.13294300
-    11.980     0.13181225     0.13254075
-    11.990     0.13141282     0.13213972
-    12.000     0.13101460     0.13173990
-    12.010     0.13061758     0.13134130
-    12.020     0.13022177     0.13094389
-    12.030     0.12982716     0.13054770
-    12.040     0.12943375     0.13015270
-    12.050     0.12904152     0.12975889
-    12.060     0.12865049     0.12936628
-    12.070     0.12826064     0.12897485
-    12.080     0.12787197     0.12858461
-    12.090     0.12748448     0.12819555
-    12.100     0.12709816     0.12780767
-    12.110     0.12671302     0.12742096
-    12.120     0.12632904     0.12703542
-    12.130     0.12594622     0.12665104
-    12.140     0.12556457     0.12626783
-    12.150     0.12518407     0.12588578
-    12.160     0.12480472     0.12550489
-    12.170     0.12442653     0.12512515
-    12.180     0.12404948     0.12474655
-    12.190     0.12367357     0.12436911
-    12.200     0.12329880     0.12399280
-    12.210     0.12292517     0.12361763
-    12.220     0.12255267     0.12324360
-    12.230     0.12218130     0.12287070
-    12.240     0.12181105     0.12249893
-    12.250     0.12144192     0.12212828
-    12.260     0.12107392     0.12175876
-    12.270     0.12070703     0.12139035
-    12.280     0.12034125     0.12102306
-    12.290     0.11997658     0.12065687
-    12.300     0.11961301     0.12029180
-    12.310     0.11925055     0.11992783
-    12.320     0.11888918     0.11956496
-    12.330     0.11852891     0.11920319
-    12.340     0.11816974     0.11884252
-    12.350     0.11781165     0.11848294
-    12.360     0.11745464     0.11812444
-    12.370     0.11709872     0.11776703
-    12.380     0.11674387     0.11741070
-    12.390     0.11639010     0.11705545
-    12.400     0.11603741     0.11670127
-    12.410     0.11568578     0.11634817
-    12.420     0.11533522     0.11599613
-    12.430     0.11498571     0.11564516
-    12.440     0.11463727     0.11529525
-    12.450     0.11428989     0.11494640
-    12.460     0.11394355     0.11459860
-    12.470     0.11359827     0.11425186
-    12.480     0.11325403     0.11390617
-    12.490     0.11291084     0.11356152
-    12.500     0.11256869     0.11321791
-    12.510     0.11222757     0.11287535
-    12.520     0.11188748     0.11253382
-    12.530     0.11154843     0.11219332
-    12.540     0.11121041     0.11185386
-    12.550     0.11087340     0.11151542
-    12.560     0.11053742     0.11117801
-    12.570     0.11020246     0.11084161
-    12.580     0.10986852     0.11050624
-    12.590     0.10953558     0.11017188
-    12.600     0.10920366     0.10983853
-    12.610     0.10887274     0.10950619
-    12.620     0.10854282     0.10917485
-    12.630     0.10821390     0.10884452
-    12.640     0.10788598     0.10851519
-    12.650     0.10755905     0.10818685
-    12.660     0.10723312     0.10785951
-    12.670     0.10690817     0.10753316
-    12.680     0.10658420     0.10720779
-    12.690     0.10626122     0.10688341
-    12.700     0.10593922     0.10656001
-    12.710     0.10561819     0.10623759
-    12.720     0.10529813     0.10591615
-    12.730     0.10497905     0.10559568
-    12.740     0.10466093     0.10527617
-    12.750     0.10434378     0.10495764
-    12.760     0.10402758     0.10464007
-    12.770     0.10371235     0.10432346
-    12.780     0.10339807     0.10400780
-    12.790     0.10308474     0.10369310
-    12.800     0.10277236     0.10337936
-    12.810     0.10246093     0.10306656
-    12.820     0.10215044     0.10275471
-    12.830     0.10184090     0.10244380
-    12.840     0.10153229     0.10213384
-    12.850     0.10122461     0.10182481
-    12.860     0.10091787     0.10151672
-    12.870     0.10061206     0.10120956
-    12.880     0.10030718     0.10090333
-    12.890     0.10000321     0.10059802
-    12.900     0.09970017     0.10029364
-    12.910     0.09939805     0.09999018
-    12.920     0.09909685     0.09968764
-    12.930     0.09879655     0.09938601
-    12.940     0.09849717     0.09908530
-    12.950     0.09819869     0.09878549
-    12.960     0.09790112     0.09848660
-    12.970     0.09760445     0.09818860
-    12.980     0.09730868     0.09789151
-    12.990     0.09701381     0.09759532
-    13.000     0.09671982     0.09730003
-    13.010     0.09642673     0.09700562
-    13.020     0.09613453     0.09671211
-    13.030     0.09584321     0.09641949
-    13.040     0.09555278     0.09612775
-    13.050     0.09526323     0.09583690
-    13.060     0.09497455     0.09554692
-    13.070     0.09468675     0.09525782
-    13.080     0.09439982     0.09496960
-    13.090     0.09411376     0.09468225
-    13.100     0.09382857     0.09439577
-    13.110     0.09354424     0.09411015
-    13.120     0.09326077     0.09382540
-    13.130     0.09297816     0.09354151
-    13.140     0.09269641     0.09325848
-    13.150     0.09241551     0.09297631
-    13.160     0.09213546     0.09269499
-    13.170     0.09185627     0.09241452
-    13.180     0.09157791     0.09213490
-    13.190     0.09130040     0.09185613
-    13.200     0.09102374     0.09157819
-    13.210     0.09074791     0.09130110
-    13.220     0.09047291     0.09102485
-    13.230     0.09019875     0.09074944
diff --git a/20191212/loesung-1c.tikz b/20191212/loesung-1c.tikz
deleted file mode 100644
index ee3d0571b2e366d18db02938968fafca2432681e..0000000000000000000000000000000000000000
--- a/20191212/loesung-1c.tikz
+++ /dev/null
@@ -1,521 +0,0 @@
-\begin{tikzpicture}[gnuplot]
-%% generated with GNUPLOT 5.0p5 (Lua 5.1; terminal rev. 99, script rev. 100)
-%% Mi 14 Nov 2018 19:24:42 CET
-\path (0.000,0.000) rectangle (12.500,8.750);
-\gpcolor{color=gp lt color border}
-\gpsetlinetype{gp lt border}
-\gpsetdashtype{gp dt solid}
-\gpsetlinewidth{1.00}
-\draw[gp path] (1.012,0.616)--(1.192,0.616);
-\draw[gp path] (11.947,0.616)--(11.767,0.616);
-\node[gp node right] at (0.828,0.616) {$0$};
-\draw[gp path] (1.012,1.393)--(1.192,1.393);
-\draw[gp path] (11.947,1.393)--(11.767,1.393);
-\node[gp node right] at (0.828,1.393) {$0.5$};
-\draw[gp path] (1.012,2.169)--(1.192,2.169);
-\draw[gp path] (11.947,2.169)--(11.767,2.169);
-\node[gp node right] at (0.828,2.169) {$1$};
-\draw[gp path] (1.012,2.946)--(1.192,2.946);
-\draw[gp path] (11.947,2.946)--(11.767,2.946);
-\node[gp node right] at (0.828,2.946) {$1.5$};
-\draw[gp path] (1.012,3.722)--(1.192,3.722);
-\draw[gp path] (11.947,3.722)--(11.767,3.722);
-\node[gp node right] at (0.828,3.722) {$2$};
-\draw[gp path] (1.012,4.499)--(1.192,4.499);
-\draw[gp path] (11.947,4.499)--(11.767,4.499);
-\node[gp node right] at (0.828,4.499) {$2.5$};
-\draw[gp path] (1.012,5.275)--(1.192,5.275);
-\draw[gp path] (11.947,5.275)--(11.767,5.275);
-\node[gp node right] at (0.828,5.275) {$3$};
-\draw[gp path] (1.012,6.052)--(1.192,6.052);
-\draw[gp path] (11.947,6.052)--(11.767,6.052);
-\node[gp node right] at (0.828,6.052) {$3.5$};
-\draw[gp path] (1.012,6.828)--(1.192,6.828);
-\draw[gp path] (11.947,6.828)--(11.767,6.828);
-\node[gp node right] at (0.828,6.828) {$4$};
-\draw[gp path] (1.012,7.605)--(1.192,7.605);
-\draw[gp path] (11.947,7.605)--(11.767,7.605);
-\node[gp node right] at (0.828,7.605) {$4.5$};
-\draw[gp path] (1.012,8.381)--(1.192,8.381);
-\draw[gp path] (11.947,8.381)--(11.767,8.381);
-\node[gp node right] at (0.828,8.381) {$5$};
-\draw[gp path] (1.012,0.616)--(1.012,0.796);
-\draw[gp path] (1.012,8.381)--(1.012,8.201);
-\node[gp node center] at (1.012,0.308) {$0$};
-\draw[gp path] (2.574,0.616)--(2.574,0.796);
-\draw[gp path] (2.574,8.381)--(2.574,8.201);
-\node[gp node center] at (2.574,0.308) {$2$};
-\draw[gp path] (4.136,0.616)--(4.136,0.796);
-\draw[gp path] (4.136,8.381)--(4.136,8.201);
-\node[gp node center] at (4.136,0.308) {$4$};
-\draw[gp path] (5.698,0.616)--(5.698,0.796);
-\draw[gp path] (5.698,8.381)--(5.698,8.201);
-\node[gp node center] at (5.698,0.308) {$6$};
-\draw[gp path] (7.261,0.616)--(7.261,0.796);
-\draw[gp path] (7.261,8.381)--(7.261,8.201);
-\node[gp node center] at (7.261,0.308) {$8$};
-\draw[gp path] (8.823,0.616)--(8.823,0.796);
-\draw[gp path] (8.823,8.381)--(8.823,8.201);
-\node[gp node center] at (8.823,0.308) {$10$};
-\draw[gp path] (10.385,0.616)--(10.385,0.796);
-\draw[gp path] (10.385,8.381)--(10.385,8.201);
-\node[gp node center] at (10.385,0.308) {$12$};
-\draw[gp path] (11.947,0.616)--(11.947,0.796);
-\draw[gp path] (11.947,8.381)--(11.947,8.201);
-\node[gp node center] at (11.947,0.308) {$14$};
-\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle;
-\node[gp node right] at (10.479,8.047) {Simulation};
-\gpcolor{rgb color={0.580,0.000,0.827}}
-\draw[gp path] (10.663,8.047)--(11.579,8.047);
-\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)%
-  --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)%
-  --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.035)--(1.137,8.013)%
-  --(1.145,7.991)--(1.153,7.968)--(1.160,7.946)--(1.168,7.924)--(1.176,7.901)--(1.184,7.879)%
-  --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)%
-  --(1.239,7.727)--(1.246,7.705)--(1.254,7.684)--(1.262,7.662)--(1.270,7.642)--(1.278,7.620)%
-  --(1.285,7.598)--(1.293,7.578)--(1.301,7.556)--(1.309,7.535)--(1.317,7.514)--(1.324,7.493)%
-  --(1.332,7.472)--(1.340,7.452)--(1.348,7.431)--(1.356,7.410)--(1.363,7.390)--(1.371,7.370)%
-  --(1.379,7.348)--(1.387,7.328)--(1.395,7.308)--(1.403,7.288)--(1.410,7.267)--(1.418,7.247)%
-  --(1.426,7.227)--(1.434,7.207)--(1.442,7.187)--(1.449,7.168)--(1.457,7.148)--(1.465,7.128)%
-  --(1.473,7.108)--(1.481,7.089)--(1.488,7.069)--(1.496,7.049)--(1.504,7.030)--(1.512,7.010)%
-  --(1.520,6.991)--(1.528,6.971)--(1.535,6.952)--(1.543,6.934)--(1.551,6.913)--(1.559,6.895)%
-  --(1.567,6.876)--(1.574,6.858)--(1.582,6.837)--(1.590,6.819)--(1.598,6.800)--(1.606,6.781)%
-  --(1.613,6.763)--(1.621,6.744)--(1.629,6.726)--(1.637,6.707)--(1.645,6.688)--(1.652,6.670)%
-  --(1.660,6.653)--(1.668,6.634)--(1.676,6.615)--(1.684,6.597)--(1.692,6.580)--(1.699,6.561)%
-  --(1.707,6.542)--(1.715,6.525)--(1.723,6.507)--(1.731,6.489)--(1.738,6.471)--(1.746,6.454)%
-  --(1.754,6.437)--(1.762,6.418)--(1.770,6.401)--(1.777,6.384)--(1.785,6.365)--(1.793,6.348)%
-  --(1.801,6.331)--(1.809,6.314)--(1.817,6.297)--(1.824,6.280)--(1.832,6.263)--(1.840,6.246)%
-  --(1.848,6.229)--(1.856,6.211)--(1.863,6.194)--(1.871,6.177)--(1.879,6.160)--(1.887,6.143)%
-  --(1.895,6.126)--(1.902,6.111)--(1.910,6.093)--(1.918,6.076)--(1.926,6.061)--(1.934,6.044)%
-  --(1.941,6.027)--(1.949,6.011)--(1.957,5.994)--(1.965,5.979)--(1.973,5.961)--(1.981,5.946)%
-  --(1.988,5.929)--(1.996,5.913)--(2.004,5.898)--(2.012,5.881)--(2.020,5.865)--(2.027,5.850)%
-  --(2.035,5.834)--(2.043,5.819)--(2.051,5.801)--(2.059,5.786)--(2.066,5.770)--(2.074,5.755)%
-  --(2.082,5.739)--(2.090,5.724)--(2.098,5.708)--(2.106,5.693)--(2.113,5.677)--(2.121,5.662)%
-  --(2.129,5.648)--(2.137,5.632)--(2.145,5.617)--(2.152,5.601)--(2.160,5.587)--(2.168,5.572)%
-  --(2.176,5.556)--(2.184,5.541)--(2.191,5.527)--(2.199,5.511)--(2.207,5.497)--(2.215,5.482)%
-  --(2.223,5.468)--(2.230,5.452)--(2.238,5.438)--(2.246,5.423)--(2.254,5.409)--(2.262,5.395)%
-  --(2.270,5.379)--(2.277,5.365)--(2.285,5.351)--(2.293,5.337)--(2.301,5.322)--(2.309,5.308)%
-  --(2.316,5.294)--(2.324,5.280)--(2.332,5.266)--(2.340,5.252)--(2.348,5.238)--(2.355,5.224)%
-  --(2.363,5.210)--(2.371,5.196)--(2.379,5.182)--(2.387,5.168)--(2.394,5.154)--(2.402,5.140)%
-  --(2.410,5.126)--(2.418,5.112)--(2.426,5.100)--(2.434,5.086)--(2.441,5.072)--(2.449,5.059)%
-  --(2.457,5.045)--(2.465,5.031)--(2.473,5.019)--(2.480,5.005)--(2.488,4.991)--(2.496,4.978)%
-  --(2.504,4.964)--(2.512,4.952)--(2.519,4.938)--(2.527,4.926)--(2.535,4.913)--(2.543,4.899)%
-  --(2.551,4.887)--(2.559,4.874)--(2.566,4.860)--(2.574,4.848)--(2.582,4.836)--(2.590,4.822)%
-  --(2.598,4.809)--(2.605,4.797)--(2.613,4.784)--(2.621,4.772)--(2.629,4.759)--(2.637,4.747)%
-  --(2.644,4.735)--(2.652,4.722)--(2.660,4.710)--(2.668,4.697)--(2.676,4.685)--(2.683,4.672)%
-  --(2.691,4.660)--(2.699,4.648)--(2.707,4.635)--(2.715,4.623)--(2.723,4.610)--(2.730,4.598)%
-  --(2.738,4.587)--(2.746,4.575)--(2.754,4.562)--(2.762,4.551)--(2.769,4.539)--(2.777,4.526)%
-  --(2.785,4.516)--(2.793,4.503)--(2.801,4.491)--(2.808,4.480)--(2.816,4.467)--(2.824,4.457)%
-  --(2.832,4.444)--(2.840,4.433)--(2.848,4.421)--(2.855,4.410)--(2.863,4.399)--(2.871,4.387)%
-  --(2.879,4.376)--(2.887,4.363)--(2.894,4.353)--(2.902,4.342)--(2.910,4.331)--(2.918,4.318)%
-  --(2.926,4.307)--(2.933,4.297)--(2.941,4.286)--(2.949,4.275)--(2.957,4.262)--(2.965,4.252)%
-  --(2.972,4.241)--(2.980,4.230)--(2.988,4.219)--(2.996,4.208)--(3.004,4.197)--(3.012,4.186)%
-  --(3.019,4.175)--(3.027,4.165)--(3.035,4.154)--(3.043,4.143)--(3.051,4.132)--(3.058,4.123)%
-  --(3.066,4.112)--(3.074,4.101)--(3.082,4.090)--(3.090,4.079)--(3.097,4.070)--(3.105,4.059)%
-  --(3.113,4.048)--(3.121,4.037)--(3.129,4.028)--(3.137,4.017)--(3.144,4.006)--(3.152,3.997)%
-  --(3.160,3.986)--(3.168,3.977)--(3.176,3.966)--(3.183,3.957)--(3.191,3.946)--(3.199,3.936)%
-  --(3.207,3.925)--(3.215,3.916)--(3.222,3.905)--(3.230,3.896)--(3.238,3.885)--(3.246,3.876)%
-  --(3.254,3.866)--(3.261,3.856)--(3.269,3.846)--(3.277,3.837)--(3.285,3.826)--(3.293,3.817)%
-  --(3.301,3.807)--(3.308,3.798)--(3.316,3.787)--(3.324,3.778)--(3.332,3.769)--(3.340,3.759)%
-  --(3.347,3.750)--(3.355,3.741)--(3.363,3.731)--(3.371,3.720)--(3.379,3.711)--(3.386,3.702)%
-  --(3.394,3.692)--(3.402,3.683)--(3.410,3.674)--(3.418,3.665)--(3.426,3.655)--(3.433,3.647)%
-  --(3.441,3.638)--(3.449,3.629)--(3.457,3.620)--(3.465,3.610)--(3.472,3.601)--(3.480,3.592)%
-  --(3.488,3.584)--(3.496,3.574)--(3.504,3.565)--(3.511,3.556)--(3.519,3.547)--(3.527,3.539)%
-  --(3.535,3.529)--(3.543,3.520)--(3.550,3.512)--(3.558,3.503)--(3.566,3.494)--(3.574,3.486)%
-  --(3.582,3.477)--(3.590,3.469)--(3.597,3.460)--(3.605,3.450)--(3.613,3.442)--(3.621,3.433)%
-  --(3.629,3.425)--(3.636,3.416)--(3.644,3.408)--(3.652,3.401)--(3.660,3.391)--(3.668,3.383)%
-  --(3.675,3.374)--(3.683,3.366)--(3.691,3.359)--(3.699,3.349)--(3.707,3.342)--(3.715,3.334)%
-  --(3.722,3.324)--(3.730,3.317)--(3.738,3.309)--(3.746,3.300)--(3.754,3.292)--(3.761,3.284)%
-  --(3.769,3.276)--(3.777,3.269)--(3.785,3.259)--(3.793,3.251)--(3.800,3.244)--(3.808,3.236)%
-  --(3.816,3.228)--(3.824,3.220)--(3.832,3.213)--(3.839,3.205)--(3.847,3.197)--(3.855,3.189)%
-  --(3.863,3.182)--(3.871,3.174)--(3.879,3.166)--(3.886,3.158)--(3.894,3.150)--(3.902,3.143)%
-  --(3.910,3.135)--(3.918,3.127)--(3.925,3.119)--(3.933,3.112)--(3.941,3.104)--(3.949,3.096)%
-  --(3.957,3.088)--(3.964,3.082)--(3.972,3.074)--(3.980,3.067)--(3.988,3.059)--(3.996,3.051)%
-  --(4.004,3.045)--(4.011,3.037)--(4.019,3.029)--(4.027,3.023)--(4.035,3.015)--(4.043,3.008)%
-  --(4.050,3.001)--(4.058,2.994)--(4.066,2.986)--(4.074,2.980)--(4.082,2.972)--(4.089,2.964)%
-  --(4.097,2.958)--(4.105,2.950)--(4.113,2.944)--(4.121,2.936)--(4.128,2.930)--(4.136,2.922)%
-  --(4.144,2.916)--(4.152,2.908)--(4.160,2.902)--(4.168,2.894)--(4.175,2.888)--(4.183,2.880)%
-  --(4.191,2.874)--(4.199,2.866)--(4.207,2.860)--(4.214,2.854)--(4.222,2.846)--(4.230,2.840)%
-  --(4.238,2.834)--(4.246,2.826)--(4.253,2.820)--(4.261,2.813)--(4.269,2.806)--(4.277,2.800)%
-  --(4.285,2.793)--(4.293,2.787)--(4.300,2.779)--(4.308,2.773)--(4.316,2.767)--(4.324,2.761)%
-  --(4.332,2.754)--(4.339,2.747)--(4.347,2.741)--(4.355,2.734)--(4.363,2.728)--(4.371,2.722)%
-  --(4.378,2.716)--(4.386,2.709)--(4.394,2.703)--(4.402,2.695)--(4.410,2.689)--(4.417,2.683)%
-  --(4.425,2.677)--(4.433,2.671)--(4.441,2.664)--(4.449,2.658)--(4.457,2.652)--(4.464,2.646)%
-  --(4.472,2.640)--(4.480,2.633)--(4.488,2.629)--(4.496,2.622)--(4.503,2.616)--(4.511,2.610)%
-  --(4.519,2.604)--(4.527,2.598)--(4.535,2.591)--(4.542,2.585)--(4.550,2.579)--(4.558,2.574)%
-  --(4.566,2.568)--(4.574,2.562)--(4.581,2.556)--(4.589,2.549)--(4.597,2.545)--(4.605,2.539)%
-  --(4.613,2.532)--(4.621,2.526)--(4.628,2.522)--(4.636,2.515)--(4.644,2.509)--(4.652,2.504)%
-  --(4.660,2.498)--(4.667,2.492)--(4.675,2.487)--(4.683,2.481)--(4.691,2.475)--(4.699,2.470)%
-  --(4.706,2.464)--(4.714,2.458)--(4.722,2.453)--(4.730,2.447)--(4.738,2.442)--(4.746,2.436)%
-  --(4.753,2.430)--(4.761,2.425)--(4.769,2.419)--(4.777,2.414)--(4.785,2.408)--(4.792,2.404)%
-  --(4.800,2.397)--(4.808,2.393)--(4.816,2.386)--(4.824,2.382)--(4.831,2.377)--(4.839,2.371)%
-  --(4.847,2.366)--(4.855,2.360)--(4.863,2.355)--(4.870,2.349)--(4.878,2.344)--(4.886,2.340)%
-  --(4.894,2.334)--(4.902,2.329)--(4.910,2.324)--(4.917,2.318)--(4.925,2.313)--(4.933,2.309)%
-  --(4.941,2.303)--(4.949,2.298)--(4.956,2.293)--(4.964,2.289)--(4.972,2.282)--(4.980,2.278)%
-  --(4.988,2.273)--(4.995,2.268)--(5.003,2.262)--(5.011,2.258)--(5.019,2.253)--(5.027,2.248)%
-  --(5.035,2.244)--(5.042,2.237)--(5.050,2.233)--(5.058,2.228)--(5.066,2.223)--(5.074,2.219)%
-  --(5.081,2.214)--(5.089,2.209)--(5.097,2.203)--(5.105,2.199)--(5.113,2.194)--(5.120,2.189)%
-  --(5.128,2.185)--(5.136,2.180)--(5.144,2.175)--(5.152,2.171)--(5.159,2.166)--(5.167,2.161)%
-  --(5.175,2.157)--(5.183,2.152)--(5.191,2.147)--(5.199,2.143)--(5.206,2.138)--(5.214,2.133)%
-  --(5.222,2.129)--(5.230,2.124)--(5.238,2.119)--(5.245,2.115)--(5.253,2.110)--(5.261,2.105)%
-  --(5.269,2.101)--(5.277,2.096)--(5.284,2.093)--(5.292,2.088)--(5.300,2.084)--(5.308,2.079)%
-  --(5.316,2.074)--(5.324,2.070)--(5.331,2.065)--(5.339,2.062)--(5.347,2.057)--(5.355,2.053)%
-  --(5.363,2.048)--(5.370,2.043)--(5.378,2.040)--(5.386,2.035)--(5.394,2.031)--(5.402,2.026)%
-  --(5.409,2.023)--(5.417,2.018)--(5.425,2.014)--(5.433,2.009)--(5.441,2.006)--(5.448,2.001)%
-  --(5.456,1.997)--(5.464,1.994)--(5.472,1.989)--(5.480,1.984)--(5.488,1.980)--(5.495,1.976)%
-  --(5.503,1.972)--(5.511,1.969)--(5.519,1.964)--(5.527,1.959)--(5.534,1.956)--(5.542,1.952)%
-  --(5.550,1.947)--(5.558,1.944)--(5.566,1.939)--(5.573,1.936)--(5.581,1.931)--(5.589,1.927)%
-  --(5.597,1.924)--(5.605,1.919)--(5.613,1.916)--(5.620,1.911)--(5.628,1.908)--(5.636,1.903)%
-  --(5.644,1.900)--(5.652,1.896)--(5.659,1.893)--(5.667,1.888)--(5.675,1.885)--(5.683,1.880)%
-  --(5.691,1.877)--(5.698,1.872)--(5.706,1.869)--(5.714,1.865)--(5.722,1.862)--(5.730,1.858)%
-  --(5.737,1.854)--(5.745,1.851)--(5.753,1.846)--(5.761,1.843)--(5.769,1.840)--(5.777,1.835)%
-  --(5.784,1.832)--(5.792,1.827)--(5.800,1.824)--(5.808,1.821)--(5.816,1.816)--(5.823,1.813)%
-  --(5.831,1.810)--(5.839,1.806)--(5.847,1.802)--(5.855,1.799)--(5.862,1.795)--(5.870,1.792)%
-  --(5.878,1.789)--(5.886,1.785)--(5.894,1.781)--(5.902,1.778)--(5.909,1.775)--(5.917,1.770)%
-  --(5.925,1.767)--(5.933,1.764)--(5.941,1.761)--(5.948,1.756)--(5.956,1.753)--(5.964,1.750)%
-  --(5.972,1.747)--(5.980,1.743)--(5.987,1.739)--(5.995,1.736)--(6.003,1.733)--(6.011,1.730)%
-  --(6.019,1.726)--(6.026,1.723)--(6.034,1.719)--(6.042,1.716)--(6.050,1.712)--(6.058,1.709)%
-  --(6.066,1.706)--(6.073,1.703)--(6.081,1.700)--(6.089,1.695)--(6.097,1.692)--(6.105,1.689)%
-  --(6.112,1.686)--(6.120,1.683)--(6.128,1.680)--(6.136,1.677)--(6.144,1.674)--(6.151,1.670)%
-  --(6.159,1.667)--(6.167,1.664)--(6.175,1.661)--(6.183,1.658)--(6.191,1.655)--(6.198,1.650)%
-  --(6.206,1.647)--(6.214,1.644)--(6.222,1.641)--(6.230,1.638)--(6.237,1.635)--(6.245,1.632)%
-  --(6.253,1.629)--(6.261,1.625)--(6.269,1.624)--(6.276,1.621)--(6.284,1.618)--(6.292,1.615)%
-  --(6.300,1.611)--(6.308,1.608)--(6.315,1.605)--(6.323,1.602)--(6.331,1.599)--(6.339,1.596)%
-  --(6.347,1.593)--(6.355,1.590)--(6.362,1.587)--(6.370,1.584)--(6.378,1.582)--(6.386,1.579)%
-  --(6.394,1.576)--(6.401,1.573)--(6.409,1.570)--(6.417,1.566)--(6.425,1.563)--(6.433,1.560)%
-  --(6.440,1.559)--(6.448,1.556)--(6.456,1.552)--(6.464,1.549)--(6.472,1.546)--(6.480,1.545)%
-  --(6.487,1.542)--(6.495,1.538)--(6.503,1.535)--(6.511,1.532)--(6.519,1.531)--(6.526,1.528)%
-  --(6.534,1.525)--(6.542,1.521)--(6.550,1.518)--(6.558,1.517)--(6.565,1.514)--(6.573,1.511)%
-  --(6.581,1.507)--(6.589,1.506)--(6.597,1.503)--(6.604,1.500)--(6.612,1.497)--(6.620,1.495)%
-  --(6.628,1.492)--(6.636,1.489)--(6.644,1.487)--(6.651,1.484)--(6.659,1.481)--(6.667,1.479)%
-  --(6.675,1.476)--(6.683,1.473)--(6.690,1.470)--(6.698,1.469)--(6.706,1.465)--(6.714,1.464)%
-  --(6.722,1.461)--(6.729,1.458)--(6.737,1.456)--(6.745,1.453)--(6.753,1.450)--(6.761,1.448)%
-  --(6.768,1.445)--(6.776,1.442)--(6.784,1.441)--(6.792,1.438)--(6.800,1.436)--(6.808,1.433)%
-  --(6.815,1.430)--(6.823,1.428)--(6.831,1.425)--(6.839,1.424)--(6.847,1.420)--(6.854,1.419)%
-  --(6.862,1.416)--(6.870,1.413)--(6.878,1.411)--(6.886,1.408)--(6.893,1.406)--(6.901,1.403)%
-  --(6.909,1.402)--(6.917,1.399)--(6.925,1.397)--(6.933,1.394)--(6.940,1.393)--(6.948,1.389)%
-  --(6.956,1.388)--(6.964,1.385)--(6.972,1.383)--(6.979,1.380)--(6.987,1.379)--(6.995,1.375)%
-  --(7.003,1.374)--(7.011,1.371)--(7.018,1.369)--(7.026,1.366)--(7.034,1.365)--(7.042,1.361)%
-  --(7.050,1.360)--(7.057,1.357)--(7.065,1.355)--(7.073,1.352)--(7.081,1.351)--(7.089,1.349)%
-  --(7.097,1.346)--(7.104,1.344)--(7.112,1.341)--(7.120,1.340)--(7.128,1.337)--(7.136,1.335)%
-  --(7.143,1.333)--(7.151,1.330)--(7.159,1.329)--(7.167,1.326)--(7.175,1.324)--(7.182,1.323)%
-  --(7.190,1.320)--(7.198,1.318)--(7.206,1.316)--(7.214,1.313)--(7.222,1.312)--(7.229,1.309)%
-  --(7.237,1.307)--(7.245,1.306)--(7.253,1.302)--(7.261,1.301)--(7.268,1.299)--(7.276,1.296)%
-  --(7.284,1.295)--(7.292,1.293)--(7.300,1.290)--(7.307,1.288)--(7.315,1.287)--(7.323,1.285)%
-  --(7.331,1.282)--(7.339,1.281)--(7.346,1.279)--(7.354,1.276)--(7.362,1.274)--(7.370,1.273)%
-  --(7.378,1.270)--(7.386,1.268)--(7.393,1.267)--(7.401,1.265)--(7.409,1.262)--(7.417,1.260)%
-  --(7.425,1.259)--(7.432,1.257)--(7.440,1.254)--(7.448,1.253)--(7.456,1.251)--(7.464,1.250)%
-  --(7.471,1.247)--(7.479,1.245)--(7.487,1.243)--(7.495,1.242)--(7.503,1.239)--(7.511,1.237)%
-  --(7.518,1.236)--(7.526,1.234)--(7.534,1.233)--(7.542,1.229)--(7.550,1.228)--(7.557,1.226)%
-  --(7.565,1.225)--(7.573,1.223)--(7.581,1.220)--(7.589,1.219)--(7.596,1.217)--(7.604,1.215)%
-  --(7.612,1.214)--(7.620,1.212)--(7.628,1.209)--(7.635,1.208)--(7.643,1.206)--(7.651,1.205)%
-  --(7.659,1.203)--(7.667,1.201)--(7.675,1.200)--(7.682,1.197)--(7.690,1.195)--(7.698,1.194)%
-  --(7.706,1.192)--(7.714,1.191)--(7.721,1.189)--(7.729,1.188)--(7.737,1.186)--(7.745,1.183)%
-  --(7.753,1.181)--(7.760,1.180)--(7.768,1.178)--(7.776,1.177)--(7.784,1.175)--(7.792,1.174)%
-  --(7.800,1.172)--(7.807,1.170)--(7.815,1.169)--(7.823,1.167)--(7.831,1.164)--(7.839,1.163)%
-  --(7.846,1.161)--(7.854,1.160)--(7.862,1.158)--(7.870,1.156)--(7.878,1.155)--(7.885,1.153)%
-  --(7.893,1.152)--(7.901,1.150)--(7.909,1.149)--(7.917,1.147)--(7.924,1.146)--(7.932,1.144)%
-  --(7.940,1.142)--(7.948,1.141)--(7.956,1.139)--(7.964,1.138)--(7.971,1.136)--(7.979,1.135)%
-  --(7.987,1.133)--(7.995,1.132)--(8.003,1.130)--(8.010,1.128)--(8.018,1.127)--(8.026,1.125)%
-  --(8.034,1.124)--(8.042,1.122)--(8.049,1.121)--(8.057,1.119)--(8.065,1.118)--(8.073,1.116)%
-  --(8.081,1.115)--(8.089,1.113)--(8.096,1.111)--(8.104,1.110)--(8.112,1.108)--(8.120,1.107)%
-  --(8.128,1.105)--(8.135,1.104)--(8.143,1.102)--(8.151,1.101)--(8.159,1.099)--(8.167,1.097)%
-  --(8.174,1.096)--(8.182,1.094)--(8.190,1.093)--(8.198,1.091)--(8.206,1.091)--(8.213,1.090)%
-  --(8.221,1.088)--(8.229,1.087)--(8.237,1.085)--(8.245,1.083)--(8.253,1.082)--(8.260,1.080)%
-  --(8.268,1.079)--(8.276,1.077)--(8.284,1.076)--(8.292,1.074)--(8.299,1.074)--(8.307,1.073)%
-  --(8.315,1.071)--(8.323,1.069)--(8.331,1.068)--(8.338,1.066)--(8.346,1.065)--(8.354,1.063)%
-  --(8.362,1.063)--(8.370,1.062)--(8.378,1.060)--(8.385,1.059)--(8.393,1.057)--(8.401,1.055)%
-  --(8.409,1.054)--(8.417,1.052)--(8.424,1.052)--(8.432,1.051)--(8.440,1.049)--(8.448,1.048)%
-  --(8.456,1.046)--(8.463,1.045)--(8.471,1.045)--(8.479,1.043)--(8.487,1.042)--(8.495,1.040)%
-  --(8.502,1.038)--(8.510,1.037)--(8.518,1.037)--(8.526,1.035)--(8.534,1.034)--(8.542,1.032)%
-  --(8.549,1.031)--(8.557,1.031)--(8.565,1.029)--(8.573,1.028)--(8.581,1.026)--(8.588,1.024)%
-  --(8.596,1.024)--(8.604,1.023)--(8.612,1.021)--(8.620,1.020)--(8.627,1.018)--(8.635,1.018)%
-  --(8.643,1.017)--(8.651,1.015)--(8.659,1.014)--(8.667,1.012)--(8.674,1.012)--(8.682,1.010)%
-  --(8.690,1.009)--(8.698,1.007)--(8.706,1.007)--(8.713,1.006)--(8.721,1.004)--(8.729,1.003)%
-  --(8.737,1.003)--(8.745,1.001)--(8.752,1.000)--(8.760,0.998)--(8.768,0.998)--(8.776,0.996)%
-  --(8.784,0.995)--(8.791,0.993)--(8.799,0.993)--(8.807,0.992)--(8.815,0.990)--(8.823,0.989)%
-  --(8.831,0.989)--(8.838,0.987)--(8.846,0.986)--(8.854,0.984)--(8.862,0.984)--(8.870,0.983)%
-  --(8.877,0.981)--(8.885,0.981)--(8.893,0.979)--(8.901,0.978)--(8.909,0.978)--(8.916,0.976)%
-  --(8.924,0.975)--(8.932,0.973)--(8.940,0.973)--(8.948,0.972)--(8.955,0.970)--(8.963,0.970)%
-  --(8.971,0.969)--(8.979,0.967)--(8.987,0.967)--(8.995,0.965)--(9.002,0.964)--(9.010,0.964)%
-  --(9.018,0.962)--(9.026,0.961)--(9.034,0.959)--(9.041,0.959)--(9.049,0.958)--(9.057,0.956)%
-  --(9.065,0.956)--(9.073,0.955)--(9.080,0.953)--(9.088,0.953)--(9.096,0.951)--(9.104,0.951)%
-  --(9.112,0.950)--(9.120,0.948)--(9.127,0.948)--(9.135,0.947)--(9.143,0.945)--(9.151,0.945)%
-  --(9.159,0.944)--(9.166,0.942)--(9.174,0.942)--(9.182,0.941)--(9.190,0.939)--(9.198,0.939)%
-  --(9.205,0.937)--(9.213,0.937)--(9.221,0.936)--(9.229,0.934)--(9.237,0.934)--(9.244,0.933)%
-  --(9.252,0.931)--(9.260,0.931)--(9.268,0.930)--(9.276,0.930)--(9.284,0.928)--(9.291,0.927)%
-  --(9.299,0.927)--(9.307,0.925)--(9.315,0.925)--(9.323,0.923)--(9.330,0.922)--(9.338,0.922)%
-  --(9.346,0.920)--(9.354,0.920)--(9.362,0.919)--(9.369,0.917)--(9.377,0.917)--(9.385,0.916)%
-  --(9.393,0.916)--(9.401,0.914)--(9.409,0.913)--(9.416,0.913)--(9.424,0.911)--(9.432,0.911)%
-  --(9.440,0.910)--(9.448,0.910)--(9.455,0.908)--(9.463,0.906)--(9.471,0.906)--(9.479,0.905)%
-  --(9.487,0.905)--(9.494,0.903)--(9.502,0.903)--(9.510,0.902)--(9.518,0.900)--(9.526,0.900)%
-  --(9.533,0.899)--(9.541,0.899)--(9.549,0.897)--(9.557,0.897)--(9.565,0.896)--(9.573,0.896)%
-  --(9.580,0.894)--(9.588,0.894)--(9.596,0.892)--(9.604,0.891)--(9.612,0.891)--(9.619,0.889)%
-  --(9.627,0.889)--(9.635,0.888)--(9.643,0.888)--(9.651,0.886)--(9.658,0.886)--(9.666,0.885)%
-  --(9.674,0.885)--(9.682,0.883)--(9.690,0.883)--(9.698,0.882)--(9.705,0.882)--(9.713,0.880)%
-  --(9.721,0.880)--(9.729,0.878)--(9.737,0.878)--(9.744,0.877)--(9.752,0.877)--(9.760,0.875)%
-  --(9.768,0.875)--(9.776,0.874)--(9.783,0.874)--(9.791,0.872)--(9.799,0.872)--(9.807,0.871)%
-  --(9.815,0.871)--(9.822,0.869)--(9.830,0.869)--(9.838,0.868)--(9.846,0.868)--(9.854,0.866)%
-  --(9.862,0.866)--(9.869,0.864)--(9.877,0.864)--(9.885,0.863)--(9.893,0.863)--(9.901,0.861)%
-  --(9.908,0.861)--(9.916,0.860)--(9.924,0.860)--(9.932,0.858)--(9.940,0.858)--(9.947,0.857)%
-  --(9.955,0.857)--(9.963,0.855)--(9.971,0.855)--(9.979,0.854)--(9.987,0.854)--(9.994,0.852)%
-  --(10.002,0.852)--(10.010,0.852)--(10.018,0.851)--(10.026,0.851)--(10.033,0.849)--(10.041,0.849)%
-  --(10.049,0.847)--(10.057,0.847)--(10.065,0.846)--(10.072,0.846)--(10.080,0.844)--(10.088,0.844)%
-  --(10.096,0.844)--(10.104,0.843)--(10.111,0.843)--(10.119,0.841)--(10.127,0.841)--(10.135,0.840)%
-  --(10.143,0.840)--(10.151,0.840)--(10.158,0.838)--(10.166,0.838)--(10.174,0.837)--(10.182,0.837)%
-  --(10.190,0.835)--(10.197,0.835)--(10.205,0.833)--(10.213,0.833)--(10.221,0.833)--(10.229,0.832)%
-  --(10.236,0.832)--(10.244,0.830)--(10.252,0.830)--(10.260,0.830)--(10.268,0.829)--(10.276,0.829)%
-  --(10.283,0.827)--(10.291,0.827)--(10.299,0.826)--(10.307,0.826)--(10.315,0.826)--(10.322,0.824)%
-  --(10.330,0.824)--(10.338,0.823)--(10.346,0.823)--(10.354,0.823)--(10.361,0.821)--(10.369,0.821)%
-  --(10.377,0.819)--(10.385,0.819)--(10.393,0.819)--(10.400,0.818)--(10.408,0.818)--(10.416,0.816)%
-  --(10.424,0.816)--(10.432,0.816)--(10.440,0.815)--(10.447,0.815)--(10.455,0.813)--(10.463,0.813)%
-  --(10.471,0.813)--(10.479,0.812)--(10.486,0.812)--(10.494,0.812)--(10.502,0.810)--(10.510,0.810)%
-  --(10.518,0.809)--(10.525,0.809)--(10.533,0.809)--(10.541,0.807)--(10.549,0.807)--(10.557,0.807)%
-  --(10.565,0.805)--(10.572,0.805)--(10.580,0.804)--(10.588,0.804)--(10.596,0.804)--(10.604,0.802)%
-  --(10.611,0.802)--(10.619,0.802)--(10.627,0.801)--(10.635,0.801)--(10.643,0.801)--(10.650,0.799)%
-  --(10.658,0.799)--(10.666,0.798)--(10.674,0.798)--(10.682,0.798)--(10.689,0.796)--(10.697,0.796)%
-  --(10.705,0.796)--(10.713,0.795)--(10.721,0.795)--(10.729,0.795)--(10.736,0.793)--(10.744,0.793)%
-  --(10.752,0.793)--(10.760,0.791)--(10.768,0.791)--(10.775,0.791)--(10.783,0.790)--(10.791,0.790)%
-  --(10.799,0.790)--(10.807,0.788)--(10.814,0.788)--(10.822,0.788)--(10.830,0.787)--(10.838,0.787)%
-  --(10.846,0.787)--(10.854,0.785)--(10.861,0.785)--(10.869,0.785)--(10.877,0.784)--(10.885,0.784)%
-  --(10.893,0.784)--(10.900,0.782)--(10.908,0.782)--(10.916,0.782)--(10.924,0.781)--(10.932,0.781)%
-  --(10.939,0.781)--(10.947,0.779)--(10.955,0.779)--(10.963,0.779)--(10.971,0.778)--(10.978,0.778)%
-  --(10.986,0.778)--(10.994,0.776)--(11.002,0.776)--(11.010,0.776)--(11.018,0.774)--(11.025,0.774)%
-  --(11.033,0.774)--(11.041,0.774)--(11.049,0.773)--(11.057,0.773)--(11.064,0.773)--(11.072,0.771)%
-  --(11.080,0.771)--(11.088,0.771)--(11.096,0.770)--(11.103,0.770)--(11.111,0.770)--(11.119,0.768)%
-  --(11.127,0.768)--(11.135,0.768)--(11.142,0.768)--(11.150,0.767)--(11.158,0.767)--(11.166,0.767)%
-  --(11.174,0.765)--(11.182,0.765)--(11.189,0.765)--(11.197,0.765)--(11.205,0.764)--(11.213,0.764)%
-  --(11.221,0.764)--(11.228,0.762)--(11.236,0.762)--(11.244,0.762)--(11.252,0.762)--(11.260,0.760)%
-  --(11.267,0.760)--(11.275,0.760)--(11.283,0.759)--(11.291,0.759)--(11.299,0.759)--(11.307,0.759)%
-  --(11.314,0.757)--(11.322,0.757)--(11.330,0.757)--(11.338,0.756)--(11.346,0.756);
-\gpcolor{color=gp lt color border}
-\node[gp node right] at (10.479,7.739) {Theorie};
-\gpcolor{rgb color={0.000,0.620,0.451}}
-\draw[gp path] (10.663,7.739)--(11.579,7.739);
-\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)%
-  --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)%
-  --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.036)--(1.137,8.013)%
-  --(1.145,7.991)--(1.153,7.969)--(1.160,7.946)--(1.168,7.924)--(1.176,7.903)--(1.184,7.881)%
-  --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)%
-  --(1.239,7.727)--(1.246,7.707)--(1.254,7.685)--(1.262,7.664)--(1.270,7.642)--(1.278,7.620)%
-  --(1.285,7.600)--(1.293,7.578)--(1.301,7.558)--(1.309,7.536)--(1.317,7.516)--(1.324,7.494)%
-  --(1.332,7.474)--(1.340,7.452)--(1.348,7.432)--(1.356,7.412)--(1.363,7.392)--(1.371,7.370)%
-  --(1.379,7.350)--(1.387,7.330)--(1.395,7.309)--(1.403,7.289)--(1.410,7.269)--(1.418,7.249)%
-  --(1.426,7.229)--(1.434,7.208)--(1.442,7.188)--(1.449,7.170)--(1.457,7.149)--(1.465,7.129)%
-  --(1.473,7.109)--(1.481,7.090)--(1.488,7.070)--(1.496,7.052)--(1.504,7.031)--(1.512,7.013)%
-  --(1.520,6.993)--(1.528,6.974)--(1.535,6.954)--(1.543,6.935)--(1.551,6.917)--(1.559,6.896)%
-  --(1.567,6.878)--(1.574,6.859)--(1.582,6.840)--(1.590,6.822)--(1.598,6.803)--(1.606,6.783)%
-  --(1.613,6.764)--(1.621,6.746)--(1.629,6.729)--(1.637,6.710)--(1.645,6.691)--(1.652,6.673)%
-  --(1.660,6.654)--(1.668,6.635)--(1.676,6.618)--(1.684,6.600)--(1.692,6.581)--(1.699,6.564)%
-  --(1.707,6.545)--(1.715,6.528)--(1.723,6.510)--(1.731,6.493)--(1.738,6.474)--(1.746,6.457)%
-  --(1.754,6.438)--(1.762,6.421)--(1.770,6.404)--(1.777,6.385)--(1.785,6.368)--(1.793,6.351)%
-  --(1.801,6.334)--(1.809,6.317)--(1.817,6.298)--(1.824,6.281)--(1.832,6.264)--(1.840,6.247)%
-  --(1.848,6.230)--(1.856,6.213)--(1.863,6.197)--(1.871,6.180)--(1.879,6.163)--(1.887,6.146)%
-  --(1.895,6.129)--(1.902,6.112)--(1.910,6.097)--(1.918,6.079)--(1.926,6.062)--(1.934,6.047)%
-  --(1.941,6.030)--(1.949,6.014)--(1.957,5.997)--(1.965,5.982)--(1.973,5.965)--(1.981,5.949)%
-  --(1.988,5.932)--(1.996,5.916)--(2.004,5.901)--(2.012,5.884)--(2.020,5.868)--(2.027,5.853)%
-  --(2.035,5.837)--(2.043,5.822)--(2.051,5.805)--(2.059,5.789)--(2.066,5.774)--(2.074,5.758)%
-  --(2.082,5.742)--(2.090,5.727)--(2.098,5.711)--(2.106,5.696)--(2.113,5.680)--(2.121,5.666)%
-  --(2.129,5.651)--(2.137,5.635)--(2.145,5.620)--(2.152,5.604)--(2.160,5.590)--(2.168,5.575)%
-  --(2.176,5.559)--(2.184,5.545)--(2.191,5.530)--(2.199,5.516)--(2.207,5.500)--(2.215,5.485)%
-  --(2.223,5.471)--(2.230,5.457)--(2.238,5.441)--(2.246,5.427)--(2.254,5.412)--(2.262,5.398)%
-  --(2.270,5.384)--(2.277,5.368)--(2.285,5.354)--(2.293,5.340)--(2.301,5.326)--(2.309,5.311)%
-  --(2.316,5.297)--(2.324,5.283)--(2.332,5.269)--(2.340,5.255)--(2.348,5.241)--(2.355,5.227)%
-  --(2.363,5.213)--(2.371,5.199)--(2.379,5.185)--(2.387,5.171)--(2.394,5.157)--(2.402,5.145)%
-  --(2.410,5.131)--(2.418,5.117)--(2.426,5.103)--(2.434,5.089)--(2.441,5.076)--(2.449,5.062)%
-  --(2.457,5.048)--(2.465,5.036)--(2.473,5.022)--(2.480,5.008)--(2.488,4.995)--(2.496,4.981)%
-  --(2.504,4.969)--(2.512,4.955)--(2.519,4.943)--(2.527,4.930)--(2.535,4.916)--(2.543,4.904)%
-  --(2.551,4.890)--(2.559,4.877)--(2.566,4.865)--(2.574,4.851)--(2.582,4.839)--(2.590,4.826)%
-  --(2.598,4.814)--(2.605,4.801)--(2.613,4.787)--(2.621,4.775)--(2.629,4.763)--(2.637,4.750)%
-  --(2.644,4.738)--(2.652,4.725)--(2.660,4.713)--(2.668,4.700)--(2.676,4.688)--(2.683,4.676)%
-  --(2.691,4.663)--(2.699,4.651)--(2.707,4.640)--(2.715,4.627)--(2.723,4.615)--(2.730,4.603)%
-  --(2.738,4.590)--(2.746,4.579)--(2.754,4.567)--(2.762,4.554)--(2.769,4.542)--(2.777,4.531)%
-  --(2.785,4.519)--(2.793,4.508)--(2.801,4.495)--(2.808,4.483)--(2.816,4.472)--(2.824,4.460)%
-  --(2.832,4.449)--(2.840,4.436)--(2.848,4.426)--(2.855,4.415)--(2.863,4.402)--(2.871,4.391)%
-  --(2.879,4.379)--(2.887,4.368)--(2.894,4.357)--(2.902,4.346)--(2.910,4.334)--(2.918,4.323)%
-  --(2.926,4.312)--(2.933,4.301)--(2.941,4.289)--(2.949,4.278)--(2.957,4.267)--(2.965,4.256)%
-  --(2.972,4.245)--(2.980,4.234)--(2.988,4.224)--(2.996,4.213)--(3.004,4.202)--(3.012,4.191)%
-  --(3.019,4.180)--(3.027,4.169)--(3.035,4.158)--(3.043,4.148)--(3.051,4.137)--(3.058,4.126)%
-  --(3.066,4.115)--(3.074,4.106)--(3.082,4.095)--(3.090,4.084)--(3.097,4.073)--(3.105,4.064)%
-  --(3.113,4.053)--(3.121,4.042)--(3.129,4.031)--(3.137,4.022)--(3.144,4.011)--(3.152,4.002)%
-  --(3.160,3.991)--(3.168,3.980)--(3.176,3.970)--(3.183,3.960)--(3.191,3.950)--(3.199,3.939)%
-  --(3.207,3.930)--(3.215,3.919)--(3.222,3.910)--(3.230,3.901)--(3.238,3.890)--(3.246,3.880)%
-  --(3.254,3.870)--(3.261,3.860)--(3.269,3.851)--(3.277,3.840)--(3.285,3.831)--(3.293,3.821)%
-  --(3.301,3.812)--(3.308,3.801)--(3.316,3.792)--(3.324,3.783)--(3.332,3.773)--(3.340,3.764)%
-  --(3.347,3.755)--(3.355,3.744)--(3.363,3.734)--(3.371,3.725)--(3.379,3.716)--(3.386,3.706)%
-  --(3.394,3.697)--(3.402,3.688)--(3.410,3.679)--(3.418,3.669)--(3.426,3.660)--(3.433,3.651)%
-  --(3.441,3.641)--(3.449,3.633)--(3.457,3.624)--(3.465,3.615)--(3.472,3.606)--(3.480,3.596)%
-  --(3.488,3.587)--(3.496,3.579)--(3.504,3.570)--(3.511,3.560)--(3.519,3.551)--(3.527,3.543)%
-  --(3.535,3.534)--(3.543,3.525)--(3.550,3.515)--(3.558,3.508)--(3.566,3.498)--(3.574,3.491)%
-  --(3.582,3.481)--(3.590,3.472)--(3.597,3.464)--(3.605,3.455)--(3.613,3.447)--(3.621,3.438)%
-  --(3.629,3.430)--(3.636,3.421)--(3.644,3.413)--(3.652,3.404)--(3.660,3.396)--(3.668,3.387)%
-  --(3.675,3.379)--(3.683,3.371)--(3.691,3.362)--(3.699,3.354)--(3.707,3.346)--(3.715,3.337)%
-  --(3.722,3.329)--(3.730,3.321)--(3.738,3.312)--(3.746,3.304)--(3.754,3.296)--(3.761,3.289)%
-  --(3.769,3.281)--(3.777,3.272)--(3.785,3.264)--(3.793,3.256)--(3.800,3.248)--(3.808,3.241)%
-  --(3.816,3.233)--(3.824,3.225)--(3.832,3.216)--(3.839,3.208)--(3.847,3.200)--(3.855,3.192)%
-  --(3.863,3.185)--(3.871,3.177)--(3.879,3.169)--(3.886,3.161)--(3.894,3.154)--(3.902,3.146)%
-  --(3.910,3.138)--(3.918,3.132)--(3.925,3.124)--(3.933,3.116)--(3.941,3.109)--(3.949,3.101)%
-  --(3.957,3.093)--(3.964,3.085)--(3.972,3.079)--(3.980,3.071)--(3.988,3.064)--(3.996,3.056)%
-  --(4.004,3.048)--(4.011,3.042)--(4.019,3.034)--(4.027,3.026)--(4.035,3.020)--(4.043,3.012)%
-  --(4.050,3.005)--(4.058,2.998)--(4.066,2.991)--(4.074,2.983)--(4.082,2.977)--(4.089,2.969)%
-  --(4.097,2.963)--(4.105,2.955)--(4.113,2.947)--(4.121,2.941)--(4.128,2.933)--(4.136,2.927)%
-  --(4.144,2.919)--(4.152,2.913)--(4.160,2.905)--(4.168,2.899)--(4.175,2.891)--(4.183,2.885)%
-  --(4.191,2.879)--(4.199,2.871)--(4.207,2.865)--(4.214,2.857)--(4.222,2.851)--(4.230,2.845)%
-  --(4.238,2.837)--(4.246,2.831)--(4.253,2.824)--(4.261,2.817)--(4.269,2.810)--(4.277,2.804)%
-  --(4.285,2.798)--(4.293,2.790)--(4.300,2.784)--(4.308,2.778)--(4.316,2.772)--(4.324,2.764)%
-  --(4.332,2.758)--(4.339,2.751)--(4.347,2.745)--(4.355,2.739)--(4.363,2.733)--(4.371,2.727)%
-  --(4.378,2.719)--(4.386,2.713)--(4.394,2.706)--(4.402,2.700)--(4.410,2.694)--(4.417,2.688)%
-  --(4.425,2.681)--(4.433,2.675)--(4.441,2.669)--(4.449,2.663)--(4.457,2.657)--(4.464,2.650)%
-  --(4.472,2.644)--(4.480,2.638)--(4.488,2.632)--(4.496,2.626)--(4.503,2.619)--(4.511,2.613)%
-  --(4.519,2.608)--(4.527,2.602)--(4.535,2.596)--(4.542,2.590)--(4.550,2.584)--(4.558,2.577)%
-  --(4.566,2.571)--(4.574,2.567)--(4.581,2.560)--(4.589,2.554)--(4.597,2.548)--(4.605,2.542)%
-  --(4.613,2.537)--(4.621,2.531)--(4.628,2.525)--(4.636,2.520)--(4.644,2.514)--(4.652,2.508)%
-  --(4.660,2.501)--(4.667,2.497)--(4.675,2.490)--(4.683,2.484)--(4.691,2.480)--(4.699,2.473)%
-  --(4.706,2.469)--(4.714,2.463)--(4.722,2.456)--(4.730,2.452)--(4.738,2.445)--(4.746,2.441)%
-  --(4.753,2.435)--(4.761,2.430)--(4.769,2.424)--(4.777,2.417)--(4.785,2.413)--(4.792,2.407)%
-  --(4.800,2.402)--(4.808,2.396)--(4.816,2.391)--(4.824,2.386)--(4.831,2.380)--(4.839,2.376)%
-  --(4.847,2.369)--(4.855,2.365)--(4.863,2.358)--(4.870,2.354)--(4.878,2.349)--(4.886,2.343)%
-  --(4.894,2.338)--(4.902,2.334)--(4.910,2.327)--(4.917,2.323)--(4.925,2.318)--(4.933,2.312)%
-  --(4.941,2.307)--(4.949,2.303)--(4.956,2.296)--(4.964,2.292)--(4.972,2.287)--(4.980,2.282)%
-  --(4.988,2.276)--(4.995,2.271)--(5.003,2.267)--(5.011,2.262)--(5.019,2.256)--(5.027,2.251)%
-  --(5.035,2.247)--(5.042,2.242)--(5.050,2.237)--(5.058,2.233)--(5.066,2.226)--(5.074,2.222)%
-  --(5.081,2.217)--(5.089,2.212)--(5.097,2.208)--(5.105,2.203)--(5.113,2.199)--(5.120,2.194)%
-  --(5.128,2.189)--(5.136,2.183)--(5.144,2.178)--(5.152,2.174)--(5.159,2.169)--(5.167,2.164)%
-  --(5.175,2.160)--(5.183,2.155)--(5.191,2.150)--(5.199,2.146)--(5.206,2.141)--(5.214,2.136)%
-  --(5.222,2.132)--(5.230,2.127)--(5.238,2.122)--(5.245,2.119)--(5.253,2.115)--(5.261,2.110)%
-  --(5.269,2.105)--(5.277,2.101)--(5.284,2.096)--(5.292,2.091)--(5.300,2.087)--(5.308,2.082)%
-  --(5.316,2.079)--(5.324,2.074)--(5.331,2.070)--(5.339,2.065)--(5.347,2.060)--(5.355,2.056)%
-  --(5.363,2.053)--(5.370,2.048)--(5.378,2.043)--(5.386,2.039)--(5.394,2.034)--(5.402,2.031)%
-  --(5.409,2.026)--(5.417,2.021)--(5.425,2.017)--(5.433,2.014)--(5.441,2.009)--(5.448,2.004)%
-  --(5.456,2.001)--(5.464,1.997)--(5.472,1.992)--(5.480,1.987)--(5.488,1.984)--(5.495,1.980)%
-  --(5.503,1.975)--(5.511,1.972)--(5.519,1.967)--(5.527,1.964)--(5.534,1.959)--(5.542,1.955)%
-  --(5.550,1.952)--(5.558,1.947)--(5.566,1.944)--(5.573,1.939)--(5.581,1.934)--(5.589,1.931)%
-  --(5.597,1.927)--(5.605,1.924)--(5.613,1.919)--(5.620,1.916)--(5.628,1.911)--(5.636,1.908)%
-  --(5.644,1.903)--(5.652,1.899)--(5.659,1.896)--(5.667,1.893)--(5.675,1.888)--(5.683,1.885)%
-  --(5.691,1.880)--(5.698,1.877)--(5.706,1.872)--(5.714,1.869)--(5.722,1.865)--(5.730,1.862)%
-  --(5.737,1.857)--(5.745,1.854)--(5.753,1.851)--(5.761,1.846)--(5.769,1.843)--(5.777,1.838)%
-  --(5.784,1.835)--(5.792,1.832)--(5.800,1.827)--(5.808,1.824)--(5.816,1.821)--(5.823,1.816)%
-  --(5.831,1.813)--(5.839,1.810)--(5.847,1.806)--(5.855,1.802)--(5.862,1.799)--(5.870,1.795)%
-  --(5.878,1.792)--(5.886,1.789)--(5.894,1.784)--(5.902,1.781)--(5.909,1.778)--(5.917,1.775)%
-  --(5.925,1.770)--(5.933,1.767)--(5.941,1.764)--(5.948,1.761)--(5.956,1.756)--(5.964,1.753)%
-  --(5.972,1.750)--(5.980,1.747)--(5.987,1.743)--(5.995,1.739)--(6.003,1.736)--(6.011,1.733)%
-  --(6.019,1.730)--(6.026,1.726)--(6.034,1.722)--(6.042,1.719)--(6.050,1.716)--(6.058,1.712)%
-  --(6.066,1.709)--(6.073,1.706)--(6.081,1.703)--(6.089,1.698)--(6.097,1.695)--(6.105,1.692)%
-  --(6.112,1.689)--(6.120,1.686)--(6.128,1.683)--(6.136,1.680)--(6.144,1.677)--(6.151,1.674)%
-  --(6.159,1.670)--(6.167,1.667)--(6.175,1.664)--(6.183,1.661)--(6.191,1.658)--(6.198,1.655)%
-  --(6.206,1.652)--(6.214,1.647)--(6.222,1.644)--(6.230,1.641)--(6.237,1.638)--(6.245,1.635)%
-  --(6.253,1.632)--(6.261,1.630)--(6.269,1.627)--(6.276,1.624)--(6.284,1.621)--(6.292,1.618)%
-  --(6.300,1.615)--(6.308,1.611)--(6.315,1.608)--(6.323,1.605)--(6.331,1.602)--(6.339,1.599)%
-  --(6.347,1.596)--(6.355,1.593)--(6.362,1.590)--(6.370,1.587)--(6.378,1.585)--(6.386,1.582)%
-  --(6.394,1.579)--(6.401,1.576)--(6.409,1.573)--(6.417,1.570)--(6.425,1.566)--(6.433,1.563)%
-  --(6.440,1.562)--(6.448,1.559)--(6.456,1.556)--(6.464,1.552)--(6.472,1.549)--(6.480,1.546)%
-  --(6.487,1.545)--(6.495,1.542)--(6.503,1.538)--(6.511,1.535)--(6.519,1.532)--(6.526,1.531)%
-  --(6.534,1.528)--(6.542,1.525)--(6.550,1.521)--(6.558,1.520)--(6.565,1.517)--(6.573,1.514)%
-  --(6.581,1.511)--(6.589,1.509)--(6.597,1.506)--(6.604,1.503)--(6.612,1.500)--(6.620,1.498)%
-  --(6.628,1.495)--(6.636,1.492)--(6.644,1.489)--(6.651,1.487)--(6.659,1.484)--(6.667,1.481)%
-  --(6.675,1.479)--(6.683,1.476)--(6.690,1.473)--(6.698,1.472)--(6.706,1.469)--(6.714,1.465)%
-  --(6.722,1.464)--(6.729,1.461)--(6.737,1.458)--(6.745,1.456)--(6.753,1.453)--(6.761,1.450)%
-  --(6.768,1.448)--(6.776,1.445)--(6.784,1.444)--(6.792,1.441)--(6.800,1.438)--(6.808,1.436)%
-  --(6.815,1.433)--(6.823,1.431)--(6.831,1.428)--(6.839,1.425)--(6.847,1.424)--(6.854,1.420)%
-  --(6.862,1.419)--(6.870,1.416)--(6.878,1.414)--(6.886,1.411)--(6.893,1.408)--(6.901,1.406)%
-  --(6.909,1.403)--(6.917,1.402)--(6.925,1.399)--(6.933,1.397)--(6.940,1.394)--(6.948,1.393)%
-  --(6.956,1.389)--(6.964,1.388)--(6.972,1.385)--(6.979,1.383)--(6.987,1.380)--(6.995,1.379)%
-  --(7.003,1.375)--(7.011,1.374)--(7.018,1.371)--(7.026,1.369)--(7.034,1.366)--(7.042,1.365)%
-  --(7.050,1.361)--(7.057,1.360)--(7.065,1.358)--(7.073,1.355)--(7.081,1.354)--(7.089,1.351)%
-  --(7.097,1.349)--(7.104,1.346)--(7.112,1.344)--(7.120,1.343)--(7.128,1.340)--(7.136,1.338)%
-  --(7.143,1.335)--(7.151,1.333)--(7.159,1.332)--(7.167,1.329)--(7.175,1.327)--(7.182,1.324)%
-  --(7.190,1.323)--(7.198,1.321)--(7.206,1.318)--(7.214,1.316)--(7.222,1.313)--(7.229,1.312)%
-  --(7.237,1.310)--(7.245,1.307)--(7.253,1.306)--(7.261,1.304)--(7.268,1.301)--(7.276,1.299)%
-  --(7.284,1.298)--(7.292,1.295)--(7.300,1.293)--(7.307,1.292)--(7.315,1.288)--(7.323,1.287)%
-  --(7.331,1.285)--(7.339,1.284)--(7.346,1.281)--(7.354,1.279)--(7.362,1.278)--(7.370,1.274)%
-  --(7.378,1.273)--(7.386,1.271)--(7.393,1.268)--(7.401,1.267)--(7.409,1.265)--(7.417,1.264)%
-  --(7.425,1.260)--(7.432,1.259)--(7.440,1.257)--(7.448,1.256)--(7.456,1.253)--(7.464,1.251)%
-  --(7.471,1.250)--(7.479,1.248)--(7.487,1.245)--(7.495,1.243)--(7.503,1.242)--(7.511,1.240)%
-  --(7.518,1.239)--(7.526,1.236)--(7.534,1.234)--(7.542,1.233)--(7.550,1.231)--(7.557,1.229)%
-  --(7.565,1.226)--(7.573,1.225)--(7.581,1.223)--(7.589,1.222)--(7.596,1.220)--(7.604,1.217)%
-  --(7.612,1.215)--(7.620,1.214)--(7.628,1.212)--(7.635,1.211)--(7.643,1.209)--(7.651,1.206)%
-  --(7.659,1.205)--(7.667,1.203)--(7.675,1.201)--(7.682,1.200)--(7.690,1.198)--(7.698,1.197)%
-  --(7.706,1.194)--(7.714,1.192)--(7.721,1.191)--(7.729,1.189)--(7.737,1.188)--(7.745,1.186)%
-  --(7.753,1.184)--(7.760,1.183)--(7.768,1.181)--(7.776,1.178)--(7.784,1.177)--(7.792,1.175)%
-  --(7.800,1.174)--(7.807,1.172)--(7.815,1.170)--(7.823,1.169)--(7.831,1.167)--(7.839,1.166)%
-  --(7.846,1.164)--(7.854,1.163)--(7.862,1.161)--(7.870,1.160)--(7.878,1.156)--(7.885,1.155)%
-  --(7.893,1.153)--(7.901,1.152)--(7.909,1.150)--(7.917,1.149)--(7.924,1.147)--(7.932,1.146)%
-  --(7.940,1.144)--(7.948,1.142)--(7.956,1.141)--(7.964,1.139)--(7.971,1.138)--(7.979,1.136)%
-  --(7.987,1.135)--(7.995,1.133)--(8.003,1.132)--(8.010,1.130)--(8.018,1.128)--(8.026,1.127)%
-  --(8.034,1.125)--(8.042,1.124)--(8.049,1.122)--(8.057,1.121)--(8.065,1.119)--(8.073,1.118)%
-  --(8.081,1.116)--(8.089,1.115)--(8.096,1.113)--(8.104,1.111)--(8.112,1.110)--(8.120,1.108)%
-  --(8.128,1.107)--(8.135,1.105)--(8.143,1.104)--(8.151,1.102)--(8.159,1.101)--(8.167,1.101)%
-  --(8.174,1.099)--(8.182,1.097)--(8.190,1.096)--(8.198,1.094)--(8.206,1.093)--(8.213,1.091)%
-  --(8.221,1.090)--(8.229,1.088)--(8.237,1.087)--(8.245,1.085)--(8.253,1.083)--(8.260,1.082)%
-  --(8.268,1.080)--(8.276,1.080)--(8.284,1.079)--(8.292,1.077)--(8.299,1.076)--(8.307,1.074)%
-  --(8.315,1.073)--(8.323,1.071)--(8.331,1.069)--(8.338,1.068)--(8.346,1.068)--(8.354,1.066)%
-  --(8.362,1.065)--(8.370,1.063)--(8.378,1.062)--(8.385,1.060)--(8.393,1.059)--(8.401,1.057)%
-  --(8.409,1.057)--(8.417,1.055)--(8.424,1.054)--(8.432,1.052)--(8.440,1.051)--(8.448,1.049)%
-  --(8.456,1.048)--(8.463,1.048)--(8.471,1.046)--(8.479,1.045)--(8.487,1.043)--(8.495,1.042)%
-  --(8.502,1.040)--(8.510,1.040)--(8.518,1.038)--(8.526,1.037)--(8.534,1.035)--(8.542,1.034)%
-  --(8.549,1.034)--(8.557,1.032)--(8.565,1.031)--(8.573,1.029)--(8.581,1.028)--(8.588,1.026)%
-  --(8.596,1.026)--(8.604,1.024)--(8.612,1.023)--(8.620,1.021)--(8.627,1.021)--(8.635,1.020)%
-  --(8.643,1.018)--(8.651,1.017)--(8.659,1.015)--(8.667,1.015)--(8.674,1.014)--(8.682,1.012)%
-  --(8.690,1.010)--(8.698,1.010)--(8.706,1.009)--(8.713,1.007)--(8.721,1.006)--(8.729,1.004)%
-  --(8.737,1.004)--(8.745,1.003)--(8.752,1.001)--(8.760,1.000)--(8.768,1.000)--(8.776,0.998)%
-  --(8.784,0.996)--(8.791,0.995)--(8.799,0.995)--(8.807,0.993)--(8.815,0.992)--(8.823,0.992)%
-  --(8.831,0.990)--(8.838,0.989)--(8.846,0.987)--(8.854,0.987)--(8.862,0.986)--(8.870,0.984)%
-  --(8.877,0.983)--(8.885,0.983)--(8.893,0.981)--(8.901,0.979)--(8.909,0.979)--(8.916,0.978)%
-  --(8.924,0.976)--(8.932,0.975)--(8.940,0.975)--(8.948,0.973)--(8.955,0.972)--(8.963,0.972)%
-  --(8.971,0.970)--(8.979,0.969)--(8.987,0.969)--(8.995,0.967)--(9.002,0.965)--(9.010,0.965)%
-  --(9.018,0.964)--(9.026,0.962)--(9.034,0.962)--(9.041,0.961)--(9.049,0.959)--(9.057,0.959)%
-  --(9.065,0.958)--(9.073,0.956)--(9.080,0.956)--(9.088,0.955)--(9.096,0.953)--(9.104,0.953)%
-  --(9.112,0.951)--(9.120,0.950)--(9.127,0.950)--(9.135,0.948)--(9.143,0.947)--(9.151,0.947)%
-  --(9.159,0.945)--(9.166,0.944)--(9.174,0.944)--(9.182,0.942)--(9.190,0.941)--(9.198,0.941)%
-  --(9.205,0.939)--(9.213,0.939)--(9.221,0.937)--(9.229,0.936)--(9.237,0.936)--(9.244,0.934)%
-  --(9.252,0.933)--(9.260,0.933)--(9.268,0.931)--(9.276,0.931)--(9.284,0.930)--(9.291,0.928)%
-  --(9.299,0.928)--(9.307,0.927)--(9.315,0.927)--(9.323,0.925)--(9.330,0.923)--(9.338,0.923)%
-  --(9.346,0.922)--(9.354,0.922)--(9.362,0.920)--(9.369,0.919)--(9.377,0.919)--(9.385,0.917)%
-  --(9.393,0.917)--(9.401,0.916)--(9.409,0.914)--(9.416,0.914)--(9.424,0.913)--(9.432,0.913)%
-  --(9.440,0.911)--(9.448,0.911)--(9.455,0.910)--(9.463,0.908)--(9.471,0.908)--(9.479,0.906)%
-  --(9.487,0.906)--(9.494,0.905)--(9.502,0.905)--(9.510,0.903)--(9.518,0.902)--(9.526,0.902)%
-  --(9.533,0.900)--(9.541,0.900)--(9.549,0.899)--(9.557,0.899)--(9.565,0.897)--(9.573,0.897)%
-  --(9.580,0.896)--(9.588,0.894)--(9.596,0.894)--(9.604,0.892)--(9.612,0.892)--(9.619,0.891)%
-  --(9.627,0.891)--(9.635,0.889)--(9.643,0.889)--(9.651,0.888)--(9.658,0.888)--(9.666,0.886)%
-  --(9.674,0.886)--(9.682,0.885)--(9.690,0.885)--(9.698,0.883)--(9.705,0.882)--(9.713,0.882)%
-  --(9.721,0.880)--(9.729,0.880)--(9.737,0.878)--(9.744,0.878)--(9.752,0.877)--(9.760,0.877)%
-  --(9.768,0.875)--(9.776,0.875)--(9.783,0.874)--(9.791,0.874)--(9.799,0.872)--(9.807,0.872)%
-  --(9.815,0.871)--(9.822,0.871)--(9.830,0.869)--(9.838,0.869)--(9.846,0.868)--(9.854,0.868)%
-  --(9.862,0.866)--(9.869,0.866)--(9.877,0.864)--(9.885,0.864)--(9.893,0.863)--(9.901,0.863)%
-  --(9.908,0.861)--(9.916,0.861)--(9.924,0.861)--(9.932,0.860)--(9.940,0.860)--(9.947,0.858)%
-  --(9.955,0.858)--(9.963,0.857)--(9.971,0.857)--(9.979,0.855)--(9.987,0.855)--(9.994,0.854)%
-  --(10.002,0.854)--(10.010,0.852)--(10.018,0.852)--(10.026,0.851)--(10.033,0.851)--(10.041,0.851)%
-  --(10.049,0.849)--(10.057,0.849)--(10.065,0.847)--(10.072,0.847)--(10.080,0.846)--(10.088,0.846)%
-  --(10.096,0.844)--(10.104,0.844)--(10.111,0.843)--(10.119,0.843)--(10.127,0.843)--(10.135,0.841)%
-  --(10.143,0.841)--(10.151,0.840)--(10.158,0.840)--(10.166,0.838)--(10.174,0.838)--(10.182,0.838)%
-  --(10.190,0.837)--(10.197,0.837)--(10.205,0.835)--(10.213,0.835)--(10.221,0.833)--(10.229,0.833)%
-  --(10.236,0.833)--(10.244,0.832)--(10.252,0.832)--(10.260,0.830)--(10.268,0.830)--(10.276,0.829)%
-  --(10.283,0.829)--(10.291,0.829)--(10.299,0.827)--(10.307,0.827)--(10.315,0.826)--(10.322,0.826)%
-  --(10.330,0.826)--(10.338,0.824)--(10.346,0.824)--(10.354,0.823)--(10.361,0.823)--(10.369,0.823)%
-  --(10.377,0.821)--(10.385,0.821)--(10.393,0.819)--(10.400,0.819)--(10.408,0.819)--(10.416,0.818)%
-  --(10.424,0.818)--(10.432,0.816)--(10.440,0.816)--(10.447,0.816)--(10.455,0.815)--(10.463,0.815)%
-  --(10.471,0.813)--(10.479,0.813)--(10.486,0.813)--(10.494,0.812)--(10.502,0.812)--(10.510,0.812)%
-  --(10.518,0.810)--(10.525,0.810)--(10.533,0.809)--(10.541,0.809)--(10.549,0.809)--(10.557,0.807)%
-  --(10.565,0.807)--(10.572,0.805)--(10.580,0.805)--(10.588,0.805)--(10.596,0.804)--(10.604,0.804)%
-  --(10.611,0.804)--(10.619,0.802)--(10.627,0.802)--(10.635,0.802)--(10.643,0.801)--(10.650,0.801)%
-  --(10.658,0.799)--(10.666,0.799)--(10.674,0.799)--(10.682,0.798)--(10.689,0.798)--(10.697,0.798)%
-  --(10.705,0.796)--(10.713,0.796)--(10.721,0.796)--(10.729,0.795)--(10.736,0.795)--(10.744,0.795)%
-  --(10.752,0.793)--(10.760,0.793)--(10.768,0.793)--(10.775,0.791)--(10.783,0.791)--(10.791,0.791)%
-  --(10.799,0.790)--(10.807,0.790)--(10.814,0.790)--(10.822,0.788)--(10.830,0.788)--(10.838,0.788)%
-  --(10.846,0.787)--(10.854,0.787)--(10.861,0.787)--(10.869,0.785)--(10.877,0.785)--(10.885,0.785)%
-  --(10.893,0.784)--(10.900,0.784)--(10.908,0.784)--(10.916,0.782)--(10.924,0.782)--(10.932,0.782)%
-  --(10.939,0.781)--(10.947,0.781)--(10.955,0.781)--(10.963,0.779)--(10.971,0.779)--(10.978,0.779)%
-  --(10.986,0.778)--(10.994,0.778)--(11.002,0.778)--(11.010,0.776)--(11.018,0.776)--(11.025,0.776)%
-  --(11.033,0.774)--(11.041,0.774)--(11.049,0.774)--(11.057,0.774)--(11.064,0.773)--(11.072,0.773)%
-  --(11.080,0.773)--(11.088,0.771)--(11.096,0.771)--(11.103,0.771)--(11.111,0.770)--(11.119,0.770)%
-  --(11.127,0.770)--(11.135,0.768)--(11.142,0.768)--(11.150,0.768)--(11.158,0.768)--(11.166,0.767)%
-  --(11.174,0.767)--(11.182,0.767)--(11.189,0.765)--(11.197,0.765)--(11.205,0.765)--(11.213,0.765)%
-  --(11.221,0.764)--(11.228,0.764)--(11.236,0.764)--(11.244,0.762)--(11.252,0.762)--(11.260,0.762)%
-  --(11.267,0.762)--(11.275,0.760)--(11.283,0.760)--(11.291,0.760)--(11.299,0.759)--(11.307,0.759)%
-  --(11.314,0.759)--(11.322,0.759)--(11.330,0.757)--(11.338,0.757)--(11.346,0.757);
-\gpcolor{color=gp lt color border}
-\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle;
-%% coordinates of the plot area
-\gpdefrectangularnode{gp plot 1}{\pgfpoint{1.012cm}{0.616cm}}{\pgfpoint{11.947cm}{8.381cm}}
-\end{tikzpicture}
-%% gnuplot variables
diff --git a/20191212/logo-hochschule-bochum-cvh-text-v2.pdf b/20191212/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20191212/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20191212/logo-hochschule-bochum.pdf b/20191212/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20191212/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20191212/make-1.txt b/20191212/make-1.txt
deleted file mode 100644
index a60f52923804359e83ecd9bd38f33d16f73b3830..0000000000000000000000000000000000000000
--- a/20191212/make-1.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-cassini/home/peter/bo/2019ws/hp/20191212> cat Makefile
-hello-6: hello-6.o pruzzel.o
-        gcc hello-6.o pruzzel.o -o hello-6
-
-hello-6.o: hello-6.c
-        gcc -Wall -O hello-6.c -c
-
-pruzzel.o: pruzzel.c
-        gcc -Wall -O pruzzel.c -c
-cassini/home/peter/bo/2019ws/hp/20191212> make
-make: „hello-6“ ist bereits aktuell.
-cassini/home/peter/bo/2019ws/hp/20191212> rm hello-6
-cassini/home/peter/bo/2019ws/hp/20191212> make
-gcc hello-6.o pruzzel.o -o hello-6
-cassini/home/peter/bo/2019ws/hp/20191212> rm hello-6 *.o
-cassini/home/peter/bo/2019ws/hp/20191212> make
-gcc -Wall -O hello-6.c -c
-gcc -Wall -O pruzzel.c -c
-gcc hello-6.o pruzzel.o -o hello-6
-cassini/home/peter/bo/2019ws/hp/20191212> ./hello-6
-Hello, world!
-cassini/home/peter/bo/2019ws/hp/20191212> ls -l pruzzel.c
--rw-r--r-- 1 peter peter 89 Nov 21 17:08 pruzzel.c
-cassini/home/peter/bo/2019ws/hp/20191212> touch pruzzel.c
-cassini/home/peter/bo/2019ws/hp/20191212> ls -l pruzzel.c
--rw-r--r-- 1 peter peter 89 Dez 12 16:26 pruzzel.c
-cassini/home/peter/bo/2019ws/hp/20191212> make
-gcc -Wall -O pruzzel.c -c
-gcc hello-6.o pruzzel.o -o hello-6
-cassini/home/peter/bo/2019ws/hp/20191212> mv -i Makefile Makefile-1
-cassini/home/peter/bo/2019ws/hp/20191212> make -f Makefile-1
-make: „hello-6“ ist bereits aktuell.
-cassini/home/peter/bo/2019ws/hp/20191212>
diff --git a/20191212/pendulum.pdf b/20191212/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20191212/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20191212/pgscript.sty b/20191212/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191212/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191212/pgslides.sty b/20191212/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191212/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191212/pruzzel.c b/20191212/pruzzel.c
deleted file mode 100644
index a03f3ffc532054611cad3d9e137ccd973c874399..0000000000000000000000000000000000000000
--- a/20191212/pruzzel.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int pruzzel (const char *bla)
-{
-  printf ("%s", bla);
-  return 42;
-}
diff --git a/20191212/pruzzel.h b/20191212/pruzzel.h
deleted file mode 100644
index 5b56ad93ce5dfca18c86f429c2b7d34a3cf01f6c..0000000000000000000000000000000000000000
--- a/20191212/pruzzel.h
+++ /dev/null
@@ -1 +0,0 @@
-extern int pruzzel (const char *bla);
diff --git a/20191219/Tower_of_Hanoi.jpeg b/20191219/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/20191219/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/20191219/aufgabe-1.c b/20191219/aufgabe-1.c
deleted file mode 100644
index 2afae773ac2d564771ab6dfb473eed664070d3e2..0000000000000000000000000000000000000000
--- a/20191219/aufgabe-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint64_t x = 4262939000843297096;
-  char *s = &x;
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/20191219/hp-20191219.pdf b/20191219/hp-20191219.pdf
deleted file mode 100644
index 39dcb90ab4af4b8213ee3e6cd1a19087ce8003c9..0000000000000000000000000000000000000000
Binary files a/20191219/hp-20191219.pdf and /dev/null differ
diff --git a/20191219/hp-20191219.tex b/20191219/hp-20191219.tex
deleted file mode 100644
index 50b9d32ee45183d05cea5bbf2a862683f556eff2..0000000000000000000000000000000000000000
--- a/20191219/hp-20191219.tex
+++ /dev/null
@@ -1,726 +0,0 @@
-% hp-20191219.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{pdftricks}
-\usepackage{tikz}
-
-\begin{psinputs}
-  \usepackage[utf8]{inputenc}
-  \usepackage[german]{babel}
-  \usepackage[T1]{fontenc}
-  \usepackage{helvet}
-  \renewcommand*\familydefault{\sfdefault}
-  \usepackage{pstricks,pst-grad}
-\end{psinputs}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{19.\ Dezember 2019}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-      \begin{itemize}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \color{medgreen}
-        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \vspace*{-0.1cm}
-        \item[\dots]
-%        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \color{medgreen}
-        \item[4.6] Byte-Reihenfolge -- Endianness
-        \color{red}
-        \item[4.7] Binärdarstellung negativer Zahlen
-        \item[4.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{2}
-\section{Bibliotheken}
-\setcounter{subsection}{3}
-\subsection{Projekt organisieren: make}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \begin{itemize}
-    \item
-      \only<4->{explizite und implizite} Regeln
-      \begin{onlyenv}<2>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          hello-6: hello-6.o pruzzel.o
-                  gcc hello-6.o pruzzel.o -o hello-6
-
-          pruzzel.o: pruzzel.c pruzzel.h
-                  gcc -Wall -O pruzzel.c -c
-
-          hello-6.o: hello-6.c pruzzel.h
-                  gcc -Wall -O hello-6.c -c
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<4>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = hello-6
-          OBJECTS = hello-6.o pruzzel.o
-          HEADERS = pruzzel.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          %.o: %.c $(HEADERS)
-                  gcc $(CFLAGS) $< -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-      \end{onlyenv}
-    \item
-      Makros
-      \begin{onlyenv}<3>
-        \smallskip
-        \begin{lstlisting}[language=make,gobble=10]
-          TARGET = hello-6
-          OBJECTS = hello-6.o pruzzel.o
-          HEADERS = pruzzel.h
-          CFLAGS = -Wall -O
-
-          $(TARGET): $(OBJECTS)
-                  gcc $(OBJECTS) -o $(TARGET)
-
-          pruzzel.o: pruzzel.c $(HEADERS)
-                  gcc $(CFLAGS) pruzzel.c -c
-
-          hello-6.o: hello-6.c $(HEADERS)
-                  gcc $(CFLAGS) hello-6.c -c
-
-          clean:
-                  rm -f $(OBJECTS) $(TARGET)
-        \end{lstlisting}
-        \vspace*{-1cm}
-      \end{onlyenv}
-    \begin{onlyenv}<5->
-      \smallskip
-      \arrowitem
-        3 Sprachen: C, Präprozessor, make
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\setcounter{subsection}{3}
-\subsection{volatile-Variable}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Was ist eigentlich \lstinline{PORTD}?
-
-  \bigskip
-%  \pause
-
-  \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E}
-
-  \bigskip
-%  \pause
-  \lstinline{PORTD = 0x01;}\\
-  \textarrow\quad
-  \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\
-%  \pause
-  \begin{picture}(0,2)(0,-1.7)
-    \color{red}
-    \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$}
-%    \pause
-    \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\
-      auf \lstinline|volatile uint8_t|}}}$}
-%    \pause
-    \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}}
-    \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}}
-  \end{picture}
-
-%  \pause
-  \textarrow\quad
-  \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B|
-
-%  \pause
-  \bigskip
-  \bigskip
-
-  \textarrow\quad
-  \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee.
-
-\end{frame}
-
-\subsection{Byte-Reihenfolge -- Endianness}
-\subsubsection{Konzept}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-%  \pause
-  \bigskip
-
-  $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$
-
-%  \pause
-  \bigskip
-  Speicherzellen:
-
-  \medskip
-  \begin{tabular}{|c|c|l}\cline{1-2}
-    \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & für Menschen leichter lesbar \\
-    \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
-    \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & bei Additionen effizienter
-  \end{tabular}
-
-%  \pause
-  \medskip
-  \textarrow\ Geschmackssache
-%  \pause\\
-  \quad\textbf{\dots\ außer bei Datenaustausch!}
-
-%  \pause
-%  \bigskip
-%
-%  Aber: nicht verwechseln! \qquad $0304_{16} = 772$
-
-\end{frame}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \medskip
-
-  \textarrow\ Geschmackssache\\
-  \textbf{\dots\ außer bei Datenaustausch!}
-
-  \begin{itemize}
-    \item
-      Dateiformate
-    \item
-      Datenübertragung
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Dateiformate}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen
-  \begin{itemize}
-    \item
-      RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
-    \item
-      Au-Dateien (\file{.au}): Big-Endian
-%    \pause
-    \item
-      ältere AIFF-Dateien (\file{.aiff}): Big-Endian
-    \item
-      neuere AIFF-Dateien (\file{.aiff}): Little-Endian
-  \end{itemize}
-
-%  \pause
-  \bigskip
-
-  Grafik-Formate: Reihenfolge der Bits in den Bytes
-  \begin{itemize}
-    \item
-      PBM-Dateien: Big-Endian\only<1->{, MSB first}
-    \item
-      XBM-Dateien: Little-Endian\only<1->{, LSB first}
-  \end{itemize}
-  \only<1->{MSB/LSB = most/least significant bit}
-
-\end{frame}
-
-\subsubsection{Datenübertragung}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  \begin{itemize}
-    \item
-      RS-232 (serielle Schnittstelle): LSB first
-    \item
-      I$^2$C: MSB first
-    \item
-      USB: beides
-%    \pause
-    \medskip
-    \item
-      Ethernet: LSB first
-    \item
-      TCP/IP (Internet): Big-Endian
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Binärdarstellung negativer Zahlen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\
-  \pause
-  \textarrow\ 255 + 1 = 0
-
-  \pause
-  \medskip
-
-  8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\
-  \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\
-  \pause
-  \textarrow\ Zweierkomplement
-
-  \pause
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 127 + 1 = $-128$
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  16-Bit-Zahlen ohne Vorzeichen:
-  \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff}
-  = 0 bis 65535\hfill 0 bis 255\\
-  \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0
-
-  \medskip
-
-  16-Bit-Zahlen mit Vorzeichen:
-  \lstinline{int16_t}\hfill\lstinline{int8_t}\\
-  \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill
-  \lstinline{0xff} = 255 = $-1$\\
-  \textarrow\ Zweierkomplement
-
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 32767 + 1 = $-32768$
-
-  \bigskip
-  Literatur: \url{http://xkcd.com/571/}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Frage: \emph{Für welche Zahl steht der Speicherinhalt\,
-  \raisebox{2pt}{%
-    \tabcolsep0.25em
-    \begin{tabular}{|c|c|}\hline
-      \rule{0pt}{11pt}a3 & 90 \\\hline
-    \end{tabular}}
-  (hexadezimal)?}
-  
-  \pause
-  \smallskip
-  Antwort: \emph{Das kommt darauf an.} ;--)
-
-  \pause
-  \medskip
-  Little-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,: & $-28509$\\
-    als \lstinline,uint16_t,: & $37027$\\
-    \lstinline,int32_t, oder größer: & $37027$
-      & (zusätzliche Bytes mit Nullen aufgefüllt)
-  \end{tabular}
-
-  \pause
-  \medskip
-  Big-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,:   & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,:  & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,:  & $-23664$\\
-    als \lstinline,uint16_t,: & $41872$\\
-    als \lstinline,int32_t,:  & $-1550843904$ & (zusätzliche Bytes\\
-    als \lstinline,uint32_t,: & $2744123392$  & mit Nullen aufgefüllt)\\
-    als \lstinline,int64_t,:  & $-6660823848880963584$\\
-    als \lstinline,uint64_t,: & $11785920224828588032$\\
-  \end{tabular}
-
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Speicherausrichtung -- Alignment}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdint.h>
-
-    uint8_t a;
-    uint16_t b;
-    uint8_t c;
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"'
-  \begin{itemize}
-    \item
-      2-Byte-Operation: effizienter
-    \pause
-    \item
-      \dots\ oder sogar nur dann erlaubt
-    \pause
-    \arrowitem
-      Compiler optimiert Speicherausrichtung
-  \end{itemize}
-
-  \medskip
-
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t dummy;
-      uint16_t b;
-      uint8_t c;¿
-    \end{lstlisting}
-  \end{minipage}
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t c;
-      uint16_t b;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \vspace{-1.75cm}
-  \strut\hfill
-  \begin{minipage}{6.5cm}
-    Fazit:
-    \begin{itemize}
-      \item
-        \textbf{Adressen von Variablen\\
-        sind systemabhängig}
-      \item
-        Bei Definition von Datenformaten\\
-        Alignment beachten \textarrow\ effizienter
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\iffalse
-
-\section{Algorithmen}
-\setcounter{subsection}{1}
-\subsection{Rekursion}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Vollständige Induktion:
-  \vspace*{-0.725cm}
-  \begin{displaymath}
-    \hspace*{4cm}
-    \left.
-      \begin{array}{r}
-        \mbox{Aussage gilt für $n = 1$}\\[2pt]
-        \mbox{Schluß von $n - 1$ auf $n$}
-      \end{array}
-    \right\}
-    \mbox{Aussage gilt für alle $n\in\mathbb{N}$}
-  \end{displaymath}
-  \vspace*{-0.5cm}
-
-  \pause
-
-  Türme von Hanoi
-
-  \begin{onlyenv}<2>
-    \begin{center}
-      \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg}
-    \end{center}
-  \end{onlyenv}
-
-  \begin{onlyenv}<3->
-    \begin{itemize}
-      \item
-        64 Scheiben, 3 Plätze,
-        \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\
-        immer 1 Scheibe verschieben
-      \item
-        Ziel: Turm verschieben
-      \item
-        Es dürfen nur kleinere Scheiben\\
-        auf größeren liegen.
-      \bigskip
-      \pause
-      \pause
-      \item
-        $n = 1$ Scheibe: fertig
-      \item
-        Wenn $n - 1$ Scheiben verschiebbar:\\
-        schiebe $n - 1$ Scheiben auf Hilfsplatz,\\
-        verschiebe die darunterliegende,\\
-        hole $n - 1$ Scheiben von Hilfsplatz
-    \end{itemize}
-    \begin{onlyenv}<5>
-      \vspace{-4.3cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=6.4cm]
-        void move (int from, int to, int disks)
-        {
-          if (disks == 1)
-            move_one_disk (from, to);
-          else
-            {
-              int help = 0 + 1 + 2 - from - to;
-              move (from, help, disks - 1);
-              move (from, to, 1);
-              move (help, to, disks - 1);
-            }
-        }
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<6->
-      \vspace{-5.0cm}
-      \hspace*{7.4cm}\begin{minipage}[t]{5cm}
-        32 Scheiben:
-        \begin{lstlisting}[gobble=10,style=terminal]
-          $ ¡time ./hanoi-9a¿
-          ...
-          real    0m32,712s
-          user    0m32,708s
-          sys     0m0,000s
-        \end{lstlisting}
-        \pause[7]
-        \begin{itemize}
-          \arrowitem
-            etwas über 1 Minute\\
-            für 64 Scheiben
-        \end{itemize}
-        \pause
-        \vspace*{-0.5cm}
-        \begin{picture}(0,0)
-          \color{red}
-          \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}}
-          \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}}
-        \end{picture}
-
-        Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-        % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-        \begin{itemize}
-          \arrowitem
-            $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-            Jahre\\[\smallskipamount]
-            für 64 Scheiben
-        \end{itemize}
-      \end{minipage}
-    \end{onlyenv}
-  \end{onlyenv}
-
-\end{frame}
-
-\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse}
-
-\begin{frame}[fragile]
-
-  \newcommand{\w}{\hspace*{0.75pt}}
-
-  \showsubsection
-
-  \begin{picture}(0,0)
-    \put(7.8,-0.3){%
-      \begin{minipage}[t]{5.3cm}
-        \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf}
-%        \vspace*{-1.0cm}\alt<2->{\includegraphics{landau-symbols-2.pdf}}%
-%                                {\includegraphics{landau-symbols.pdf}}
-        \small
-        \begin{description}\itemsep0pt\leftskip-0.5cm
-          \item[$n$:] Eingabedaten
-          \item[$g(n)$:] Rechenzeit
-        \end{description}
-      \end{minipage}}
-  \end{picture}
-
-  \vspace*{-1.5\bigskipamount}
-
-  \begin{itemize}
-    \item
-      Türme von Hanoi: $\mathcal{O}(2^n)$
-      \begin{onlyenv}<1>
-        \par\medskip
-        Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-        % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-        \begin{itemize}
-          \arrowitem
-            $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-            Jahre\\[\smallskipamount]
-            für 64 Scheiben
-        \end{itemize}
-      \end{onlyenv}
-  \end{itemize}
-
-  \pause
-
-  Beispiel: Sortieralgorithmen
-
-  \begin{itemize}
-    \item
-      Minimum suchen: \alt<4->{$\mathcal{O}(n)$}{$\mathcal{O}(\textbf{\color{red}?})$}
-    \pause
-    \item
-      \dots\ mit Schummeln: $\mathcal{O}(1)$
-      \pause
-      \pause
-      \begin{picture}(0,0)
-        \put(-4.742,-3.7){\begin{minipage}[t]{12cm}
-          Faustregel:\\Schachtelung der Schleifen zählen\\
-          $x$ Schleifen \textarrow\ $\mathcal{O}(n\w^x)$
-%          \pause
-%          \begin{tabbing}
-%            Verschlüsselung brechen (Primfaktorzerlegung):~\=\kill
-%            \textbf{\color{red}RSA}: Schlüsselerzeugung (Berechnung von $d\/$): 
-%              \> \color{red}$\mathcal{O}\bigl((\log n)^2\bigr)$,\\[\smallskipamount]
-%            Ver- und Entschlüsselung (Exponentiation):
-%              \> \color{red}$\mathcal{O}\kern0.5pt(n\log n)$,\\[0.5\smallskipamount]
-%            Verschlüsselung brechen (Primfaktorzerlegung):
-%              \> \color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$
-%          \end{tabbing}
-        \end{minipage}}
-      \end{picture}
-    \pause
-    \item
-      Minimum an den Anfang tauschen,\\
-      nächstes Minimum suchen:\\
-      \textarrow\ Selectionsort\pause: $\mathcal{O}(n\w^2)$
-%    \pause
-%    \item
-%      Während Minimumsuche prüfen\\und abbrechen, falls schon sortiert\\
-%      \textarrow\ Bubblesort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n\w^2)$
-%    \pause
-%    \item
-%      Rekursiv sortieren\\
-%      \textarrow\ Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n\w^2)$\hfill
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\end{document}
diff --git a/20191219/hp-musterloesung-20191219.pdf b/20191219/hp-musterloesung-20191219.pdf
deleted file mode 100644
index 688d7ce5fcc4a639ceaa7cb2896557431672528f..0000000000000000000000000000000000000000
Binary files a/20191219/hp-musterloesung-20191219.pdf and /dev/null differ
diff --git a/20191219/hp-musterloesung-20191219.tex b/20191219/hp-musterloesung-20191219.tex
deleted file mode 100644
index 1f82cc4757d49e35777db7a531444d00c66b8fca..0000000000000000000000000000000000000000
--- a/20191219/hp-musterloesung-20191219.tex
+++ /dev/null
@@ -1,265 +0,0 @@
-% hp-musterloesung-20191219.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{gensymb}
-
-\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C}
-\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 19.\ Dezember 2019}
-
-  \exercise{Trickprogrammierung}
-
-  Wir betrachten das folgende Programm (Datei: \gitfile{hp}{20191219}{aufgabe-1.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    int main (void)
-    {
-      uint64_t x = 4262939000843297096;
-      char *s = &x;
-      printf ("%s\n", s);
-      return 0;
-    }
-  \end{lstlisting}
-  Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿
-    aufgabe-1.c: In function `main':
-    aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...]
-    $ ¡./aufgabe-1¿
-    Hallo
-  \end{lstlisting}
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie die Warnung beim Compilieren. \points{2}
-    \item[(b)]
-      Erklären Sie die Ausgabe des Programms. \points{5}
-    \item[(c)]
-      Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3}
-  \end{itemize}
-  Hinweis: Modifizieren Sie das Programm
-  und lassen Sie sich Speicherinhalte ausgeben.
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Erklären Sie die Warnung beim Compilieren.}
-
-      Zeile 7 des Programms enthält eine Zuweisung von \lstinline{&x}
-      an die Variable \lstinline{s}.
-      Der Ausdruck \lstinline{&x} steht für die Speicheradresse der Variablen \lstinline{x},
-      ist also ein Zeiger auf \lstinline{x},
-      also ein Zeiger auf eine \lstinline{uint64_t}.
-      Die Variable \lstinline{s} hingegen ist ein Zeiger auf \lstinline{char},
-      also ein Zeiger auf eine viel kleinere Zahl,
-      also ein anderer Zeigertyp.
-
-    \item[(b)]
-      \textbf{Erklären Sie die Ausgabe des Programms.}
-
-      Die 64-Bit-Zahl (\lstinline{uint64_t}) \lstinline{x}
-      belegt 8 Speicherzellen (Bytes) von jeweils 8 Bit.
-      Um herauszufinden, was diese enthalten,
-      lassen wir uns \lstinline{x} als Hexadezimalzahl ausgeben,
-      z.\,B.\ mittels \lstinline{printf ("%lx\n", x)}
-      (auf 32-Bit-Rechnern: \lstinline{"%llx\n"})
-      oder mittels \lstinline{printf ("%" PRIx64 "\n", x)}
-      (erfordert \lstinline{#include <inttypes.h>}
-      -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-1.c}).
-      Das Ergebnis lautet:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        3b29006f6c6c6148
-      \end{lstlisting}
-      Auf einzelne Bytes verteilt:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        3b 29 00 6f 6c 6c 61 48
-      \end{lstlisting}
-      Auf einem Little-Endian-Rechner
-      ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        48 61 6c 6c 6f 00 29 3b
-      \end{lstlisting}
-      Wenn wir uns diese Bytes als Zeichen ausgeben lassen
-      (\lstinline{printf()} mit \lstinline{%c} -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-2.c}),
-      erhalten wir:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        H a l l o  ) ;
-      \end{lstlisting}
-      Das Zeichen hinter "`Hallo"' ist ein Null-Symbol (Zahlenwert 0)
-      und wird von \lstinline{printf ("%s")} als Ende des Strings erkannt.
-      Damit ist die Ausgabe \lstinline[style=terminal]{Hallo}
-      des Programms erklärt.
-
-    \goodbreak
-    \item[(c)]
-      \textbf{Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten?}
-
-      Auf einem Big-Endian-Computer (egal, wieviele Bits die Prozessorregister haben)
-      ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt
-      wie auf einem Little-Endian-Computer, hier also:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        3b 29 00 6f 6c 6c 61 48
-      \end{lstlisting}
-      \lstinline{printf ("%s")} gibt in diesem Fall die Hexadezimalzahlen
-      \lstinline[style=terminal]{3b} und \lstinline[style=terminal]{29}
-      als Zeichen aus. Danach steht das String-Ende-Symbol mit Zahlenwert 0,
-      und die Ausgabe bricht ab.
-      Da, wie oben ermittelt, die Hexadezimalzahl \lstinline[style=terminal]{3b}
-      für das Zeichen \lstinline[style=terminal]{;}
-      und \lstinline[style=terminal]{29}
-      für das Zeichen \lstinline[style=terminal]{)} steht,
-      lautet somit die Ausgabe:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        ;)
-      \end{lstlisting}
-      Um die Aufgabe zu lösen, können Sie übrigens auch
-      auf einem Little-Endian-Computer (Standard-Notebook)
-      einen Big-Endian-Computer simulieren,
-      indem Sie die Reihenfolge der Bytes in der Zahl \lstinline{x} umdrehen
-      -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-3.c}.
-  \end{itemize}
-
-  \exercise{Thermometer-Baustein an \ITWOC-Bus}
-
-  Eine Firma stellt einen elektronischen Thermometer-Baustein her,
-  den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann,
-  um die Temperatur auszulesen.
-  Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt,
-  die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt.
-
-  Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt,
-  das langsam auf Zimmertemperatur abkühlt.
-  Alle 10 Minuten liest ein Programm, das auf dem PC läuft,
-  die gemessene Temperatur über beide Schnittstellen aus
-  und erzeugt daraus die folgende Tabelle:
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.2}
-    \begin{tabular}{|c|c|c|}\hline
-      Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline
-      \phantom{0}0 & 94 & 122 \\\hline
-      10 & 47 & 244 \\\hline
-      20 & 30 & 120 \\\hline
-      30 & 24 & \phantom{0}24 \\\hline
-      40 & 21 & 168 \\\hline
-    \end{tabular}
-  \end{center}
-
-  \begin{itemize}
-    \item[(a)]
-      Aus dem Vergleich der Meßdaten läßt sich
-      auf einen Fehler bei der \ItwoC-Übertragung schließen.\\
-      Um welchen Fehler handelt es sich,
-      und wie ergibt sich dies aus den Meßdaten?
-      \points{5}
-    \item[(b)]
-      Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)},
-      die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.
-      \points{5}
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Aus dem Vergleich der Meßdaten läßt sich
-      auf einen Fehler bei der \ItwoC-Übertragung schließen.
-      Um welchen Fehler handelt es sich,
-      und wie ergibt sich dies aus den Meßdaten?}
-
-      Sowohl RS-232 als auch \ItwoC\ übertragen die Daten Bit für Bit.
-      Für die Fehlersuche ist es daher sinnvoll,
-      die Meßwerte als Binärzahlen zu betrachten:
-
-      \begin{center}
-        \renewcommand{\arraystretch}{1.2}
-        \begin{tabular}{|c|c|c|}\hline
-          Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline
-          \phantom{0}0 & 94$_{10}$ = 01011110$_2$ & 122$_{10}$           = 01111010$_2$ \\\hline
-          10           & 47$_{10}$ = 00101111$_2$ & 244$_{10}$           = 11110100$_2$ \\\hline
-          20           & 30$_{10}$ = 00011110$_2$ & 120$_{10}$           = 01111000$_2$ \\\hline
-          30           & 24$_{10}$ = 00011000$_2$ & \phantom{0}24$_{10}$ = 00011000$_2$ \\\hline
-          40           & 21$_{10}$ = 00010101$_2$ & 168$_{10}$           = 10101000$_2$ \\\hline
-        \end{tabular}
-      \end{center}
-
-      Man erkennt, daß die Reihenfolge der Bits in den (fehlerhaften) \ItwoC-Meßwerten
-      genau die umgekehrte Reihenfolge der Bits in den (korrekten) RS-232-Mewßwerten ist.
-      Der Übertragungsfehler besteht also darin,
-      daß die Bits in der falschen Reihenfolge übertragen wurden.
-
-      Dies paßt gut damit zusammen,
-      daß die Bit-Reihenfolge von \ItwoC\ \emph{MSB First}, die von RS-232 hingegen \emph{LSB First\/} ist.
-      Offenbar haben die Entwickler der \ItwoC-Schnittstelle dies übersehen
-      und die \ItwoC-Daten ebenfalls \emph{LSB First\/} übertragen.
-
-    \goodbreak
-    \item[(b)]
-      \textbf{Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)},
-      die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.}
-
-      Die Aufgabe der Funktion besteht darin,
-      eine 8-Bit-Zahl \lstinline{data} entgegenzunehmen,
-      die Reihenfolge der 8 Bits genau umzudrehen
-      und das Ergebnis mittels \lstinline{return} zurückzugeben.
-
-      Zu diesem Zweck gehen wir die 8 Bits in einer Schleife durch
-      -- siehe die Datei \gitfile{hp}{20191219}{loesung-2.c}.
-      Wir lassen eine Lese-Maske \lstinline{mask_data} von rechts nach links
-      und gleichzeitig eine Schreib-Maske \lstinline{mask_result}
-      von links nach rechts wandern.
-      Immer wenn die Lese-Maske in \lstinline{data} eine 1 findet,
-      schreibt die Schreib-Maske diese in die Ergebnisvariable \lstinline{result}.
-
-      Da \lstinline{result} auf 0 initialisiert wurde,
-      brauchen wir Nullen nicht hineinzuschreiben.
-      Ansonsten wäre dies mit \lstinline{result &= ~mask_result} möglich.
-
-      Um die Schleife bis 8 zählen zu lassen,
-      könnte man eine weitere Zähler-Variable von 0 bis 7 zählen lassen,
-      z.\,B.\ \lstinline{for (int i = 0; i < 8; i++)}.
-      Dies ist jedoch nicht nötig, wenn man beachtet,
-      daß die Masken den Wert 0 annehmen,
-      sobald das Bit aus der 8-Bit-Variablen herausgeschoben wurde.
-      In \gitfile{hp}{20191219}{loesung-2.c} wird \lstinline{mask_data} auf 0 geprüft;
-      genausogut könnte man auch \lstinline{mask_result} prüfen.
-
-      Das \lstinline{return result} ist notwendig.
-      Eine Ausgabe des Ergebnisses per \lstinline{printf()} o.\,ä.\
-      erfüllt \emph{nicht\/} die Aufgabenstellung.
-      (In \gitfile{hp}{20191219}{loesung-2.c} erfolgt entsprechend \lstinline{printf()}
-      nur im Testprogramm \lstinline{main()}.)
-  \end{itemize}
-
-\end{document}
diff --git a/20191219/hp-uebung-20191219.pdf b/20191219/hp-uebung-20191219.pdf
deleted file mode 100644
index 5ccdb7b15f013e925d5835258876fd8f2a8af782..0000000000000000000000000000000000000000
Binary files a/20191219/hp-uebung-20191219.pdf and /dev/null differ
diff --git a/20191219/hp-uebung-20191219.tex b/20191219/hp-uebung-20191219.tex
deleted file mode 100644
index b5a91185771a20e9c071880c111162bac59ff914..0000000000000000000000000000000000000000
--- a/20191219/hp-uebung-20191219.tex
+++ /dev/null
@@ -1,202 +0,0 @@
-% hp-uebung-20191219.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{gensymb}
-
-\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C}
-\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 19.\ Dezember 2019}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  10 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Trickprogrammierung}
-
-  Wir betrachten das folgende Programm (Datei: \gitfile{hp}{20191219}{aufgabe-1.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    int main (void)
-    {
-      uint64_t x = 4262939000843297096;
-      char *s = &x;
-      printf ("%s\n", s);
-      return 0;
-    }
-  \end{lstlisting}
-  Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿
-    aufgabe-1.c: In function `main':
-    aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...]
-    $ ¡./aufgabe-1¿
-    Hallo
-  \end{lstlisting}
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie die Warnung beim Compilieren. \points{2}
-    \item[(b)]
-      Erklären Sie die Ausgabe des Programms. \points{5}
-    \item[(c)]
-      Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3}
-  \end{itemize}
-  Hinweis: Modifizieren Sie das Programm
-  und lassen Sie sich Speicherinhalte ausgeben.
-
-  \exercise{Thermometer-Baustein an \ITWOC-Bus}
-
-  Eine Firma stellt einen elektronischen Thermometer-Baustein her,
-  den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann,
-  um die Temperatur auszulesen.
-  Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt,
-  die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt.
-
-  Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt,
-  das langsam auf Zimmertemperatur abkühlt.
-  Alle 10 Minuten liest ein Programm, das auf dem PC läuft,
-  die gemessene Temperatur über beide Schnittstellen aus
-  und erzeugt daraus die folgende Tabelle:
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.2}
-    \begin{tabular}{|c|c|c|}\hline
-      Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline
-      \phantom{0}0 & 94 & 122 \\\hline
-      10 & 47 & 244 \\\hline
-      20 & 30 & 120 \\\hline
-      30 & 24 & \phantom{0}24 \\\hline
-      40 & 21 & 168 \\\hline
-    \end{tabular}
-  \end{center}
-
-  \begin{itemize}
-    \item[(a)]
-      Aus dem Vergleich der Meßdaten läßt sich
-      auf einen Fehler bei der \ItwoC-Übertragung schließen.\\
-      Um welchen Fehler handelt es sich,
-      und wie ergibt sich dies aus den Meßdaten?
-      \points{5}
-    \item[(b)]
-      Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)},
-      die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.
-      \points{5}
-  \end{itemize}
-
-\iffalse
-
-  \exercise{Lauflicht}
-
-  \begin{minipage}[t]{8cm}
-    An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen:
-    \begin{itemize}
-      \item
-        von links nach rechts\\
-        an die Ports A, B, C und D,
-      \item
-        von oben nach unten\\
-        an die Bits Nr.\ 0 bis 7.
-
-        \bigskip
-
-        \includegraphics[width=3cm]{leds.jpg}
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{7cm}
-    Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20181210}{aufgabe-2.c})
-    für diesen Mikrocontroller:
-
-    \begin{lstlisting}[gobble=6]
-      #include <avr/io.h>
-      #include <avr/interrupt.h>
-
-      int counter = 0;
-
-      ISR (TIMER0_COMP_vect)
-      {
-        PORTA = 1 << ((counter++ >> 6) & 7);
-      }
-
-      int main (void)
-      {
-        cli ();
-        TCCR0 = (1 << CS01) | (1 << CS00);
-        TIMSK = 1 << OCIE0;
-        sei ();
-        DDRA = 0xff;
-        while (1);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  \medskip
-
-  Das Programm bewirkt ein periodisches Lauflicht in der linken Spalte von oben nach unten.
-  Eine Animation davon finden Sie in der Datei \gitfile{hp}{20181210}{aufgabe-2.gif}.
-
-  \begin{itemize}
-    \item[(a)]
-      Wieso bewirkt das Programm überhaupt etwas, wenn doch das Hauptprogramm
-      nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts\/} passiert? \points 3
-    \item[(b)]
-      Erklären Sie, wie die Anweisung
-      \begin{lstlisting}[gobble=8]
-        PORTA = 1 << ((counter++ >> 6) & 7);
-      \end{lstlisting}
-      \vspace{-\medskipamount}
-      das LED-Blinkmuster hervorruft. \points 6
-
-      Hinweis: Zerlegen Sie die eine lange Anweisung in mehrere kürzere.\\
-      Wenn nötig, verwenden Sie zusätzliche Variable für Zwischenergebnisse.
-    \item[(c)]
-      Was bedeutet "`\lstinline{ISR (TIMER0_COMP_vect)}"'? \points 1
-    \item[(d)]
-      Wieso leuchten die Leuchtdioden PB2 und PD1? \points 2
-  \end{itemize}
-
-\fi
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20191219/landau-symbols.pdf b/20191219/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20191219/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20191219/loesung-1-1.c b/20191219/loesung-1-1.c
deleted file mode 100644
index 26fcc817796b3da118b5dda92f45bfb870e315b6..0000000000000000000000000000000000000000
--- a/20191219/loesung-1-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-int main (void)
-{
-  uint64_t x = 4262939000843297096;
-  char *s = &x;
-  printf ("%lx\n", x);
-  printf ("%" PRIx64 "\n", x);
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/20191219/loesung-1-2.c b/20191219/loesung-1-2.c
deleted file mode 100644
index 7151db69b2e675f17517d7b7c3814bbda3b1fa89..0000000000000000000000000000000000000000
--- a/20191219/loesung-1-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-int main (void)
-{
-  uint64_t x = 4262939000843297096;
-  char *s = &x;
-  printf ("%lx\n", x);
-  printf ("%" PRIx64 "\n", x);
-  printf ("%c %c %c %c %c %c %c %c\n",
-          0x48, 0x61, 0x6c, 0x6c, 0x6f, 0x00, 0x29, 0x3b);
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/20191219/loesung-1-3.c b/20191219/loesung-1-3.c
deleted file mode 100644
index fadccdef1155e4d16b5da0c8a82d8e7ae76ca3cc..0000000000000000000000000000000000000000
--- a/20191219/loesung-1-3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-int main (void)
-{
-  uint64_t x = 0x48616c6c6f00293b;
-  char *s = &x;
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/20191219/loesung-2.c b/20191219/loesung-2.c
deleted file mode 100644
index b02d98b51b9bc525a567afea2f0dce5a8e6413a5..0000000000000000000000000000000000000000
--- a/20191219/loesung-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-uint8_t repair (uint8_t data)
-{
-  uint8_t result = 0;
-  uint8_t mask_data = 0x01;
-  uint8_t mask_result = 0x80;
-  while (mask_data)
-    {
-      if (data & mask_data)
-        result |= mask_result;
-      mask_data <<= 1;
-      mask_result >>= 1;
-    }
-  return result;
-}
-
-int main (void)
-{
-  int data[] = { 122, 244, 120, 24, 168, -1 };
-  int i = 0;
-  while (data[i] >= 0)
-    printf ("%d\n", repair (data[i++]));
-  return 0;
-}
diff --git a/20191219/logo-hochschule-bochum-cvh-text-v2.pdf b/20191219/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20191219/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20191219/logo-hochschule-bochum.pdf b/20191219/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20191219/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20191219/pgscript.sty b/20191219/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20191219/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20191219/pgslides.sty b/20191219/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20191219/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20191219/photo-20191219-172103.jpg b/20191219/photo-20191219-172103.jpg
deleted file mode 100644
index 376c4084dc0eed7e4475bb843dc0936246c448ca..0000000000000000000000000000000000000000
Binary files a/20191219/photo-20191219-172103.jpg and /dev/null differ
diff --git a/20191219/photo-20191219-172103.txt b/20191219/photo-20191219-172103.txt
deleted file mode 100644
index 83837b35ed9fda920030964ecf307883540a4657..0000000000000000000000000000000000000000
--- a/20191219/photo-20191219-172103.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Interpretation von Bytes im Speicher als Zahlenwert
diff --git a/20191219/photo-20191219-172146.jpg b/20191219/photo-20191219-172146.jpg
deleted file mode 100644
index 3aa4c58f39dea13b0e956955fff5065bc2de00e0..0000000000000000000000000000000000000000
Binary files a/20191219/photo-20191219-172146.jpg and /dev/null differ
diff --git a/20191219/photo-20191219-172146.txt b/20191219/photo-20191219-172146.txt
deleted file mode 100644
index 57b4cf6cee3d0d79aa6e92cd71178a7e2c81094b..0000000000000000000000000000000000000000
--- a/20191219/photo-20191219-172146.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Bildschirmspeicher als Beispiel für Speicherausrichting (Alignment)
diff --git a/20200102/README.md b/20200102/README.md
deleted file mode 100644
index 33449c25e29e156b1aa8a8298f8ee6d8c7152744..0000000000000000000000000000000000000000
--- a/20200102/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-Spezial-Vorlesung am 2.1.2020: Quantencomputer
-==============================================
-
-Die Sicherheit aktueller Verschlüsselungsverfahren beruht auf der
-Schwierigkeit, bestimmte mathematische Probleme zu lösen (Beispiel:
-RSA-Verfahren – Primfaktorzerlegung).
-
-Im September 2019 meldete Google einen Durchbruch beim Bau eines
-_Quantencomputers_.  Mit Hilfe derartiger Systeme lassen sich die
-o.a. mathematischen Probleme in erheblich kürzerer Zeit lösen.
-Dies stellt die weltweite Datensicherheit in Frage.
-
-Dieser Vortrag soll beleuchten, wie Quantencomputer grundsätzlich
-funktionieren und skizzieren, auf welche Weise man damit aktuelle
-Verschlüsselungsverfahren (am Beispiel des RSA-Verfahrens) brechen
-kann. Desweiteren wird darauf eingegangen, welche Rollen
-Datensicherheit und Datenschutz in unserem Alltag spielen.
-
-Vorkenntnisse: Vektorrechnung, komplexe Zahlen  
-Uhrzeit und Raum: 15:45 bis ca. 17:15 Uhr, Seminarraum 3-30  
-Im Anschluß laden wir ein zu einer Diskussions- und Fragestunde.
diff --git a/20200102/ampel-blau-gelb.png b/20200102/ampel-blau-gelb.png
deleted file mode 100644
index 3ed3e39f3c9d836c56339fa6ecba30afe392b0cd..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-blau-gelb.png and /dev/null differ
diff --git a/20200102/ampel-blau.png b/20200102/ampel-blau.png
deleted file mode 100644
index 15db6ebdc892f5a9242dd51b02aa202624e946ab..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-blau.png and /dev/null differ
diff --git a/20200102/ampel-gelb.png b/20200102/ampel-gelb.png
deleted file mode 100644
index 694b25a5d56ec1138d18285e67c50dd656479fbb..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-gelb.png and /dev/null differ
diff --git a/20200102/ampel-gemisch-not.png b/20200102/ampel-gemisch-not.png
deleted file mode 100644
index 98f6cc3ef523e12dbba8cb0c71714ceac8c0b705..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-gemisch-not.png and /dev/null differ
diff --git a/20200102/ampel-gemisch-wurzel-not.png b/20200102/ampel-gemisch-wurzel-not.png
deleted file mode 100644
index e3adca2228f444d6fbf672884e8f3eb127918d25..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-gemisch-wurzel-not.png and /dev/null differ
diff --git a/20200102/ampel-gemisch.png b/20200102/ampel-gemisch.png
deleted file mode 100644
index 297ee902133df87b5dce8a093a032bc52c5bd2e9..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-gemisch.png and /dev/null differ
diff --git a/20200102/ampel-gruen.png b/20200102/ampel-gruen.png
deleted file mode 100644
index e330b8afd2aff4f27ccd9787432d2c761930fc11..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-gruen.png and /dev/null differ
diff --git a/20200102/ampel-rot-gelb-blau.png b/20200102/ampel-rot-gelb-blau.png
deleted file mode 100644
index 9457f316780ca8ebb84d08c6335bf42cbf861a50..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-rot-gelb-blau.png and /dev/null differ
diff --git a/20200102/ampel-rot-gruen-blau.png b/20200102/ampel-rot-gruen-blau.png
deleted file mode 100644
index 8528005291d2972eb765d46e00fd50bc4cdbcec8..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-rot-gruen-blau.png and /dev/null differ
diff --git a/20200102/ampel-rot.png b/20200102/ampel-rot.png
deleted file mode 100644
index 89134afd42fbbc7dbb6e60b1b829c0a73f4972f9..0000000000000000000000000000000000000000
Binary files a/20200102/ampel-rot.png and /dev/null differ
diff --git a/20200102/ampel.xcf.gz b/20200102/ampel.xcf.gz
deleted file mode 100644
index da5dd69d81155728b553d8b4e8d917907ec944f4..0000000000000000000000000000000000000000
Binary files a/20200102/ampel.xcf.gz and /dev/null differ
diff --git a/20200102/hp-20200102.pdf b/20200102/hp-20200102.pdf
deleted file mode 100644
index aca2d3b40041266ec74d41e2940cee4aad028fb0..0000000000000000000000000000000000000000
Binary files a/20200102/hp-20200102.pdf and /dev/null differ
diff --git a/20200102/hp-20200102.tex b/20200102/hp-20200102.tex
deleted file mode 100644
index 8727b5d0637e6faff39f09576cb1e91ecf6fa64a..0000000000000000000000000000000000000000
--- a/20200102/hp-20200102.tex
+++ /dev/null
@@ -1,748 +0,0 @@
-% hp-20120102.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Quantencomputer, Datensicherheit und Datenschutz
-
-\documentclass[10pt,t,fleqn]{beamer}
-
-\usepackage{pgslides}
-\usepackage{tikz}
-
-\usefonttheme[onlymath]{serif}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{2.\ Januar 2020}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \vspace*{-0.1cm}
-        \item[\dots]
-%        \item[4.3] Interrupts
-%        \item[4.4] volatile-Variable
-        \item[4.6] Byte-Reihenfolge -- Endianness
-        \color{medgreen}
-        \item[4.7] Binärdarstellung negativer Zahlen
-        \item[4.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \item[5.2] Rekursion
-        \color{magenta}
-        \item[5.3] Aufwandsabschätzungen
-        \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer
-%        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{4}
-\section{Algorithmen}
-\setcounter{subsection}{2}
-\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse}
-
-\begin{frame}[fragile]
-
-%  \newcommand{\w}{\hspace*{0.75pt}}
-
-  \showsubsection
-
-  \begin{picture}(0,0)
-    \put(7.6,-0.5){%
-      \begin{minipage}[t]{5.3cm}
-%        \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf}
-        \vspace*{-1.0cm}\alt<3->{\includegraphics{landau-symbols-3.pdf}}%
-                       {\alt<2->{\includegraphics{landau-symbols-2.pdf}}%
-                                {\includegraphics{landau-symbols.pdf}}}
-        \small
-        \begin{description}\itemsep0pt\leftskip-0.5cm
-          \item[$n$:] Eingabedaten
-          \item[$g(n)$:] Rechenzeit
-        \end{description}
-      \end{minipage}}
-  \end{picture}
-
-  \vspace*{-\bigskipamount}
-
-  Wann ist ein Programm "`schnell"'?
-
-  \medskip
-
-  Faustregel:\\Schachtelung der Schleifen zählen\\
-  $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$
-
-  \bigskip
-
-  \begin{onlyenv}<1>
-    \textbf{Wie schnell ist RSA-Verschlüsselung?}
-
-    \smallskip
-
-    \begin{math}
-      c = m^e\,\%\,N
-    \end{math}
-    \quad
-    ("`$\%$"' = "`modulo"')
-
-    \medskip
-
-    \begin{lstlisting}[gobble=6,xleftmargin=2em]
-      int c = 1;
-      for (int i = 0; i < e; i++)
-        c = (c * m) % N;
-    \end{lstlisting}
-
-    \smallskip
-
-    \begin{itemize}
-      \item
-        $\mathcal{O}(e)$ Iterationen
-%      \item
-%        wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist:
-%        $\mathcal{O}(2^n)$ Iterationen
-      \item
-        mit Trick:
-        $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$)
-    \end{itemize}
-
-    \smallskip
-
-    Jede Iteration enthält eine Multiplikation und eine Division.\\
-    Aufwand dafür: $\mathcal{O}(\log e)$\\
-    \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<2->
-
-    \textbf{Wie schnell ist RSA?}\\
-
-    \smallskip
-
-    ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$)
-
-%    \begin{tabbing}
-%      Verschlüsselung brechen (Primfaktorzerlegung):~\=\kill
-%      Schlüsselerzeugung (Berechnung von $d$): 
-%        \> \color{red}$\mathcal{O}\bigl((\log n)^2\bigr)$,\\[0.5\smallskipamount]
-%      Ver- und Entschlüsselung (Exponentiation):
-%        \> \color{red}$\mathcal{O}\kern0.5pt(n\log n)$,\\[0.5\smallskipamount]
-%      Verschlüsselung brechen (Primfaktorzerlegung):
-%        \> \color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$
-%    \end{tabbing}
-
-    \begin{itemize}
-      \item
-        Ver- und Entschlüsselung (Exponentiation):\\
-        {\color{red}$\mathcal{O}\!\left((\log n)^2\right)$}
-      \item
-        Schlüsselerzeugung (Berechnung von $d$):\\
-        {\color{red}$\mathcal{O}\!\left((\log n)^2\right)$}
-      \item
-        Verschlüsselung brechen (Primfaktorzerlegung):\\
-        {\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$}
-    \end{itemize}
-
-    \vspace{0cm plus 1filll}
-
-    \textbf{Die Sicherheit von RSA beruht darauf,
-    daß das Brechen der Verschlüsselung aufwendiger ist als
-    \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).}
-
-    \vspace*{0.65cm}
-
-  \end{onlyenv}
-
-\end{frame}
-
-\subsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$\quad Quantencomputer}
-
-\begin{frame}
-
-  \showsubsectionnonumber
-
-  Mit Hilfe eines Quantencomputers ist es möglich,\\
-  RSA mit dem Aufwand $\mathcal{O}\bigl((\log n)^3\bigr)$ zu brechen.
-
-  \medskip
-
-  Hierfür ist ein Quantencomputer mit mindestens $\log n$ Qubits erforderlich.\\
-  ($\log n$ ist die Länge des Schlüssels in Bits,
-  derzeit typischerweise 2048 bis 4096.)
-
-  \bigskip
-
-  Dezember 2001:\\
-  IBM präsentiert einen funktionierenden Quantencomputer mit 7 Qubits.
-
-  \medskip
-
-  September 2019:\\
-  Google präsentiert einen funktionierenden Quantencomputer mit 53 Qubits.
-
-  \vspace{0cm plus 1filll}
-
-  \textbf{Die Sicherheit von RSA beruht darauf,
-  daß das Brechen der Verschlüsselung aufwendiger ist als
-  \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).}
-
-  \vspace*{0.65cm}
-
-\end{frame}
-
-\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$i$\quad Einführung in die Quantenmechanik}
-
-\begin{frame}
-
-  \showsubsubsectionnonumber
-
-  \begin{onlyenv}<1-3>
-
-    Klassische Mechanik (Physik):
-
-    \smallskip
-
-    Zustand eines Teilchens (Massenpunkt):\\
-    Masse $m$, Ort $\vec{x}$, Impuls $\vec{p}$ (oder: Geschwindigkeit $\vec{v}\kern1pt$)
-
-    \bigskip
-
-  \end{onlyenv}
-
-  \pause
-
-  Quantenmechanik:
-
-  \smallskip
-
-  Zustand eines Teilchens:\\
-  Masse $m$, komplexwertige Wellenfunktion $\psi(\vec{x})$
-  \begin{itemize}
-    \item
-      Ort: $|\psi(\vec{x})|^2$ = Wahrscheinlichkeit, das Teilchen am Ort $\vec{x}$ zu messen
-    \item
-      Impuls: Wellenstruktur in der komplexen Phase
-    \pause
-    \item
-      Normierung:
-      \begin{math}
-        \displaystyle
-        \int\limits_{\mathbb{R}^3} |\psi(\vec{x}\kern1pt)|^2\,d^3\vec{x} = 1
-      \end{math}
-      ("`Irgendwo muß das Teilchen ja sein \dots"')
-  \end{itemize}
-
-  \begin{onlyenv}<4>
-
-    \bigskip
-
-    Einfachster Fall: Es gibt überhaupt nur 2 Orte.
-    \begin{displaymath}
-      \psi(\vec{x}\kern1pt)
-        = \left(\begin{array}{c}
-            \psi_1 \\
-            \psi_0
-          \end{array}\right)
-      \qquad
-      |\psi_0|^2 + |\psi_1|^2 = 1
-    \end{displaymath}
-
-    Schreibweise: Basisvektoren $\left|0\right>$ und $\left|1\right>$
-    -- "`Basiszustände"'
-    \begin{displaymath}
-      \psi(\vec{x}\kern1pt)
-        = \psi_0 \left|0\right> + \psi_1 \left|1\right>
-    \end{displaymath}
-
-  \end{onlyenv}
-
-\end{frame}
-
-\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{2}i$\quad Qubits}
-
-\begin{frame}
-
-  \showsubsubsectionnonumber
-
-  \begin{itemize}
-    \item
-      Ein Bit kann die (klassischen) Zustände 0 und 1 annehmen.
-    \arrowitem
-      2 Zustände, beschrieben durch eine ganze Zahl, die 0 oder 1 sein darf
-      \begin{center}
-        \bigskip
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gruen.png}}\qquad\qquad
-        \makebox(0,0){oder}\qquad\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-rot.png}}
-        \bigskip
-      \end{center}
-    \medskip
-    \item
-      Ein Qubit kann die quantenmechanischen Basiszustände\\
-      $\left|0\right>$ und $\left|1\right>$ annehmen ("`1 Teilchen, 2 Orte"').
-    \arrowitem
-      unendlich viele Zustände, beschrieben durch\\
-      zwei komplexe Zahlen $\psi_0$ und $\psi_1$ mit $|\psi_0|^2 + |\psi_1|^2 = 1$
-      \begin{center}
-        \bigskip
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}~\qquad
-        \makebox(0,0){=}\qquad
-        \makebox(0,0){$\sqrt{\frac13}$}\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gruen.png}}\qquad
-        \makebox(0,0){+}\qquad
-        \makebox(0,0){$\sqrt{\frac23}$}\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-rot.png}}
-        \bigskip
-      \end{center}
-    \medskip
-    \item
-      Messung: Das Qubit muß sich für $\left|0\right>$ oder $\left|1\right>$ entscheiden.\\
-      Die Wahrscheinlichkeit beträgt $|\psi_0|^2$ bzw.\ $|\psi_1|^2$.
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsubsubsectionnonumber
-  \begin{itemize}
-    \item
-      Eine $\text{\rm NOT}$-Operation auf einem Qubit
-      vertauscht $\left|0\right>$ und $\left|1\right>$.
-      \begin{displaymath}
-        \text{\rm NOT} \left(\begin{array}{c}
-                     \psi_1\\
-                     \psi_0
-                   \end{array}\right)
-          = \left(\begin{array}{c}
-              \psi_0\\
-              \psi_1
-            \end{array}\right)
-          = \left(\begin{array}{cc}
-              0 & 1 \\
-              1 & 0
-            \end{array}\right)
-            \left(\begin{array}{c}
-              \psi_1\\
-              \psi_0
-            \end{array}\right)
-      \end{displaymath}
-      \begin{center}
-        \bigskip
-        \makebox(0,0){$\text{\rm NOT}$}~\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad
-        \makebox(0,0){=}\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-not.png}}
-        \bigskip
-      \end{center}
-    \pause
-    \bigskip
-    \item
-      Eine $\sqrt{\text{\rm NOT}}$-Operation auf einem Qubit
-      vertauscht $\left|0\right>$ und $\left|1\right>$ halb.
-      \begin{displaymath}
-        \sqrt{\text{\rm NOT}}
-          = \frac{1}{\sqrt{2i}}
-            \left(\begin{array}{cc}
-              i & 1 \\
-              1 & i
-            \end{array}\right),
-        \quad\text{weil}~
-        \left(\begin{array}{cc}
-          i & 1 \\
-          1 & i
-        \end{array}\right)
-        \left(\begin{array}{cc}
-          i & 1 \\
-          1 & i
-        \end{array}\right)
-        =
-        \left(\begin{array}{cc}
-          0 & 2i \\
-          2i & 0
-        \end{array}\right)
-      \end{displaymath}
-      \begin{center}
-        \bigskip
-        \makebox(0,0){$\sqrt{\text{\rm NOT}}$}\quad\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad
-        \makebox(0,0){=}\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-wurzel-not.png}}
-        \qquad\qquad
-        \makebox(0,0){$\sqrt{\text{\rm NOT}}$}\quad\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-wurzel-not.png}}\qquad
-        \makebox(0,0){=}\qquad
-        \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-not.png}}
-        \bigskip
-      \end{center}
-      \smallskip
-      (Die Information, was wohin wandert, steckt in der komplexen Phase.)
-  \end{itemize}
-
-\end{frame}
-
-\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{3}i$\quad Quantenverschränkung}
-
-\begin{frame}
-
-  \showsubsubsectionnonumber
-
-  2 Qubits: $\left|0_0\right>\!, \left|1_0\right>$
-  und $\left|0_1\right>\!, \left|1_1\right>$
-
-  \medskip
-
-  Wellenfunktion:
-  \begin{math}
-      \psi_{00} \left|0_0\right>
-    + \psi_{10} \left|1_0\right>
-    + \psi_{01} \left|0_1\right>
-    + \psi_{11} \left|1_1\right>
-  \end{math}
-
-  \pause
-
-  \begin{picture}(0,0)
-    \put(2.5,0.2){\makebox(0,0)[bl]{\tikz{\draw[line width=1pt,red](0,0)--(5.8,0.6);}}}
-    \put(2.5,0.2){\makebox(0,0)[bl]{\tikz{\draw[line width=1pt,red](0,0.6)--(5.8,0);}}}
-  \end{picture}
-
-  \vspace*{-1.7\medskipamount}
-
-  \begin{itemize}
-
-    \arrowitem
-      \begin{math}
-          \psi_{00} \left|00\right>
-        + \psi_{01} \left|01\right>
-        + \psi_{10} \left|10\right>
-        + \psi_{11} \left|11\right>
-      \end{math}
-
-      \smallskip
-
-      Das hinzugekommene Qubit (Nr.~1) \\
-      kann die Basiszustände des ersten Qubits (Nr.~0) mitbenutzen.
-
-      \begin{onlyenv}<2>
-        \begin{center}
-          \bigskip
-          \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad
-          \makebox(0,0){\includegraphics[height=1cm]{ampel-blau-gelb.png}}
-          \hspace{3.0cm}
-          \makebox(0,0){können sich vermischen, z.\,B.\ zu}
-          \hspace{3.0cm}
-          \makebox(0,0){\includegraphics[height=1cm]{ampel-rot-gelb-blau.png}}\qquad
-          \makebox(0,0){\includegraphics[height=1cm]{ampel-rot-gruen-blau.png}}
-          \bigskip
-        \end{center}
-        \vspace*{-3.05\bigskipamount}
-      \end{onlyenv}
-
-    \pause
-    \medskip
-    \arrowitem
-      Mit jedem hinzukommenden Qubit\\
-      verdoppelt sich die Anzahl der Basiszustände.
-
-      \smallskip
-
-      Beispiel: Ein "`Quanten-Byte"' (8 Qubits) hat 256 Basiszustände:
-      \begin{displaymath}
-        \left|00000000\right>\!,~
-        \left|00000001\right>\!,~
-        \left|00000010\right>\!, \dots
-        \left|11111111\right>\!
-      \end{displaymath}
-      Der Gesamtzustand eines Quanten-Bytes entspricht\\
-      $2^8 = 256$ komplexen Zahlen:
-      $\psi_{00000000}$ bis $\psi_{11111111}$
-
-      \pause
-      \smallskip
-
-      Der Gesamtzustand eines 64-Bit-Quanten-Registers entspricht\\
-      $2^{64} = 18\,446\,744\,073\,709\,551\,616$ komplexen Zahlen.
-
-    \medskip
-    \arrowitem
-      Es ist schon aus Speicherplatzgründen nicht möglich,
-      auf einem klassischen Computer effizient mit Qubits zu rechnen.
-
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsubsectionnonumber
-
-  \begin{itemize}
-    \item
-      $\text{\rm CNOT}$ ("`Controlled NOT"')
-      -- eine Art \lstinline{if}-Anweisung auf 2 Qubits
-
-      \medskip
-
-      \begin{lstlisting}[gobble=8]
-        if (q0)
-          q1 = ~q1;
-      \end{lstlisting}
-
-      \vspace{-2\medskipamount}
-
-      \begin{displaymath}
-        \text{\rm CNOT}
-        \left(\begin{array}{c}
-          \psi_{00} \\
-          \psi_{01} \\
-          \psi_{10} \\
-          \psi_{11}
-        \end{array}\right)
-        =
-        \left(\begin{array}{c}
-          \psi_{00} \\
-          \psi_{01} \\
-          \psi_{11} \\
-          \psi_{10}
-        \end{array}\right)
-        =
-        \left(\begin{array}{cccc}
-          1 & 0 & 0 & 0 \\
-          0 & 1 & 0 & 0 \\
-          0 & 0 & 0 & 1 \\
-          0 & 0 & 1 & 0
-        \end{array}\right)
-        \left(\begin{array}{c}
-          \psi_{00} \\
-          \psi_{01} \\
-          \psi_{10} \\
-          \psi_{11}
-        \end{array}\right)
-      \end{displaymath}
-
-      \pause
-
-      \begin{picture}(0,0)
-        \color{red}
-        \put(2.6,1.9){\makebox(0,0)[br]{\tikz{\draw[latex-,red](0.2,0)--(0.0,0.8);}}}
-        \put(2.3,2.75){\makebox(0,0)[b]{\footnotesize q0}}
-        \put(2.7,1.9){\makebox(0,0)[bl]{\tikz{\draw[latex-,red](0.0,0)--(0.2,0.8);}}}
-        \put(3.0,2.75){\makebox(0,0)[b]{\footnotesize q1}}
-        \put(6.55,1.67){\makebox(0,0){\tikz{\draw(0,0)circle(0.5);}}}
-        \put(6.55,2.20){\makebox(0,0)[b]{\footnotesize else-Zweig}}
-        \put(7.60,0.82){\makebox(0,0){\tikz{\draw(0,0)circle(0.5);}}}
-        \put(7.60,0.22){\makebox(0,0)[t]{\footnotesize if-Zweig}}
-      \end{picture}
-
-      \pause
-      \medskip
-
-      Dies funktioniert auch dann,
-      wenn die "`\lstinline{if}-Bedingung"' \lstinline{q0}\\
-      weder $\left|0\right>$ ("`false"') noch $\left|1\right>$ ("`true"') ist,
-      sondern eine Mischung.
-
-      \smallskip
-
-      Der \lstinline{if}-Zweig und der \lstinline{else}-Zweig
-      werden dann gleichzeitig ausgeführt.\\
-      ("`Mischung"' heißt also nicht "`vielleicht"', sondern "`beides"').
-
-    \pause
-    \bigskip
-    \arrowitem
-      Damit können wir nun alles berechnen, was wir wollen.\\
-      ($\text{\rm CNOT}$ zusammen mit den 1-Bit-Operationen ist "`universell"'.)
-
-  \end{itemize}
-
-\end{frame}
-
-\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{4}i$\quad Der Shor-Algorithmus}
-
-\begin{frame}
-
-  \showsubsubsectionnonumber
-
-  \begin{itemize}
-    \item
-      Ziel: Zerlegung einer Zahl $n = p \cdot q$ in ihre Faktoren
-    \item
-      Herangehensweise: 
-      \begin{enumerate}\itemsep0.5\smallskipamount
-        \begin{onlyenv}<1-3>
-          \item
-            Wähle $x$ mit $1 < x < n$.
-        \end{onlyenv}
-        \item
-          Suche $r$ mit $x^r\,\%\,n = 1$.
-          \only<2->{\quad\textbf{\boldmath $\longleftarrow$ mit Quantencomputer}}
-        \begin{onlyenv}<1-3>
-          \item
-            Wenn $r$ ungerade oder wenn $x^{\frac{r}{2}}\,\%\,n = n - 1$,
-            verwirf dieses $x$.\\
-            Neuer Versuch.
-          \item
-            Ansonsten ist der größte gemeinsame Teiler von $x^{\frac{r}{2}}$ und $n$\\
-            ein Faktor von $n$.\quad \mbox{:--)}
-        \end{onlyenv}
-      \end{enumerate}
-    \pause
-    \pause
-    \item
-      Algorithmus, um $r$ zu suchen:
-      \begin{enumerate}\itemsep0.5\smallskipamount
-        \begin{onlyenv}<1-4>
-          \item
-            Sei $q$ die nötige Anzahl von Bits, um $n^2$ speichern zu können.
-        \end{onlyenv}
-        \begin{onlyenv}<1-5>
-          \item
-            Lade ein $q$-Qubit-Register mit dem Wert:
-            \begin{displaymath}
-              A :=
-              \underbrace{
-                \frac{\left|0\right> + \left|1\right>}{\sqrt2},
-                \frac{\left|0\right> + \left|1\right>}{\sqrt2},
-                \dots,
-                \frac{\left|0\right> + \left|1\right>}{\sqrt2}
-              }_{\text{\footnotesize $q$ Qubits}}
-            \end{displaymath}
-            \vspace{-\medskipamount}
-        \end{onlyenv}
-        \pause
-        \item
-          Berechne in einem zweiten $q$-Qubit-Register den Wert $x^A\,\%\,n$.\\
-          Damit berechnen wir gewissermaßen gleichzeitig $x^a\,\%\,n$\\
-          für alle Werte, die $a$ annehmen kann ($0$ bis $2^q - 1$).\\
-          Die beiden Register sind nun verschränkt.
-        \pause
-        \item
-          Quanten-Fouriertransformation auf dem ersten Register.\\
-          Wegen der Verschränkung beeinflußt dies auch das zweite Register.
-        \pause
-        \item
-          Messung.\\
-          Alle Qubits müssen sich für $\left|0\right>$ oder $\left|1\right>$ entscheiden.\\
-          Den Meßwert des zweiten Registers nennen wir $r$.\\
-          Es gilt mit hoher Wahrscheinlichkeit: $x^r\,\%\,n = 1$.
-        \item
-          Fertig.\quad \mbox{:--)}
-      \end{enumerate}
-  \end{itemize}
-
-  \vspace*{-5cm}
-
-\end{frame}
-
-\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{5}i$\quad Fazit}
-
-\begin{frame}
-
-  \showsubsectionnonumber
-  \showsubsubsectionnonumber
-
-  \begin{itemize}
-    \item
-      Ein funktionsfähiger Quantencomputer mit mindestens 2048 Qubits\\
-      würde aktuelle Verschlüsselungsverfahren unwirksam machen.
-    \begin{onlyenv}<1>
-      \item
-        Betroffen: 
-        \begin{itemize}\itemsep0.5\smallskipamount
-          \item
-            vertrauliche Kommunikation (z.\,B.\ Online-Banking)
-          \item
-            Fernzugriff auf Rechner, Schutz persönlicher Daten
-          \item
-            digitale Rechtebeschränkung ("`Kopierschutz"')
-          \item
-            digitale Währungen
-          \item
-            \dots
-          \arrowitem
-            Chaos
-        \end{itemize}
-    \end{onlyenv}
-    \only<2->{\item[]\begin{itemize}\arrowitem Chaos\end{itemize}}
-    \pause
-    \item
-      Chaos haben wir bereits.
-      \begin{itemize}\itemsep0.5\smallskipamount
-        \begin{onlyenv}<2>
-          \item
-            Die Allermeisten sind mit persönlichen Daten sehr freigiebig.\\
-            (z.\,B.\ Datenverarbeitung und -speicherung in der Cloud)
-          \item
-            sozialer und politischer Druck \textarrow\ 
-            Sich entziehen wird schwieriger.\\
-            (z.\,B.\ Gesundheitskarte, bargeldlose Geschäfte)
-          \item
-            Daten bei Firmen und Behörden sind leicht angreifbar.
-          \item
-            Politische Maßnahmen bewirken oft ihr Gegenteil.\\
-            (z.\,B.\ DSGVO \textarrow\ mehr Bürokratie \textarrow\ weniger Anbieter)
-          \arrowitem
-            Gegenmaßnahme: Aufklärung\\
-            Bewußtsein für Datenschutz fördern
-        \end{onlyenv}
-        \only<3->{\arrowitem Aufklärung, Bewußtsein für Datenschutz fördern}
-      \end{itemize}
-    \pause
-    \item
-      demnächst in "`Eingebettete Systeme"': Verschlüsselung\\
-      Termin noch wählbar
-  \end{itemize}
-
-  \pause
-
-  \medskip
-  \begin{center}
-    \em Vielen Dank für Ihre Aufmerksamkeit!
-  \end{center}
-
-  \vspace*{-5cm}
-
-\end{frame}
-
-\end{document}
diff --git a/20200102/landau-symbols-2.pdf b/20200102/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20200102/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20200102/landau-symbols-3.pdf b/20200102/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20200102/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20200102/landau-symbols.pdf b/20200102/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20200102/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20200102/logo-hochschule-bochum-cvh-text-v2.pdf b/20200102/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20200102/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20200102/logo-hochschule-bochum.pdf b/20200102/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20200102/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20200102/pgslides.sty b/20200102/pgslides.sty
deleted file mode 100644
index d69e10dae60f46c93203b2489706f16aa5069211..0000000000000000000000000000000000000000
--- a/20200102/pgslides.sty
+++ /dev/null
@@ -1,233 +0,0 @@
-% pgslides.sty - LaTeX Settings for Lecture Slides
-% Copyright (C) 2012, 2013  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-\usepackage{amsfonts}
-\usepackage[british,german]{babel}  % Yes, really "german" and not "ngerman".
-\usepackage[utf8]{luainputenc}  % Without this, umlauts are broken. Weird.
-\usepackage{microtype}
-\usepackage[T1]{fontenc}
-%\usepackage{times}
-\usepackage{helvet}
-\renewcommand*\familydefault{\sfdefault}
-\usepackage{graphicx}
-\usepackage{pstricks}
-
-\hypersetup{colorlinks,allcolors=blue}
-
-%% @@@ Not necessary for slides. Why???
-%% Repair kerning: Automatically insert "\kern{-0.15em}" between "//" % (in URLs).
-%\directlua{
-%  local glyph = node.id ("glyph")
-%  local function my_kerning (head)
-%    for t in node.traverse (head) do
-%      if t.id == glyph and t.char == 47 then
-%        if t.next
-%           and t.next.next
-%           and t.next.next.id == glyph
-%           and t.next.next.char == 47 then
-%          local k = node.new ("kern")
-%          k.kern = tex.sp ("-0.15em")
-%          k.next = t.next
-%          k.prev = t
-%          t.next.prev = k
-%          t.next = k
-%        end
-%      end
-%    end
-%    node.kerning (head)
-%  end
-%  luatexbase.add_to_callback ("kerning", my_kerning, "URL kerning")
-%}
-
-\usetheme{default}
-\usefonttheme{structurebold}
-\setbeamertemplate{navigation symbols}{}
-\setbeamersize{text margin left = 0.3cm, text margin right = 0.2cm}
-\setbeamertemplate{itemize item}{$\bullet$}
-\setbeamertemplate{itemize subitem}{--}
-\setbeamerfont{itemize/enumerate subbody}{size=\normalsize}
-\setbeamerfont{itemize/enumerate subsubbody}{size=\normalsize}
-\setbeamercolor{footline}{fg=gray}
-
-\newcommand{\sep}{~$\cdot$~}
-
-\newif\ifminimalistic
-\minimalistictrue
-
-\institute[Hochschule Bochum\sep CVH]{%
-  \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}%
-}
-
-\setbeamertemplate{headline}{%
-  \leavevmode
-  \hbox to \textwidth{%
-    \ifminimalistic
-      \strut\hfill
-    \else
-      \rule{0pt}{5.7pt}%
-      \hspace*{8.55pt}\insertinstitute\hspace*{5.7pt}%
-      \raisebox{-30pt}{\rule{0pt}{1pt}}%
-    \fi
-  }%
-  \vskip0pt%
-}
-
-\iffalse
-  \setbeamertemplate{footline}{}
-\else
-  \setbeamertemplate{footline}{%
-    \leavevmode
-    \hbox to \textwidth{%
-      \usebeamercolor{footline}%
-      \usebeamerfont{footline}%
-      \ifminimalistic
-        \strut\hfill
-      \else
-        \,\insertshorttitle\sep
-        \insertshortauthor\sep
-        \insertshortinstitute\sep
-        \insertshortdate\hfill
-      \fi
-      \insertframenumber/\inserttotalframenumber
-      %Folie\,\insertframenumber\sep Seite\,\insertpagenumber\,
-    }%
-    \vskip0pt%
-  }
-\fi
-
-\newcommand{\maketitleframe}{%
-  \ifminimalistic
-    \begin{frame}[t,plain]
-      \insertinstitute
-      \par\vfill
-      \begin{center}
-        {\LARGE\color{structure}\inserttitle\par}\bigskip\bigskip
-        {\large \insertauthor\par}\bigskip\medskip
-        \insertdate
-      \end{center}
-    \end{frame}
-  \else
-    \begin{frame}
-      \vfill
-      \begin{center}
-        {\LARGE\color{structure}\inserttitle\par}\bigskip\bigskip
-        {\large \insertauthor\par}\bigskip\medskip
-        \insertdate
-      \end{center}
-      \vfill
-    \end{frame}
-  \fi
-}
-
-\definecolor{medgreen}{rgb}{0.0,0.5,0.0}
-\definecolor{darkgreen}{rgb}{0.0,0.3,0.0}
-\definecolor{lightred}{rgb}{1.0,0.7,0.7}
-\definecolor{medred}{rgb}{0.5,0.0,0.0}
-\definecolor{bored}{rgb}{0.89,0.0,0.098}
-\definecolor{lightgray}{rgb}{0.85,0.85,0.85}
-\definecolor{orange}{rgb}{1.0,0.5,0.0}
-\definecolor{darkgray}{rgb}{0.4,0.4,0.4}
-
-\newenvironment{experts}{\color{darkgray}}{}
-
-\usepackage{listings}
-\lstset{basicstyle=\color{structure},
-        language=C,
-        captionpos=b,
-        gobble=4,
-        columns=fullflexible,
-        aboveskip=0pt,
-        belowskip=0pt,
-        moredelim=**[is][\color{structure}]{¡}{¿},
-        moredelim=**[is][\only<2->{\color{structure}}]{²}{¿},
-        moredelim=**[is][\only<3->{\color{structure}}]{³}{¿},
-        moredelim=**[is][\only<4->{\color{structure}}]{°}{¿},
-        moredelim=**[is][\only<5->{\color{structure}}]{¤}{¿},
-        moredelim=**[is][\only<6->{\color{structure}}]{¢}{¿},
-        moredelim=**[is][\only<7->{\color{structure}}]{æ}{¿},
-        moredelim=**[is][\only<8->{\color{structure}}]{ø}{¿}}
-\lstdefinestyle{terminal}{basicstyle=\ttfamily\color{darkgreen},
-                          language={},
-                          columns=fixed,
-                          moredelim=**[is][\color{red}]{¡}{¿},
-                          moredelim=**[is][\color{blendedblue}]{°}{¿},
-                          moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
-\lstdefinestyle{cmd}{basicstyle=\ttfamily\color{red},
-                     language={},
-                     gobble=2,
-                     columns=fixed,
-                     moredelim=**[is][\color{darkgreen}]{¡}{¿},
-                     moredelim=**[is][\color{structure}]{°}{¿},
-                     moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
-\lstdefinestyle{shy}{basicstyle=\color{lightgray}}
-
-\setcounter{topnumber}{3}
-\renewcommand\topfraction{0.7}
-\setcounter{bottomnumber}{3}
-\renewcommand\bottomfraction{0.7}
-\setcounter{totalnumber}{5}
-\renewcommand\textfraction{0.1}
-\renewcommand\floatpagefraction{0.9}
-
-\setlength{\unitlength}{1cm}
-
-\newcommand{\protectfile}[1]{#1}
-\urlstyle{sf}
-\newcommand{\file}[1]{{\color{structure}\protectfile{#1}}}
-\newcommand{\textarrow}{{\boldmath $\longrightarrow$}}
-\newcommand{\arrowitem}{\item[\textarrow]}
-\newcommand{\newterm}[1]{\emph{\color{darkgreen}#1}}
-\newcommand{\BIGskip}{\vspace{1cm}}
-\newcommand{\shy}{\color{lightgray}}
-\newcommand{\hot}{\color{red}}
-\newcommand{\shyhot}{\color{lightred}}
-
-\newcommand{\sectionnonumber}[1]{\section{#1}\addtocounter{section}{-1}}
-
-\def\showsectionnonumber{\hbox{\Large\color{structure}\bf
-                               \vtop{\secname}\par}\bigskip}
-
-\newcommand{\nosectionnonumber}[1]{\gdef\nosectionnonumbername{#1}}
-
-\def\shownosectionnonumber{\hbox{\Large\color{structure}\bf
-                                 \vtop{\nosectionnonumbername}\par}\bigskip}
-
-\def\showsection{\hbox{\Large\color{structure}\bf
-                       \vtop{\hbox{\arabic{section}}}\kern1em%
-                       \vtop{\secname}\par}\bigskip}
-
-\newcommand{\subsectionnonumber}[1]{\subsection{#1}\addtocounter{subsection}{-1}}
-
-\def\showsubsectionnonumber{{\large\color{structure}\bf\subsecname\par}\bigskip}
-
-\def\showsubsection{\hbox{\large\color{structure}\bf
-                          \vtop{\hbox{\arabic{section}.\arabic{subsection}}}\kern1em%
-                          \vtop{\subsecname}\par}\bigskip}
-
-\newcommand{\subsubsectionnonumber}[1]{\subsubsection{#1}\addtocounter{subsubsection}{-1}}
-
-\def\showsubsubsectionnonumber{{\normalsize\color{structure}\bf\subsubsecname\par}\bigskip}
-
-\def\showsubsubsection{\hbox{\normalsize\color{structure}\bf
-                             \vtop{\hbox{\arabic{section}.\arabic{subsection}.\arabic{subsubsection}}}\kern1em%
-                             \vtop{\subsubsecname}\par}\bigskip}
diff --git a/20200102/photo-20200102-174206.jpg b/20200102/photo-20200102-174206.jpg
deleted file mode 100644
index f5621a9ff962ef43971494c7c8d32426ba35f067..0000000000000000000000000000000000000000
Binary files a/20200102/photo-20200102-174206.jpg and /dev/null differ
diff --git a/20200102/photo-20200102-174206.txt b/20200102/photo-20200102-174206.txt
deleted file mode 100644
index 864ba60d28c9aed77d5cf9611af02a5963cd66d1..0000000000000000000000000000000000000000
--- a/20200102/photo-20200102-174206.txt
+++ /dev/null
@@ -1 +0,0 @@
-README: Quantencomputer: physikalische Realisierung von Qubits
diff --git a/20200109/Tower_of_Hanoi.jpeg b/20200109/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/20200109/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/20200109/aufgabe-1.c b/20200109/aufgabe-1.c
deleted file mode 100644
index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000
--- a/20200109/aufgabe-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef struct
-{
-  uint32_t a;
-  uint64_t b;
-  uint8_t c;
-} three_numbers;
-
-int main (void)
-{
-  three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-  printf ("%s\n", &xyz);
-  return 0;
-}
diff --git a/20200109/aufgabe-2.c b/20200109/aufgabe-2.c
deleted file mode 100644
index 33dbe39325bbfe9bf2481194b0be3420f1e3344e..0000000000000000000000000000000000000000
--- a/20200109/aufgabe-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void output (uint16_t *a)
-{
-  for (int i = 0; a[i]; i++)
-    printf (" %d", a[i]);
-  printf ("\n");
-}
-
-int main (void)
-{
-  uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
-
-  uint16_t *p1 = prime_numbers;
-  output (p1);
-  p1++;
-  output (p1);
-
-  char *p2 = prime_numbers;
-  output (p2);
-  p2++;
-  output (p2);
-
-  return 0;
-}
diff --git a/20200109/aufgabe-3.c b/20200109/aufgabe-3.c
deleted file mode 100644
index 47595ef0658e94d76a42263e82200f94895cdeea..0000000000000000000000000000000000000000
--- a/20200109/aufgabe-3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-typedef struct
-{
-  char first_name[10];
-  char family_name[20];
-  char day, month;
-  int year;
-} person;
-
-int main (void)
-{
-  person sls;
-  sls.day = 26;
-  sls.month = 7;
-  sls.year = 1951;
-  strcpy (sls.first_name, "Sabine");
-  strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
-  printf ("%s %s wurde am %d.%d.%d geboren.\n",
-          sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-  return 0;
-}
diff --git a/20200109/bsort-1.c b/20200109/bsort-1.c
deleted file mode 100644
index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000
--- a/20200109/bsort-1.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i - 1, i) > 0)
-      {
-        char *temp = name[i - 1];
-        name[i - 1] = name[i];
-        name[i] = temp;
-      }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/bsort-1a.c b/20200109/bsort-1a.c
deleted file mode 100644
index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000
--- a/20200109/bsort-1a.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i - 1, i) > 0)
-      {
-        char *temp = name[i - 1];
-        name[i - 1] = name[i];
-        name[i] = temp;
-      }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/bsort-2.c b/20200109/bsort-2.c
deleted file mode 100644
index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000
--- a/20200109/bsort-2.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0)
-    {
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted--;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/bsort-3.c b/20200109/bsort-3.c
deleted file mode 100644
index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000
--- a/20200109/bsort-3.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int done = 0;
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0 && !done)
-    {
-      done = 1;
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            done = 0;
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted--;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/bsort-4.c b/20200109/bsort-4.c
deleted file mode 100644
index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000
--- a/20200109/bsort-4.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0)
-    {
-      int new_sorted = 0;
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            new_sorted = i;
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted = new_sorted;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/hanoi-0.c b/20200109/hanoi-0.c
deleted file mode 100644
index 83b5f081e33e699f2d5eaa1f858320530e1b2820..0000000000000000000000000000000000000000
--- a/20200109/hanoi-0.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-int main (void)
-{
-  n[0] = 0;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-1.c b/20200109/hanoi-1.c
deleted file mode 100644
index 6d005f0b12afa6086afb65e1794fb5c977b474e2..0000000000000000000000000000000000000000
--- a/20200109/hanoi-1.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-int main (void)
-{
-  n[0] = 4;
-  tower[0][0] = 4;
-  tower[0][1] = 3;
-  tower[0][2] = 2;
-  tower[0][3] = 1;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-2.c b/20200109/hanoi-2.c
deleted file mode 100644
index c928c1130539da08d0882249bdffc877d72289b2..0000000000000000000000000000000000000000
--- a/20200109/hanoi-2.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-3.c b/20200109/hanoi-3.c
deleted file mode 100644
index 4b59c046962c1f79eca315882d93faf6b6c298c1..0000000000000000000000000000000000000000
--- a/20200109/hanoi-3.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  move (2, 0, 1);
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-4.c b/20200109/hanoi-4.c
deleted file mode 100644
index 162a5ba7cccedf64bff8ae9a514aaf146088e3a4..0000000000000000000000000000000000000000
--- a/20200109/hanoi-4.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  move (0, 2, 1);
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-5.c b/20200109/hanoi-5.c
deleted file mode 100644
index e04ad85f63fe92e5c15d22646beb9e9107bf78d6..0000000000000000000000000000000000000000
--- a/20200109/hanoi-5.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      display ();
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, 1);
-  return 0;
-}
diff --git a/20200109/hanoi-6.c b/20200109/hanoi-6.c
deleted file mode 100644
index 1267605f802246e857c32d29cc0a132609cb24ce..0000000000000000000000000000000000000000
--- a/20200109/hanoi-6.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 4
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      display ();
-    }
-  else
-    {
-      int help = 0 + 1 + 2 - from - to;
-      move (from, help, disks - 1);
-      move (from, to, 1);
-      move (help, to, disks - 1);
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, DISKS);
-  return 0;
-}
diff --git a/20200109/hanoi-7.c b/20200109/hanoi-7.c
deleted file mode 100644
index f71fcdc0c3f66047ee3ad870d019a06eb328050f..0000000000000000000000000000000000000000
--- a/20200109/hanoi-7.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 5
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      display ();
-    }
-  else
-    {
-      int help = 0 + 1 + 2 - from - to;
-      move (from, help, disks - 1);
-      move (from, to, 1);
-      move (help, to, disks - 1);
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, DISKS);
-  return 0;
-}
diff --git a/20200109/hanoi-8.c b/20200109/hanoi-8.c
deleted file mode 100644
index 6d804063531d424a82924a89d85424c33994793b..0000000000000000000000000000000000000000
--- a/20200109/hanoi-8.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 64
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      display ();
-    }
-  else
-    {
-      int help = 0 + 1 + 2 - from - to;
-      move (from, help, disks - 1);
-      move (from, to, 1);
-      move (help, to, disks - 1);
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, DISKS);
-  return 0;
-}
diff --git a/20200109/hanoi-9.c b/20200109/hanoi-9.c
deleted file mode 100644
index 7694b373b7011e96f6be0ad0f00ba54b67086158..0000000000000000000000000000000000000000
--- a/20200109/hanoi-9.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 64
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      static int counter = 1;
-      if (counter++ >= 100000000)
-        {
-          display ();
-          counter = 1;
-        }
-    }
-  else
-    {
-      int help = 0 + 1 + 2 - from - to;
-      move (from, help, disks - 1);
-      move (from, to, 1);
-      move (help, to, disks - 1);
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, DISKS);
-  display ();
-  return 0;
-}
diff --git a/20200109/hanoi-9a.c b/20200109/hanoi-9a.c
deleted file mode 100644
index 55e8d74db6d7284d6db225a6f8f3e08ab4efdc06..0000000000000000000000000000000000000000
--- a/20200109/hanoi-9a.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <error.h>
-
-#define DISKS 32
-
-int n[3], tower[3][DISKS];
-
-void display (void)
-{
-  printf ("\n");
-  for (int i = 0; i < 3; i++)
-    {
-      printf ("tower %d:", i);
-      for (int j = 0; j < n[i]; j++)
-        printf (" %d", tower[i][j]);
-      printf ("\n");
-    }
-}
-
-void move (int from, int to, int disks)
-{
-  if (disks == 1)
-    {
-      if (n[from] <= 0)
-        error (1, 0, "trying to move disk from empty tower");
-      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
-        error (1, 0, "trying to move larger disk on smaller one");
-      tower[to][n[to]] = tower[from][n[from] - 1];
-      n[to]++;
-      n[from]--;
-      static int counter = 1;
-      if (counter++ >= 100000000)
-        {
-          display ();
-          counter = 1;
-        }
-    }
-  else
-    {
-      int help = 0 + 1 + 2 - from - to;
-      move (from, help, disks - 1);
-      move (from, to, 1);
-      move (help, to, disks - 1);
-    }
-}
-
-int main (void)
-{
-  n[0] = DISKS;
-  for (int i = 0; i < DISKS; i++)
-    tower[0][i] = DISKS - i;
-  n[1] = 0;
-  n[2] = 0;
-  display ();
-  move (0, 2, DISKS);
-  display ();
-  return 0;
-}
diff --git a/20200109/hello-gtk.png b/20200109/hello-gtk.png
deleted file mode 120000
index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000
--- a/20200109/hello-gtk.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/hello-gtk.png
\ No newline at end of file
diff --git a/20200109/hp-2019ws-p4.pdf b/20200109/hp-2019ws-p4.pdf
deleted file mode 100644
index 12d85b607400d6e182675fc0f82e78202dc118f5..0000000000000000000000000000000000000000
Binary files a/20200109/hp-2019ws-p4.pdf and /dev/null differ
diff --git a/20200109/hp-2019ws-p4.tex b/20200109/hp-2019ws-p4.tex
deleted file mode 100644
index 0091478169680e3c97a7d149a80ef7064f6ae9ab..0000000000000000000000000000000000000000
--- a/20200109/hp-2019ws-p4.tex
+++ /dev/null
@@ -1,193 +0,0 @@
-% hp-2019ws-p4.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2016, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Versuch 4, 16. und 23.1.2020: Objektorientiertes Grafik-Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{multicol}
-\usepackage{amsmath}
-\usepackage{sfmath}
-
-\sloppy
-%\pagestyle{empty}
-\newcommand{\sep}{~$\cdot$~}
-\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
-
-\begin{document}
-
-  \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
-  \par\bigskip\bigskip
-  \begin{center}
-    \Large\textbf{Praktikumsversuch 4: Objektorientiertes Grafik-Programm}
-    \par\medskip
-    \normalsize Hardwarenahe Programmierung\sep
-    Wintersemester 2019/20\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Schreiben Sie ein GTK+-Programm,
-  mit dem man verschiedene Objekte (z.\,B.\ Rechtecke, Kreise, Dreiecke)
-  in eine Grafik einfügen und nachträglich verändern kann
-  (z.\,B.\ Position, Größe, Farbe).
-
-  (Beispiel: Ich füge zunächst zwei Rechtecke und einen Kreis in eine Grafik ein,
-  wähle anschließend das erste Rechteck aus und ändere dessen Farbe.)
-
-  \bigskip
-
-  Hinweise:
-  \vspace*{-\medskipamount}
-
-  \begin{itemize}
-    \item
-      Das Beispielprogramm \gitfile{hp}{20200109}{objects-5.c} zeigt,
-      wie man in C verschiedenartige Objekte
-      in einem Array von Zeigern verwaltet.
-    \item
-      Das Beispielprogramm \gitfile{hp}{20191205}{gtk-6.c} zeigt,
-      wie man mit Hilfe der GUI-Bibliothek GTK+
-      verschiedene Objekte in ein Fenster zeichnet.
-    \item
-      Das Beispielprogramm \gitfile{hp}{20191205}{gtk-7.c} zeigt,
-      wie man in der GUI-Bibliothek GTK+
-      Tastatur- und Maus-Eingaben entgegennimmt und verarbeitet.
-    \item
-      Das Auswählen eines bereits vorhandenen Objekts geht am einfachsten
-      mittels Tastatur-Eingaben (z.\,B.\ Ziffer 1 für das erste Objekt usw.).
-      Auswahl mit der Maus ist auch möglich, aber schwieriger.
-    \item
-      Mit Hilfe der Funktion \lstinline{gtk_widget_queue_draw()}
-      teilen Sie GTK+ mit, daß Sie ein \lstinline{GtkWidget}
-      neu zeichnen lassen möchten.
-    \item
-      Das Compilieren eines GTK+-Programms
-      (z.\,B.\ \gitfile{hp}{20190114}{gtk-7.c}) geschieht wie folgt:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        gcc $(pkg-config --cflags gtk+-3.0) -Wall -O gtk-7.c \
-            $(pkg-config --libs gtk+-3.0) -o gtk-7
-      \end{lstlisting}
-      (Den Backslash am Ende der ersten Zeile entfällt,
-      wenn Sie den ganzen Befehl in eine einzige Zeile schreiben.)
-  \end{itemize}
-
-  \bigskip
-  \textbf{GTK+ unter GNU/Linux}
-  \begin{itemize}
-    \item
-      Installieren Sie das Entwickler-Paket für GTK+-3,\\
-      z.\,B.\ unter Debian GNU/Linux und darauf basierenden Systemen:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        apt-get install libgtk-3-dev
-      \end{lstlisting}
-  \end{itemize}
-
-  \bigskip
-  \goodbreak
-  \textbf{GTK+ unter MacOS X}
-  \begin{itemize}
-    \item
-      Zuerst den Paketmanager "`Homebrew"' installieren:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        ruby -e "$(curl -fsSL https://raw.githubusercontent.com/
-                              Homebrew/install/master/install)"
-      \end{lstlisting}
-      (Die URL nicht trennen, sondern in einer Zeile schreiben.)
-    \item
-      Danach mit Hilfe von \lstinline[style=cmd]{brew} GTK+ installieren:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        brew install gtk+3
-      \end{lstlisting}
-  \end{itemize}
-
-  \bigskip
-  \goodbreak
-  \textbf{GTK+ unter Microsoft Windows: Cygwin}
-  \begin{itemize}
-    \item
-      Im Cygwin-Setup-Programm die Pakete \file{libgtk3-devel},
-      \file{xorg-server} und \file{dbus-x11} installieren.
-    \item
-      Bevor Sie GTK+-Programme starten können,
-      müssen Sie einmalig den X-Server starten:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        XWin -multiwindow &
-      \end{lstlisting}
-    \item
-      Bevor Sie GTK+-Programme starten können,
-      müssen Sie einmalig pro Shell-Sitzung\\
-      die \lstinline[style=cmd]{DISPLAY}-Variable setzen:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        export DISPLAY=:0.0
-      \end{lstlisting}
-  \end{itemize}
-
-  \bigskip
-  \goodbreak
-  \textbf{GTK+ unter Microsoft Windows: MinGW}
-  \begin{itemize}
-    \item
-      Installieren Sie \file{MSYS2} (Installer).
-    \item
-      Installieren Sie von der MinGW-Shell aus GTK+
-      und weitere Entwicklungswerkzeuge:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        pacman -S mingw-w64-x86_64-gcc
-        pacman -S mingw-w64-x86_64-gtk3
-        pacman -S mingw-w64-x86_64-pkg-config
-      \end{lstlisting}
-    \item
-      Falls nötig, ergänzen Sie in der MinGW-Shell
-      den Pfad zu den neu installierten Programmen:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        export PATH=$PATH:/mingw64/bin
-      \end{lstlisting}
-  \end{itemize}
-
-  \bigskip
-
-  \strut\hfill\emph{Viel Erfolg!}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 9.\ Januar 2020
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2018, 2019, 2020\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können diese Praktikumsunterlagen einschließlich Quelltext
-%    und Beispielprogramme\\
-    herunterladen unter:\\
-    \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-
-  \endgroup
-
-\end{document}
diff --git a/20200109/hp-20200109.pdf b/20200109/hp-20200109.pdf
deleted file mode 100644
index f85a40fc9c6567ec45374e947082fd739d37d011..0000000000000000000000000000000000000000
Binary files a/20200109/hp-20200109.pdf and /dev/null differ
diff --git a/20200109/hp-20200109.tex b/20200109/hp-20200109.tex
deleted file mode 100644
index 999bf9ef028b1041627dc22860e41e1e6b5f74f4..0000000000000000000000000000000000000000
--- a/20200109/hp-20200109.tex
+++ /dev/null
@@ -1,1265 +0,0 @@
-% hp-20200109.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{tikz}
-\usepackage{rotating}
-
-\usefonttheme[onlymath]{serif}
-
-\definecolor{medcyan}{rgb}{0.0,0.5,0.7}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{9.\ Januar 2020}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \vspace*{-0.1cm}
-        \item[\dots]
-%        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \item[4.6] Byte-Reihenfolge -- Endianness
-        \color{medgreen}
-        \item[4.7] Binärdarstellung negativer Zahlen
-        \item[4.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \color{medcyan}
-        \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer
-        \vspace*{1pt}
-        \color{red}
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-%        \vspace*{-0.1cm}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{3}
-\section{Hardwarenahe Programmierung}
-\setcounter{subsection}{5}
-\subsection{Byte-Reihenfolge -- Endianness}
-\subsubsection{Konzept}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-%  \pause
-  \bigskip
-
-  $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$
-
-%  \pause
-  \bigskip
-  Speicherzellen:
-
-  \medskip
-  \begin{tabular}{|c|c|l}\cline{1-2}
-    \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & für Menschen leichter lesbar \\
-    \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
-    \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & bei Additionen effizienter
-  \end{tabular}
-
-%  \pause
-  \medskip
-  \textarrow\ Geschmackssache
-%  \pause\\
-  \quad\textbf{\dots\ außer bei Datenaustausch!}
-
-%  \pause
-%  \bigskip
-%
-%  Aber: nicht verwechseln! \qquad $0304_{16} = 772$
-
-\end{frame}
-
-\iffalse
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \medskip
-
-  \textarrow\ Geschmackssache\\
-  \textbf{\dots\ außer bei Datenaustausch!}
-
-  \begin{itemize}
-    \item
-      Dateiformate
-    \item
-      Datenübertragung
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Dateiformate}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen
-  \begin{itemize}
-    \item
-      RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
-    \item
-      Au-Dateien (\file{.au}): Big-Endian
-%    \pause
-    \item
-      ältere AIFF-Dateien (\file{.aiff}): Big-Endian
-    \item
-      neuere AIFF-Dateien (\file{.aiff}): Little-Endian
-  \end{itemize}
-
-%  \pause
-  \bigskip
-
-  Grafik-Formate: Reihenfolge der Bits in den Bytes
-  \begin{itemize}
-    \item
-      PBM-Dateien: Big-Endian\only<1->{, MSB first}
-    \item
-      XBM-Dateien: Little-Endian\only<1->{, LSB first}
-  \end{itemize}
-  \only<1->{MSB/LSB = most/least significant bit}
-
-\end{frame}
-
-\subsubsection{Datenübertragung}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  \begin{itemize}
-    \item
-      RS-232 (serielle Schnittstelle): LSB first
-    \item
-      I$^2$C: MSB first
-    \item
-      USB: beides
-%    \pause
-    \medskip
-    \item
-      Ethernet: LSB first
-    \item
-      TCP/IP (Internet): Big-Endian
-  \end{itemize}
-
-\end{frame}
-
-\fi
-
-\subsection{Binärdarstellung negativer Zahlen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\
-%  \pause
-  \textarrow\ 255 + 1 = 0
-
-%  \pause
-  \medskip
-
-  8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\
-  \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\
-%  \pause
-  \textarrow\ Zweierkomplement
-
-%  \pause
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 127 + 1 = $-128$
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  16-Bit-Zahlen ohne Vorzeichen:
-  \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff}
-  = 0 bis 65535\hfill 0 bis 255\\
-  \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0
-
-  \medskip
-
-  16-Bit-Zahlen mit Vorzeichen:
-  \lstinline{int16_t}\hfill\lstinline{int8_t}\\
-  \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill
-  \lstinline{0xff} = 255 = $-1$\\
-  \textarrow\ Zweierkomplement
-
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 32767 + 1 = $-32768$
-
-  \bigskip
-  Literatur: \url{http://xkcd.com/571/}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Frage: \emph{Für welche Zahl steht der Speicherinhalt\,
-  \raisebox{2pt}{%
-    \tabcolsep0.25em
-    \begin{tabular}{|c|c|}\hline
-      \rule{0pt}{11pt}a3 & 90 \\\hline
-    \end{tabular}}
-  (hexadezimal)?}
-  
-%  \pause
-  \smallskip
-  Antwort: \emph{Das kommt darauf an.} ;--)
-
-%  \pause
-  \medskip
-  Little-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,: & $-28509$\\
-    als \lstinline,uint16_t,: & $37027$\\
-    \lstinline,int32_t, oder größer: & $37027$
-      & (zusätzliche Bytes mit Nullen aufgefüllt)
-  \end{tabular}
-
-%  \pause
-  \medskip
-  Big-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,:   & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,:  & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,:  & $-23664$\\
-    als \lstinline,uint16_t,: & $41872$\\
-    als \lstinline,int32_t,:  & $-1550843904$ & (zusätzliche Bytes\\
-    als \lstinline,uint32_t,: & $2744123392$  & mit Nullen aufgefüllt)\\
-    als \lstinline,int64_t,:  & $-6660823848880963584$\\
-    als \lstinline,uint64_t,: & $11785920224828588032$\\
-  \end{tabular}
-
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Speicherausrichtung -- Alignment}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdint.h>
-
-    uint8_t a;
-    uint16_t b;
-    uint8_t c;
-  \end{lstlisting}
-
-%  \pause
-  \bigskip
-
-  Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"'
-  \begin{itemize}
-    \item
-      2-Byte-Operation: effizienter
-%    \pause
-    \item
-      \dots\ oder sogar nur dann erlaubt
-%    \pause
-    \arrowitem
-      Compiler optimiert Speicherausrichtung
-  \end{itemize}
-
-  \medskip
-
-%  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t dummy;
-      uint16_t b;
-      uint8_t c;¿
-    \end{lstlisting}
-  \end{minipage}
-%  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t c;
-      uint16_t b;¿
-    \end{lstlisting}
-  \end{minipage}
-
-%  \pause
-  \vspace{-1.75cm}
-  \strut\hfill
-  \begin{minipage}{6.5cm}
-    Fazit:
-    \begin{itemize}
-      \item
-        \textbf{Adressen von Variablen\\
-        sind systemabhängig}
-      \item
-        Bei Definition von Datenformaten\\
-        Alignment beachten \textarrow\ effizienter
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\section{Algorithmen}
-\setcounter{subsection}{1}
-\subsection{Rekursion}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Vollständige Induktion:
-  \vspace*{-0.725cm}
-  \begin{displaymath}
-    \hspace*{4cm}
-    \left.
-      \begin{array}{r}
-        \mbox{Aussage gilt für $n = 1$}\\[2pt]
-        \mbox{Schluß von $n - 1$ auf $n$}
-      \end{array}
-    \right\}
-    \mbox{Aussage gilt für alle $n\in\mathbb{N}$}
-  \end{displaymath}
-  \vspace*{-0.5cm}
-
-  \pause
-
-  Türme von Hanoi
-
-  \begin{onlyenv}<2>
-    \begin{center}
-      \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg}
-    \end{center}
-  \end{onlyenv}
-
-  \begin{onlyenv}<3->
-    \begin{itemize}
-      \item
-        64 Scheiben, 3 Plätze,
-        \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\
-        immer 1 Scheibe verschieben
-      \item
-        Ziel: Turm verschieben
-      \item
-        Es dürfen nur kleinere Scheiben\\
-        auf größeren liegen.
-      \bigskip
-      \pause
-      \pause
-      \item
-        $n = 1$ Scheibe: fertig
-      \item
-        Wenn $n - 1$ Scheiben verschiebbar:\\
-        schiebe $n - 1$ Scheiben auf Hilfsplatz,\\
-        verschiebe die darunterliegende,\\
-        hole $n - 1$ Scheiben von Hilfsplatz
-    \end{itemize}
-    \begin{onlyenv}<5>
-      \vspace{-4.3cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=6.4cm]
-        void move (int from, int to, int disks)
-        {
-          if (disks == 1)
-            move_one_disk (from, to);
-          else
-            {
-              int help = 0 + 1 + 2 - from - to;
-              move (from, help, disks - 1);
-              move (from, to, 1);
-              move (help, to, disks - 1);
-            }
-        }
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<6->
-      \vspace{-5.0cm}
-      \hspace*{7.4cm}\begin{minipage}[t]{5cm}
-        32 Scheiben:
-        \begin{lstlisting}[gobble=10,style=terminal]
-          $ ¡time ./hanoi-9a¿
-          ...
-          real    0m32,712s
-          user    0m32,708s
-          sys     0m0,000s
-        \end{lstlisting}
-        \pause[7]
-        \begin{itemize}
-          \arrowitem
-            etwas über 1 Minute\\
-            für 64 Scheiben
-        \end{itemize}
-        \pause
-        \vspace*{-0.5cm}
-        \begin{picture}(0,0)
-          \color{red}
-          \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}}
-          \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}}
-        \end{picture}
-
-        Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-        % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-        \begin{itemize}
-          \arrowitem
-            $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-            Jahre\\[\smallskipamount]
-            für 64 Scheiben
-        \end{itemize}
-      \end{minipage}
-    \end{onlyenv}
-  \end{onlyenv}
-
-\end{frame}
-
-\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse}
-
-\begin{frame}[fragile]
-
-%  \newcommand{\w}{\hspace*{0.75pt}}
-
-  \showsubsection
-
-  \begin{picture}(0,0)
-    \put(7.6,-0.5){%
-      \begin{minipage}[t]{5.3cm}
-%        \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf}
-        \vspace*{-1.0cm}\alt<6->{\includegraphics{landau-symbols-3.pdf}}%
-                       {\alt<5->{\includegraphics{landau-symbols-2.pdf}}%
-                                {\includegraphics{landau-symbols.pdf}}}
-        \small
-        \begin{description}\itemsep0pt\leftskip-0.5cm
-          \item[$n$:] Eingabedaten
-          \item[$g(n)$:] Rechenzeit
-        \end{description}
-      \end{minipage}}
-  \end{picture}
-
-  \vspace*{-\bigskipamount}
-
-  Wann ist ein Programm "`schnell"'?
-
-  \medskip
-
-  \begin{onlyenv}<1-2>
-      Türme von Hanoi: $\mathcal{O}(2^n)$
-      \par\medskip
-      Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-      % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-      \begin{itemize}
-        \arrowitem
-          $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-          Jahre\\[\smallskipamount]
-          für 64 Scheiben
-      \end{itemize}
-
-      \bigskip
-  \end{onlyenv}
-
-  \begin{onlyenv}<2->
-    Faustregel:\\Schachtelung der Schleifen zählen\\
-    $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$
-
-    \bigskip
-  \end{onlyenv}
-
-  \begin{onlyenv}<3>
-    \textbf{Beispiel: Sortieralgorithmen}
-
-    \smallskip
-
-    Anzahl der Vergleiche bei $n$ Strings
-    \begin{itemize}
-      \item
-        Maximum suchen mit Schummeln: $\mathcal{O}(1)$
-      \item
-        Maximum suchen: $\mathcal{O}(n)$
-      \item
-        Selection-Sort: $\mathcal{O}(n^2)$
-      \item
-        Bubble-Sort: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$
-      \item
-        Quicksort: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$
-    \end{itemize}
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<4>
-    \textbf{Wie schnell ist RSA-Verschlüsselung?}
-
-    \smallskip
-
-    \begin{math}
-      c = m^e\,\%\,N
-    \end{math}
-    \quad
-    ("`$\%$"' = "`modulo"')
-
-    \medskip
-
-    \begin{lstlisting}[gobble=6,xleftmargin=2em]
-      int c = 1;
-      for (int i = 0; i < e; i++)
-        c = (c * m) % N;
-    \end{lstlisting}
-
-    \smallskip
-
-    \begin{itemize}
-      \item
-        $\mathcal{O}(e)$ Iterationen
-%      \item
-%        wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist:
-%        $\mathcal{O}(2^n)$ Iterationen
-      \item
-        mit Trick:
-        $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$)
-    \end{itemize}
-
-    \smallskip
-
-    Jede Iteration enthält eine Multiplikation und eine Division.\\
-    Aufwand dafür: $\mathcal{O}(\log e)$\\
-    \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<5->
-
-    \textbf{Wie schnell ist RSA?}\\
-
-    \smallskip
-
-    ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$)
-
-    \begin{itemize}
-      \item
-        Ver- und Entschlüsselung (Exponentiation):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}}
-      \item
-        Schlüsselerzeugung (Berechnung von $d$):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}}
-      \item
-        Verschlüsselung brechen (Primfaktorzerlegung):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}}
-    \end{itemize}
-
-    \vspace{0cm plus 1filll}
-
-    \textbf{Die Sicherheit von RSA beruht darauf,
-    daß das Brechen der Verschlüsselung aufwendiger ist als
-    \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).}
-
-    \vspace*{0.65cm}
-
-  \end{onlyenv}
-
-\end{frame}
-
-\section{Objektorientierte Programmierung}
-
-\iffalse
-
-\addtocounter{subsection}{-1}
-\subsection{Dynamische Speicherverwaltung}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-    \item
-      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-  \end{itemize}
-
-  \bigskip
-
-  \begin{lstlisting}
-    char *name[] = { "Anna", "Berthold", "Caesar" };
-
-    ...
-
-     name[3] = "Dieter";
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(0,0){\line(3,1){3.5}}
-    \put(0,1){\line(3,-1){3.5}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdlib.h>
-
-    ...
-
-      char **name = malloc (3 * sizeof (char *));
-        /* Speicherplatz für 3 Zeiger anfordern */
-
-    ...
-
-      free (name)
-        /* Speicherplatz freigeben */
-
-  \end{lstlisting}
-
-\end{frame}
-
-\fi
-
-\subsection{Konzepte und Ziele}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-%      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-      Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen)
-%    \item
-%      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-  \end{itemize}
-  \begin{itemize}
-    \item
-      Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden}
-    \begin{onlyenv}<1>
-      \item
-        Was die Funktion bewirkt,\\
-        hängt vom Typ des Objekts ab
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \item
-        Was die Funktion bewirkt
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(3.75,0.3);}}
-        \end{picture}%
-        Welche Funktion aufgerufen wird,\\
-        hängt vom Typ des Objekts ab: \newterm{virtuelle Methode}
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten%
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(2.5,0.3);}}
-          \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\
-%                           kommt gleich
-                           nächste Woche
-                         \end{rotate}}
-        \end{picture}
-        Zeiger, die im Objekt gespeichert sind\\
-        (Genaugenommen: Tabelle von Zeigern)
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-    \item
-      \newterm{Methoden\/} und \newterm{virtuelle Methoden}
-  \end{itemize}
-
-  \begin{itemize}
-    \item
-      Zeiger auf verschiedene Strukturen\\
-      mit einem gemeinsamen Anteil von Datenfeldern\\
-      \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten
-    \item
-      Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\
-      \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung}
-    \item
-%      Explizite Typumwandlung eines Zeigers auf die Basisklasse\\
-%      in einen Zeiger auf die \newterm{abgeleitete Klasse}\\
-%      \textarrow\ Man kann ein Array unterschiedlicher Objekte\\
-%      \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\
-      Zeiger auf die Basisklasse dürfen auf Objekte\\
-      der \newterm{abgeleiteten Klasse} zeigen\\
-      \textarrow\ \newterm{Polymorphie}
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Beispiel: Zahlen und Buchstaben}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.7cm]
-    \begin{onlyenv}<1>
-      \begin{minipage}{8cm}
-        \begin{lstlisting}[gobble=10]
-          ¡t_integer i = { 1, 42 };
-          t_string s = { 2, "Hello, world!" };
-
-          t_base *object[] = { (t_base *) &i, (t_base *) &s };¿
-        \end{lstlisting}
-      \end{minipage}%
-      \begin{picture}(0,0)
-        \color{red}
-        \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}}
-      \end{picture}
-    \end{onlyenv}
-%    \begin{onlyenv}<2>
-%      \begin{minipage}{5cm}
-%        \begin{lstlisting}[gobble=10]
-%          ¡typedef union
-%          {
-%            t_base base;
-%            t_integer integer;
-%            t_string string;
-%          } t_object;¿
-%        \end{lstlisting}
-%      \end{minipage}
-%    \end{onlyenv}
-  \end{center}
-  
-\end{frame}
-
-\iffalse
-
-\subsection{Unions}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        int8_t i;
-        uint8_t u;
-      } num8_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num8_t test;
-        test.i = -1;
-        printf ("%d\n", test.u);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        char s[8];
-        uint64_t x;
-      } num_char_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num_char_t test = { "Hello!" };
-        printf ("%lx\n", test.x);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        t_base base;
-        t_integer integer;
-        t_string string;
-      } t_object;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-      } t_base;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        int content;
-      } t_integer;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        char *content;
-      } t_string;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \bigskip
-
-  \begin{center}
-    \begin{minipage}{8.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡if (this->base.type == T_INTEGER)
-          printf ("Integer: %d\n", this->integer.content);
-        else if (this->base.type == T_STRING)
-          printf ("String: \"%s\"\n", this->string.content);¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-\end{frame}
-
-\subsection{Virtuelle Methoden}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    void print_object (t_object *this)
-    {
-      if (this->base.type == T_INTEGER)
-        printf ("Integer: %d\n", this->integer.content);
-      else if (this->base.type == T_STRING)
-        printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}}
-    \put(1,-2){\mbox{\textarrow}}
-    \put(0,-3){\mbox{Zeiger auf Funktionen}}
-  \end{picture}
-
-  \begin{lstlisting}[xleftmargin=4cm]
-    void print_integer (t_object *this)
-    {
-      printf ("Integer: %d\n", this->integer.content);
-    }
-
-    void print_string (t_object *this)
-    {
-      printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Zeiger auf Funktionen
-
-  \medskip
-
-  \begin{lstlisting}
-    void (* print) (t_object *this);
-  \end{lstlisting}
-  \begin{picture}(0,1.2)(0,-0.9)
-    \color{red}
-    \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}}
-    \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}}
-  \end{picture}
-
-  \begin{itemize}
-    \item
-      Objekt enthält Zeiger auf Funktion
-      \begin{onlyenv}<1>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<2->
-        \vspace*{-3.5cm}  % Why doesn't a picture environment work here??? :-(
-        \begin{lstlisting}[gobble=10,xleftmargin=5.5cm]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-        \vspace*{0.85cm}
-        \bigskip
-        \smallskip
-      \end{onlyenv}
-    \pause
-    \item
-      Konstruktor initialisiert diesen Zeiger
-      \begin{onlyenv}<2>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          t_object *new_integer (int i)
-          {
-            t_object *p = malloc (sizeof (t_integer));
-            p->integer.print = print_integer;
-            p->integer.content = i;
-            return p;
-          }
-        \end{lstlisting}
-        \vspace*{-2cm}
-      \end{onlyenv}
-    \pause
-    \item
-      Aufruf: "`automatisch"' die richtige Funktion
-      \begin{onlyenv}<3>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          for (int i = 0; object[i]; i++)
-            object[i]->base.print (object[i]);
-        \end{lstlisting}
-      \end{onlyenv}
-    \pause
-    \medskip
-    \item
-      in größeren Projekten:\\
-      Objekt enthält Zeiger auf Tabelle von Funktionen
-  \end{itemize}
-\end{frame}
-
-\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \scriptsize
-  \begin{lstlisting}
-    #include <gtk/gtk.h>
-
-    int main (int argc, char **argv)
-    {
-      gtk_init (&argc, &argv);
-      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-      gtk_window_set_title (GTK_WINDOW (window), "Hello");
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-      GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-      gtk_container_add (GTK_CONTAINER (window), vbox);
-      gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
-      GtkWidget *label = gtk_label_new ("Hello, world!");
-      gtk_container_add (GTK_CONTAINER (vbox), label);
-      GtkWidget *button = gtk_button_new_with_label ("Quit");
-      g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-      gtk_container_add (GTK_CONTAINER (vbox), button);
-      gtk_widget_show (button);
-      gtk_widget_show (label);
-      gtk_widget_show (vbox);
-      gtk_widget_show (window);
-      gtk_main ();
-      return 0;
-    }
-  \end{lstlisting}
-
-  \vspace*{-6cm}\strut\hfill
-  \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm]
-  \begin{flushright}
-    \normalsize\bf Praktikumsversuch:\\
-    Objektorientiertes Zeichenprogramm
-  \end{flushright}
-  
-\end{frame}
-
-\subsection{Ausblick: C++}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (...);
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TBase
-        {
-          virtual void print (void);
-        };¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TInteger: public TBase
-        {
-          virtual void print (void);
-          int content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TString: public TBase
-        {
-          virtual void print (void);
-          char *content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\fi
-
-\end{document}
diff --git a/20200109/hp-musterloesung-20200109.pdf b/20200109/hp-musterloesung-20200109.pdf
deleted file mode 100644
index 9a0b7a5f8fbb13354d143a09321cb79f573beae9..0000000000000000000000000000000000000000
Binary files a/20200109/hp-musterloesung-20200109.pdf and /dev/null differ
diff --git a/20200109/hp-musterloesung-20200109.tex b/20200109/hp-musterloesung-20200109.tex
deleted file mode 100644
index cc811729e306ab694e4d9cc1cfc4de3de30fe6d1..0000000000000000000000000000000000000000
--- a/20200109/hp-musterloesung-20200109.tex
+++ /dev/null
@@ -1,623 +0,0 @@
-% hp-musterloesung-20200109.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 9.\ Januar 2020}
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-1.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    typedef struct
-    {
-      uint32_t a;
-      uint64_t b;
-      uint8_t c;
-    } three_numbers;
-
-    int main (void)
-    {
-      three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-      printf ("%s\n", &xyz);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
-  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
-  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function "main":
-    aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
-    argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
-       printf ("%s\n", &xyz);
-                 ^
-    $ ¡./aufgabe-2¿
-    Hallo, Welt!
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die beim Compilieren auftretende Warnung.
-      \points{2}
-    \item
-      Erklären Sie die Ausgabe des Programms.
-      \points{4}
-    \item
-      Welche Endianness hat der verwendete Rechner?
-      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-      \points{2}
-    \item
-      Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
-      (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
-      daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
-        aufgabe-2.c: In function "main":
-        aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
-        but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
-        [-Wformat=]
-           printf ("%s\n", &xyz);
-                     ^
-        $ ¡./aufgabe-2¿
-        Hall5V
-      \end{lstlisting}
-      (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
-      Erklären Sie die geänderte Ausgabe des Programms.
-      \points{3}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie die beim Compilieren auftretende Warnung.}
-
-      Die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s}
-      erwartet als Parameter einen String, d.\,h.\ einen Zeiger auf \lstinline{char}.
-      Die Adresse (\lstinline{&}) der Variablen \lstinline{xyz}
-      ist zwar ein Zeiger, aber nicht auf \lstinline{char},
-      sondern auf einen \lstinline{struct} vom Typ \lstinline{three_numbers}.
-      Eine implizite Umwandlung des Zeigertyps ist zwar möglich,
-      aber normalerweise nicht das, was man beabsichtigt.
-
-    \item
-      \textbf{Erklären Sie die Ausgabe des Programms.}
-
-      Ein String in C ist ein Array von \lstinline{char}s
-      bzw.\ ein Zeiger auf \lstinline{char}.
-      Da die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s}
-      einen String erwartet, wird sie das, worauf der übergebene Zeiger zeigt,
-      als ein Array von \lstinline{char}s interpretieren.
-      Ein \lstinline{char} entspricht einer 8-Bit-Speicherzelle.
-      Um die Ausgabe des Programms zu erklären, müssen wir daher
-      die Speicherung der Zahlen in den einzelnen 8-Bit-Speicherzellen betrachten.
-
-      Hierfür wandeln wir zunächst die Zahlen von Dezimal nach Hexadezimal um.
-      Sofern nötig (hier nicht der Fall) füllen wir von links mit Nullen auf,
-      um den gesamten von der Variablen belegten Speicherplatz zu füllen
-      (hier: 32 Bit, 64 Bit, 8 Bit).
-      Jeweils 2 Hex-Ziffern stehen für 8 Bit.
-      \begin{center}
-        \begin{tabular}{rcl}
-          dezimal & & hexadezimal \\[\smallskipamount]
-          1\,819\,042\,120 & = & 6C\,6C\,61\,48 \\
-          2\,410\,670\,883\,059\,281\,007 & = & 21\,74\,6C\,65\,57\,20\,2C\,6F \\
-          0 & = & 00
-        \end{tabular}
-      \end{center}
-      Die Anordnung dieser 8-Bit-Zellen im Speicher lautet
-      \textbf{auf einem Big-Endian-Rechner} wie folgt:
-      \begin{center}
-        \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline
-          \raisebox{0.5ex}{\strut}
-            6C & 6C & 61 & 48 &
-            21 & 74 & 6C & 65 & 57 & 20 & 2C & 6F &
-            00
-          \\\hline
-        \end{tabular}\\[-4.2ex]
-        \kern1.7em%
-        $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt%
-        $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt%
-        $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$%
-      \end{center}
-      \textbf{Auf einem Little-Endian-Rechner} lautet sie hingegen:
-      \begin{center}
-        \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline
-%          \raisebox{0.5ex}{\strut}
-%            H & a & l & l &
-%            o & , &   & W & e & l & t & ! &  \\\hline
-          \raisebox{0.5ex}{\strut}
-            48 & 61 & 6C & 6C &
-            6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 &
-            00
-          \\\hline
-        \end{tabular}\\[-4.2ex]
-        \kern1.7em%
-        $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt%
-        $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt%
-        $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$%
-      \end{center}
-      Anhand einer ASCII-Tabelle erkennt man,
-      daß die Big-Endian-Variante dem String \lstinline{"llaH!tleW ,o"}
-      und die Little-Endian-Variante dem String \lstinline{"Hallo, Welt!"}
-      entspricht -- jeweils mit einem Null-Symbol am Ende,
-      das von der Variablen \lstinline{c} herrührt.
-
-      Auf einem Little-Endian-Rechner wird daher
-      \lstinline[style=terminal]{Hallo, Welt!} ausgegeben.
-
-    \item
-      \textbf{Welche Endianness hat der verwendete Rechner?}
-
-      Little-Endian (Begründung siehe oben)
-
-      \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?}
-
-      \lstinline[style=terminal]{llaH!tleW ,o} (Begründung siehe oben)
-
-    \item
-      \textbf{Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
-      (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
-      daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)}
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
-        aufgabe-2.c: In function "main":
-        aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
-        but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
-        [-Wformat=]
-           printf ("%s\n", &xyz);
-                     ^
-        $ ¡./aufgabe-2¿
-        Hall5V
-      \end{lstlisting}
-      \textbf{(Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)}\par
-      \textbf{Erklären Sie die geänderte Ausgabe des Programms.}
-
-      \goodbreak
-
-      Auf einem 64-Bit-Rechner hat eine 64-Bit-Variable
-      ein \textbf{64-Bit-Alignment},
-      d.\,h.\ ihre Speicheradresse muß durch 8 teilbar sein.
-
-      Der Compiler legt die Variablen daher wie folgt im Speicher ab (Little-Endian):
-      \begin{center}
-        \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline
-          \raisebox{0.5ex}{\strut}
-            48 & 61 & 6C & 6C & ?? & ?? & ?? & ?? &
-            6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 &
-            00
-          \\\hline
-        \end{tabular}\\[-4.2ex]
-        \kern1.7em%
-        $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt%
-        $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt%
-        $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt%
-        $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$%
-      \end{center}
-      Der Inhalt der Füll-Bytes ist undefiniert.
-      Im Beispiel aus der Aufgabenstellung entsteht hier die Ausgabe
-      \lstinline[style=terminal]{5V}, was den (zufälligen) hexadezimalen Werten
-      35 56 entspricht:
-      \begin{center}
-        \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline
-          \raisebox{0.5ex}{\strut}
-            48 & 61 & 6C & 6C & 35 & 56 & 00 & ?? &
-            6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 &
-            00
-          \\\hline
-        \end{tabular}\\[-4.2ex]
-        \kern1.7em%
-        $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt%
-        $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt%
-        $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt%
-        $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$%
-      \end{center}
-      Da danach die Aufgabe aufhört, muß an der nächsten Stelle
-      ein Null-Symbol stehen, das das Ende des Strings anzeigt.
-      Der Inhalt der darauf folgenden Speicherzelle bleibt unbekannt.
-  \end{enumerate}
-
-%  \vspace{4cm}
-%  \goodbreak
-
-  \exercise{Zeigerarithmetik}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-2.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    void output (uint16_t *a)
-    {
-      for (int i = 0; a[i]; i++)
-        printf (" %d", a[i]);
-      printf ("\n");
-    }
-
-    int main (void)
-    {
-      uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
-
-      uint16_t *p1 = prime_numbers;
-      output (p1);
-      p1++;
-      output (p1);
-
-      char *p2 = prime_numbers;
-      output (p2);
-      p2++;
-      output (p2);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird compiliert und ausgeführt:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function 'main':
-    aufgabe-2.c:20:13: warning: initialization from
-                       incompatible pointer type [enabled by default]
-    aufgabe-2.c:21:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    aufgabe-2.c:23:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    $ ¡./aufgabe-2¿
-     2 3 5 7 11 13 17
-     3 5 7 11 13 17
-     2 3 5 7 11 13 17
-     768 1280 1792 2816 3328 4352
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.
-      \points{2}
-    \item
-      Begründen Sie den Unterschied zwischen der ersten (\lstinline[style=terminal]{2 3 5 7 11 13 17})\\
-      und der zweiten Zeile (\lstinline[style=terminal]{3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{2}
-    \item
-      Erklären Sie die beim Compilieren auftretenden Warnungen\\
-      und die dritte Zeile (\lstinline[style=terminal]{2 3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{3}
-    \item
-      Erklären Sie die vierte Zeile (\lstinline[style=terminal]{768 1280 1792 2816 3328 4352})
-      der Ausgabe des Programms.\\
-%      Welche Endianness hat der verwendete Rechner?\\
-%      Wie sähe die Ausgabezeile bei umgekehrter Endianness aus?
-%
-% 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% 0 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   2 0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% --> Endianness nicht erkennbar!
-%
-      Sie dürfen einen Little-Endian-Rechner voraussetzen.
-      \points{4}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.}
-
-      Die Funktion bekommt ein Array von ganzen Zahlen als Zeiger übergeben
-      und gibt dessen Inhalt auf den Bildschirm aus,
-      \textbf{bis es auf die Zahl 0 stößt}.
-      (Die Ende-Markierung 0 wird nicht mit ausgegeben.)
-
-      (Die Erwähnung der Abbruchbedingung der Schleife
-      ("`bis es auf die Zahl 0 stößt"')
-      ist ein wichtiger Bestandteil der richtigen Lösung.
-      Wenn man nämlich einen Zeiger auf ein Array übergibt,
-      das am Ende keine 0 enthält,
-      liest die Funktion über das Array hinaus
-      zufällige Werte aus dem Speicher.
-      Dies kann zu einem Absturz führen.)
-
-    \item
-      \textbf{Begründen Sie den Unterschied zwischen der ersten (\lstinline{2 3 5 7 11 13 17})\\
-      und der zweiten Zeile (\lstinline{3 5 7 11 13 17}) der Ausgabe des Programms.}
-
-      Zwischen der Ausgabe der ersten und der zweiten Zeile
-      wurde der Zeiger \lstinline{p1} um 1 inkrementiert;
-      er zeigt danach auf die nächste ganze Zahl im Array
-      (also die zweite Zahl im Array -- mit Index 1 statt 0).
-      Als Folge davon wird beim zweiten Aufruf von \lstinline{output()}
-      die erste Zahl des Arrays nicht mehr mit ausgegeben.
-
-    \item
-      \textbf{Erklären Sie die beim Compilieren auftretenden Warnungen\\
-      und die dritte Zeile (\lstinline{2 3 5 7 11 13 17}) der Ausgabe des Programms.}
-
-      Die Warnungen kommen daher,
-      daß die Variable \lstinline{p2} ein Zeiger auf \lstinline{char}-Variable ist,
-      ihr jedoch ein anderer Zeigertyp,
-      nämlich ein Zeiger auf \lstinline{uint16_t}-Variable, zugewiesen wird.
-      Beim Aufruf der Funktion \lstinline{output()}
-      wird umgekehrt dem Parameter \lstinline{a},
-      der auf \lstinline{uint16_t}-Variable zeigt,
-      ein Zeiger auf \lstinline{char} zugewiesen,
-      was dieselbe Warnung hervorruft.
-
-      Trotz des anderen Zeigertyps und trotz der Warnungen
-      zeigt \lstinline{p2} auf die Speicheradresse
-      der ersten Zahl im Array,
-      so daß die Funktion \lstinline{output()} normal arbeitet.
-
-    \item
-      \textbf{Erklären Sie die vierte Zeile (\lstinline{768 1280 1792 2816 3328 4352})
-      der Ausgabe des Programms.\\
-      Sie dürfen einen Little-Endian-Rechner voraussetzen.}
-
-      Zwischen der Ausgabe der ersten und der zweiten Zeile
-      wurde der Zeiger \lstinline{p2} um 1 inkrementiert.
-      Da \lstinline{p2} auf \lstinline{char}-Variable zeigt
-      und nicht auf \lstinline{uint16_t}-Variable,
-      zeigt er danach \emph{nicht\/} auf die nächste ganze Zahl im Array,
-      sondern auf die \emph{nächste Speicherzelle}.
-      Da eine \lstinline{uint16_t}-Variable \emph{zwei\/} Speicherzellen belegt,
-      zeigt \lstinline{p2} nach dem Inkrementieren
-      \emph{auf das zweite Byte\/} der ersten Variablen im Array.
-      Die Funktion \lstinline{output()}
-      liest immer ganze \lstinline{uint16_t}-Variablen
-      und nimmt für die Ausgabe noch das erste Byte der zweiten Zahl im Array hinzu.
-
-      Auf einem Little-Endian-Rechner hat das zweite Byte der Zahl 2 den Wert 0
-      und das erste Byte der Zahl 3 den Wert 3.
-      Wenn man dies zu einer Little-Endian-16-Bit-Zahl zusammensetzt,
-      entsteht die Zahl $256\cdot 3 + 0 = 768$.
-      Entsprechendes gilt für alle anderen Zahlen im Array.
-
-      \begin{center}
-        $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{2}}}$\kern1pt%
-        $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{3}}}$\kern1pt%
-        $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{5}}}$\kern1pt%
-        $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{7}}}$\kern1pt%
-        \raisebox{2ex}{\dots}\kern-7pt\\
-        \begin{tabular}{|c|c|c|c|c|c|c|c|}\hline
-          \raisebox{0.5ex}{\strut}2 & 0 & 3 & 0 & 5 & 0 & 7 & \dots\\\hline
-        \end{tabular}\\[-4.2ex]
-        \kern1.7em%
-        $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{768}}}$\kern1pt%
-        $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{1280}}}$\kern1pt%
-        $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{1792}}}$\kern1pt%
-        \raisebox{-3ex}{\dots}\kern-7pt
-      \end{center}
-
-      Die Schleife in der Funktion \lstinline{output()} bricht ab,
-      sobald sie auf den Zahlenwert 0 trifft.
-      Dies ist jetzt nur noch zufällig der Fall;
-      anscheinend hat die Speicherzelle hinter dem Array zufällig den Wert 0.
-      Ansonsten wäre es auch möglich gewesen,
-      daß die Schleife über das Array hinaus immer weiter liest,
-      was zu einem Absturz führen kann.
-
-      \textbf{Zusatzübung:} 
-      Auf einem Big-Endian-Rechner verhält sich das Programm genauso.
-      Versuchen Sie, auch dies zu erklären.
-
-  \end{enumerate}
-
-  \exercise{Personen-Datenbank}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-3.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    typedef struct
-    {
-      char first_name[10];
-      char family_name[20];
-      char day, month;
-      int year;
-    } person;
-
-    int main (void)
-    {
-      person sls;
-      sls.day = 26;
-      sls.month = 7;
-      sls.year = 1951;
-      strcpy (sls.first_name, "Sabine");
-      strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
-      printf ("%s %s wurde am %d.%d.%d geboren.\n",
-              sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings
-  von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten
-  \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}.
-
-  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
-  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
-  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿
-    $ ¡./aufgabe-2¿
-    Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren.
-    Speicherzugriffsfehler
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.
-      \points{4}
-    \item
-      Welche Endianness hat der verwendete Rechner?
-      Begründen Sie Ihre Antwort.
-      \points{1}
-    \item
-      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-      \points{2}
-    \item
-      Erklären Sie den Speicherzugriffsfehler.
-      (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht.
-      Er ist aber trotzdem vorhanden.)
-      \points{2}
-  \end{enumerate}
-
-  \goodbreak
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.}
-
-      Der String \lstinline{"Leutheusser-Schnarrenberger"}
-      hat 27 Zeichen und daher mehr als die in der Variablen
-      \lstinline{sls.family_name} vorgesehenen 20 Zeichen.
-      Das \lstinline{"nberger"} paßt nicht mehr in die String-Variable.
-      
-      Die Zuweisung \lstinline{strcpy (sls.family_name, "Leutheusser-Schnarrenberger")}
-      überschreibt daher 8 Speicherzellen außerhalb der String-Variablen
-      \lstinline{sls.family_name} mit dem String \lstinline{"nberger"}
-      (7 Buchstaben zzgl.\ String-Ende-Symbol) -- und damit insbesondere die Variablen
-      \lstinline{sls.day}, \lstinline{sls.month} und \lstinline{sls.year}.
-
-      Die überschriebenen Speicherzellen sehen demnach folgendermaßen aus:
-      \begin{center}
-        \begin{picture}(8,1.5)(0,-0.5)
-          \put(0,0){\line(1,0){8}}
-          \put(0,1){\line(1,0){8}}
-          \multiput(0,0)(1,0){9}{\line(0,1){1}}
-          \put(0.4,0.38){\lstinline{n}}
-          \put(1.4,0.38){\lstinline{b}}
-          \put(2.4,0.38){\lstinline{e}}
-          \put(3.4,0.38){\lstinline{r}}
-          \put(4.4,0.38){\lstinline{g}}
-          \put(5.4,0.38){\lstinline{e}}
-          \put(6.4,0.38){\lstinline{r}}
-          \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}}
-          \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}}
-          \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}}
-          \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}}
-        \end{picture}
-      \end{center}
-      ("`?"' steht für zwei Speicherzellen, von denen wir nicht wissen,
-      wofür sie genutzt werden.)
-
-      Wenn wir die ASCII-Zeichen in Hexadezimalzahlen umrechnen, entspricht dies:
-      \begin{center}
-        \begin{picture}(7,1.5)(0,-0.5)
-          \put(0,0){\line(1,0){8}}
-          \put(0,1){\line(1,0){8}}
-          \multiput(0,0)(1,0){9}{\line(0,1){1}}
-          \put(0.5,0.5){\makebox(0,0){\lstinline{0x6e}}}
-          \put(1.5,0.5){\makebox(0,0){\lstinline{0x62}}}
-          \put(2.5,0.5){\makebox(0,0){\lstinline{0x65}}}
-          \put(3.5,0.5){\makebox(0,0){\lstinline{0x72}}}
-          \put(4.5,0.5){\makebox(0,0){\lstinline{0x67}}}
-          \put(5.5,0.5){\makebox(0,0){\lstinline{0x65}}}
-          \put(6.5,0.5){\makebox(0,0){\lstinline{0x72}}}
-          \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}}
-          \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}}
-          \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}}
-          \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}}
-        \end{picture}
-      \end{center}
-      Dies entspricht bereits genau den Werten \lstinline{110} und \lstinline{98}
-      für die Variablen \lstinline{sls.day} bzw.\ \lstinline{sls.month}.
-
-      Für die Variable \lstinline{sls.year} müssen wir ihre vier Speicherzellen
-      unter der Berücksichtigung der Endianness des Rechners zusammenziehen.
-      Für Big-Endian ergibt dies \lstinline{0x65726765 == 1701996389}.
-      Für Little-Endian ergibt sich der Wert \lstinline{0x65677265 == 1701278309},
-      der auch in der Ausgabe des Programms auftaucht.
-
-    \item
-      \textbf{Welche Endianness hat der verwendete Rechner?
-      Begründen Sie Ihre Antwort.}
-
-      Wie in (a) begründet, ergibt sich die Ausgabe von
-      \lstinline[style=terminal]{1701278309} für das Jahr
-      aus dem Speicherformat Little-Endian.
-
-    \item
-      \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?}
-
-      Wie in (a) begründet, ergäbe sich aus dem Speicherformat Big-Endian
-      die Ausgabe von \lstinline[style=terminal]{1701996389} für das Jahr.
-
-    \item
-      \textbf{Erklären Sie den Speicherzugriffsfehler.
-      (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht.
-      Er ist aber trotzdem vorhanden.)}
-
-      Die zwei in (a) mit "`?"' bezeichneten Speicherzellen
-      wurden ebenfalls überschrieben.
-      Dies ist in der Ausgabe zunächst nicht sichtbar,
-      bewirkt aber später den Speicherzugriffsfehler.
-
-      (Tatsächlich handelt es sich bei den überschriebenen Speicherzellen
-      um einen Teil der Rücksprungadresse, die \lstinline{main()} verwendet,
-      um mit \lstinline{return 0} an das Betriebssystem zurückzugeben.)
-
-  \end{enumerate}
-
-  \textbf{Hinweis 1:}
-  Um auf einen solchen Lösungsweg zu kommen, wird empfohlen,
-  "`geheimnisvolle"' Zahlen nach hexadezimal umzurechnen
-  und in Speicherzellen (Zweiergruppen von Hex-Ziffern) zu zerlegen.
-  Oft erkennt man dann direkt ASCII-Zeichen:
-  Großbuchstaben beginnen mit der Hex-Ziffer \lstinline{4} oder \lstinline{5},
-  Kleinbuchstaben mit \lstinline{6} oder \lstinline{7}.
-
-  \textbf{Hinweis 2:}
-  Um derartige Programmierfehler in der Praxis von vorneherein zu vermeiden,
-  wird empfohlen, anstelle von \lstinline{strcpy()}
-  grundsätzlich die Funktion \lstinline{strncpy()} zu verwenden.
-  Diese erwartet einen zusätzlichen Parameter,
-  der die maximal zulässige Länge des Strings enthält.
-  Ohne einen derartigen expliziten Parameter kann die Funktion nicht wissen,
-  wie lang die Variable ist, in der der String gespeichert werden soll.
-
-\end{document}
diff --git a/20200109/hp-uebung-20200109.pdf b/20200109/hp-uebung-20200109.pdf
deleted file mode 100644
index 7894b5a858d5ce3bc4e4823d01000eb61ae25186..0000000000000000000000000000000000000000
Binary files a/20200109/hp-uebung-20200109.pdf and /dev/null differ
diff --git a/20200109/hp-uebung-20200109.tex b/20200109/hp-uebung-20200109.tex
deleted file mode 100644
index b5030dff4269e3c426fec5ac25dfccf32218b609..0000000000000000000000000000000000000000
--- a/20200109/hp-uebung-20200109.tex
+++ /dev/null
@@ -1,265 +0,0 @@
-% hp-uebung-20200109.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 9.\ Januar 2020}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  15 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-1.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    typedef struct
-    {
-      uint32_t a;
-      uint64_t b;
-      uint8_t c;
-    } three_numbers;
-
-    int main (void)
-    {
-      three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-      printf ("%s\n", &xyz);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
-  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
-  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function "main":
-    aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
-    argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
-       printf ("%s\n", &xyz);
-                 ^
-    $ ¡./aufgabe-2¿
-    Hallo, Welt!
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die beim Compilieren auftretende Warnung.
-      \points{2}
-    \item
-      Erklären Sie die Ausgabe des Programms.
-      \points{4}
-    \item
-      Welche Endianness hat der verwendete Rechner?
-      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-      \points{2}
-    \item
-      Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
-      (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
-      daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
-        aufgabe-2.c: In function "main":
-        aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
-        but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
-        [-Wformat=]
-           printf ("%s\n", &xyz);
-                     ^
-        $ ¡./aufgabe-2¿
-        Hall5V
-      \end{lstlisting}
-      (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
-      Erklären Sie die geänderte Ausgabe des Programms.
-      \points{3}
-  \end{enumerate}
-
-  \clearpage
-
-  \exercise{Zeigerarithmetik}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-2.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdint.h>
-
-    void output (uint16_t *a)
-    {
-      for (int i = 0; a[i]; i++)
-        printf (" %d", a[i]);
-      printf ("\n");
-    }
-
-    int main (void)
-    {
-      uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
-
-      uint16_t *p1 = prime_numbers;
-      output (p1);
-      p1++;
-      output (p1);
-
-      char *p2 = prime_numbers;
-      output (p2);
-      p2++;
-      output (p2);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird compiliert und ausgeführt:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function 'main':
-    aufgabe-2.c:20:13: warning: initialization from
-                       incompatible pointer type [enabled by default]
-    aufgabe-2.c:21:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    aufgabe-2.c:23:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    $ ¡./aufgabe-2¿
-     2 3 5 7 11 13 17
-     3 5 7 11 13 17
-     2 3 5 7 11 13 17
-     768 1280 1792 2816 3328 4352
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.
-      \points{2}
-    \item
-      Begründen Sie den Unterschied zwischen der ersten (\lstinline[style=terminal]{2 3 5 7 11 13 17})\\
-      und der zweiten Zeile (\lstinline[style=terminal]{3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{2}
-    \item
-      Erklären Sie die beim Compilieren auftretenden Warnungen\\
-      und die dritte Zeile (\lstinline[style=terminal]{2 3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{3}
-    \item
-      Erklären Sie die vierte Zeile (\lstinline[style=terminal]{768 1280 1792 2816 3328 4352})
-      der Ausgabe des Programms.\\
-%      Welche Endianness hat der verwendete Rechner?\\
-%      Wie sähe die Ausgabezeile bei umgekehrter Endianness aus?
-%
-% 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% 0 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   2 0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% --> Endianness nicht erkennbar!
-%
-      Sie dürfen einen Little-Endian-Rechner voraussetzen.
-      \points{4}
-  \end{enumerate}
-
-  \goodbreak
-
-  \exercise{Personen-Datenbank}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-3.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <string.h>
-
-    typedef struct
-    {
-      char first_name[10];
-      char family_name[20];
-      char day, month;
-      int year;
-    } person;
-
-    int main (void)
-    {
-      person sls;
-      sls.day = 26;
-      sls.month = 7;
-      sls.year = 1951;
-      strcpy (sls.first_name, "Sabine");
-      strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
-      printf ("%s %s wurde am %d.%d.%d geboren.\n",
-              sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings
-  von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten
-  \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}.
-
-  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
-  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
-  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿
-    $ ¡./aufgabe-2¿
-    Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren.
-    Speicherzugriffsfehler
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.
-      \points{4}
-    \item
-      Welche Endianness hat der verwendete Rechner?
-      Begründen Sie Ihre Antwort.
-      \points{1}
-    \item
-      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-      \points{2}
-    \item
-      Erklären Sie den Speicherzugriffsfehler.
-      (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht.
-      Er ist aber trotzdem vorhanden.)
-      \points{2}
-  \end{enumerate}
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20200109/landau-symbols-2.pdf b/20200109/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20200109/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20200109/landau-symbols-3.pdf b/20200109/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20200109/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20200109/landau-symbols.pdf b/20200109/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20200109/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20200109/loesung-1-1.c b/20200109/loesung-1-1.c
deleted file mode 100644
index 175923f7250d0747a21df5f33f8a3761393d1d7f..0000000000000000000000000000000000000000
--- a/20200109/loesung-1-1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef struct
-{
-  uint32_t a;
-  uint64_t b;
-  uint8_t c;
-} three_numbers;
-
-int main (void)
-{
-  three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-  printf ("%x %x %x\n", xyz.a, xyz.b, xyz.c);
-  printf ("%08x %016x %02x\n", xyz.a, xyz.b, xyz.c);
-  printf ("%s\n", &xyz);
-  return 0;
-}
diff --git a/20200109/loesung-1-2.c b/20200109/loesung-1-2.c
deleted file mode 100644
index 07ca06832cc58c1b8243f9afd05aec57bb12b1c4..0000000000000000000000000000000000000000
--- a/20200109/loesung-1-2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef struct
-{
-  uint32_t a;
-  uint64_t b;
-  uint8_t c;
-} three_numbers;
-
-int main (void)
-{
-  three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-  printf ("%x %lx %x\n", xyz.a, xyz.b, xyz.c);
-  printf ("%08x %016lx %02x\n", xyz.a, xyz.b, xyz.c);
-  printf ("%s\n", &xyz);
-  return 0;
-}
diff --git a/20200109/loesung-3-1.c b/20200109/loesung-3-1.c
deleted file mode 100644
index 416c5dfa2cba2f7dc68b72551ec6a5c8ce8bab79..0000000000000000000000000000000000000000
--- a/20200109/loesung-3-1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-typedef struct
-{
-  char first_name[10];
-  char family_name[20];
-  char day, month;
-  int year;
-} person;
-
-int main (void)
-{
-  person sls;
-  strcpy (sls.first_name, "Sabine");
-  strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
-  sls.day = 26;
-  sls.month = 7;
-  sls.year = 1951;
-  printf ("%s %s wurde am %d.%d.%d geboren.\n",
-          sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-  return 0;
-}
diff --git a/20200109/loesung-3-2.c b/20200109/loesung-3-2.c
deleted file mode 100644
index 825373e61475ebc67e9cac6929b6e004715a7cad..0000000000000000000000000000000000000000
--- a/20200109/loesung-3-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-typedef struct
-{
-  char first_name[10];
-  char family_name[20];
-  char day, month;
-  int year;
-} person;
-
-int main (void)
-{
-  person sls;
-  sls.day = 26;
-  sls.month = 7;
-  sls.year = 1951;
-  strncpy (sls.first_name, "Sabine", 10);
-  strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 20);
-  printf ("%s %s wurde am %d.%d.%d geboren.\n",
-          sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-  return 0;
-}
diff --git a/20200109/loesung-3-3.c b/20200109/loesung-3-3.c
deleted file mode 100644
index 7a4b1bfaf9e67a164ee865a0ae4ef69606255de0..0000000000000000000000000000000000000000
--- a/20200109/loesung-3-3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-typedef struct
-{
-  char first_name[10];
-  char family_name[20];
-  char day, month;
-  int year;
-} person;
-
-int main (void)
-{
-  person sls;
-  sls.day = 26;
-  sls.month = 7;
-  sls.year = 1951;
-  strncpy (sls.first_name, "Sabine", 9);
-  strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19);
-  printf ("%s %s wurde am %d.%d.%d geboren.\n",
-          sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-  return 0;
-}
diff --git a/20200109/loesung-3-4.c b/20200109/loesung-3-4.c
deleted file mode 100644
index 3c635dfa7e3923eb678469166bf218e1640927a2..0000000000000000000000000000000000000000
--- a/20200109/loesung-3-4.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-typedef struct
-{
-  char first_name[10];
-  char family_name[20];
-  char day, month;
-  int year;
-} person;
-
-int main (void)
-{
-  person sls;
-  sls.day = 26;
-  sls.month = 7;
-  sls.year = 1951;
-  strncpy (sls.first_name, "Sabine", 9);
-  sls.first_name[9] = 0;
-  strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19);
-  sls.family_name[19] = 0;
-  printf ("%s %s wurde am %d.%d.%d geboren.\n",
-          sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
-  return 0;
-}
diff --git a/20200109/logo-hochschule-bochum-cvh-text-v2.pdf b/20200109/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20200109/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20200109/logo-hochschule-bochum.pdf b/20200109/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20200109/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20200109/names.h b/20200109/names.h
deleted file mode 100644
index a265ff4141a2cc578d3f6f402822a2dbbd5cea90..0000000000000000000000000000000000000000
--- a/20200109/names.h
+++ /dev/null
@@ -1,50 +0,0 @@
-"Michael",    "Laura",
-"Elias",      "Julia",
-"Luca",       "Anna",
-"Liam",       "Emma",
-"Alexander",  "Lena",
-"Noah",       "Vanessa",
-"Jonas",      "Lea",
-"Marcel",     "Mila",
-"Daniel",     "Lisa",
-"David",      "Lina",
-"Milan",      "Sarah",
-"Julian",     "Alina",
-"Linus",      "Emilia",
-"Thomas",     "Nina",
-"Samuel",     "Elena",
-"Levin",      "Lara",
-"Levi",       "Melanie",
-"Jan",        "Hannah",
-"Lukas",      "Sandra",
-"Tim",        "Leonie",
-"Patrick",    "Sophie",
-"Marvin",     "Mia",
-"Andreas",    "Amelie",
-"Leon",       "Selina",
-"Tobias",     "Luisa",
-"Simon",      "Maria",
-"Valentin",   "Jana",
-"Robin",      "Johanna",
-"Paul",       "Marie",
-"Markus",     "Milena",
-"Benjamin",   "Melina",
-"Stefan",     "Michelle",
-"Felix",      "Emily",
-"Florian",    "Renesmee",
-"Fabian",     "Aylin",
-"Emil",       "Jessica",
-"Aaron",      "Franziska",
-"Manuel",     "Jasmin",
-"Christian",  "Fiona",
-"Dominik",    "Sina",
-"Joshua",     "Jennifer",
-"Moritz",     "Claudia",
-"Sebastian",  "Nicole",
-"Peter",      "Annika",
-"Philipp",    "Sophia",
-"Max",        "Katharina",
-"Johannes",   "Isabella",
-"Finn",       "Nele",
-"Adrian",     "Elisabeth",
-"Martin",     "Pia",
diff --git a/20200109/objects-1.c b/20200109/objects-1.c
deleted file mode 100644
index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000
--- a/20200109/objects-1.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { &i, &s };
-
-  return 0;
-}
diff --git a/20200109/objects-2.c b/20200109/objects-2.c
deleted file mode 100644
index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000
--- a/20200109/objects-2.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  return 0;
-}
diff --git a/20200109/objects-3.c b/20200109/objects-3.c
deleted file mode 100644
index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000
--- a/20200109/objects-3.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", object[i]->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", object[i]->content);
-
-  return 0;
-}
diff --git a/20200109/objects-4.c b/20200109/objects-4.c
deleted file mode 100644
index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000
--- a/20200109/objects-4.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", (t_integer *) object[i]->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", (t_string *) object[i]->content);
-
-  return 0;
-}
diff --git a/20200109/objects-5.c b/20200109/objects-5.c
deleted file mode 100644
index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000
--- a/20200109/objects-5.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", ((t_integer *) object[i])->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", ((t_string *) object[i])->content);
-
-  return 0;
-}
diff --git a/20200109/pgscript.sty b/20200109/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20200109/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20200109/pgslides.sty b/20200109/pgslides.sty
deleted file mode 120000
index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000
--- a/20200109/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../20200102/pgslides.sty
\ No newline at end of file
diff --git a/20200109/qsort-1.c b/20200109/qsort-1.c
deleted file mode 100644
index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000
--- a/20200109/qsort-1.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/20200109/qsort-2.c b/20200109/qsort-2.c
deleted file mode 100644
index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000
--- a/20200109/qsort-2.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-  if (l < right)
-    quicksort (name, l, right);
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/20200109/qsort-3.c b/20200109/qsort-3.c
deleted file mode 100644
index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000
--- a/20200109/qsort-3.c
+++ /dev/null
@@ -1,74 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-  if (r > left)
-    quicksort (name, left, r);
-  if (l < right)
-    quicksort (name, l, right);
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/20200109/sort-0.c b/20200109/sort-0.c
deleted file mode 100644
index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000
--- a/20200109/sort-0.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int find_first (char **name)
-{
-  return 2;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  printf ("%s\n", name[first]);
-  return 0;
-}
diff --git a/20200109/sort-1.c b/20200109/sort-1.c
deleted file mode 100644
index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000
--- a/20200109/sort-1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int find_first (char **name)
-{
-  int first = 0;
-  for (int i = 1; name[i]; i++)
-    if (strcmp (name[i], name[first]) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  printf ("%s\n", name[first]);
-  return 0;
-}
diff --git a/20200109/sort-2.c b/20200109/sort-2.c
deleted file mode 100644
index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000
--- a/20200109/sort-2.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name)
-{
-  int first = 0;
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  display (name, first, -1);
-  return 0;
-}
diff --git a/20200109/sort-3.c b/20200109/sort-3.c
deleted file mode 100644
index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000
--- a/20200109/sort-3.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name, 0);
-  display (name, first, -1);
-  return 0;
-}
diff --git a/20200109/sort-4.c b/20200109/sort-4.c
deleted file mode 100644
index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000
--- a/20200109/sort-4.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/sort-5.c b/20200109/sort-5.c
deleted file mode 100644
index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000
--- a/20200109/sort-5.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = {
-                   #include "names.h"
-                   NULL
-                 };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/sort-6.c b/20200109/sort-6.c
deleted file mode 100644
index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000
--- a/20200109/sort-6.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-//  display (name, left, right);
-//  usleep (200);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = {
-                   #include "names.h"
-                   NULL
-                 };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200109/sort-7.c b/20200109/sort-7.c
deleted file mode 100644
index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000
--- a/20200109/sort-7.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = sorted;
-      for (int i = sorted + 1; name[i]; i++)
-        if (compare (name, i, first) < 0)
-          first = i;
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/20200116/Tower_of_Hanoi.jpeg b/20200116/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/20200116/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/20200116/aufgabe-1.c b/20200116/aufgabe-1.c
deleted file mode 100644
index abbf364a3db17611e41d086591826e98a8a3672b..0000000000000000000000000000000000000000
--- a/20200116/aufgabe-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int fak (int n)
-{
-  if (n <= 0)
-    return 1;
-  else
-    return n * fak (n - 1);
-}
-
-int main (void)
-{
-  for (int n = 0; n <= 5; n++)
-    printf ("%d\n", fak (n));
-  return 0;
-}
diff --git a/20200116/aufgabe-2.c b/20200116/aufgabe-2.c
deleted file mode 100644
index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000
--- a/20200116/aufgabe-2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <string.h>
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
diff --git a/20200116/aufgabe-3a.c b/20200116/aufgabe-3a.c
deleted file mode 100644
index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000
--- a/20200116/aufgabe-3a.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct animal
-{
-  int type;
-  char *name;
-} animal;
-
-typedef struct with_wings
-{
-  int wings;
-} with_wings;
-
-typedef struct with_legs
-{
-  int legs;
-} with_legs;
-
-int main (void)
-{
-  animal *a[2];
-
-  animal duck;
-  a[0] = &duck;
-  a[0]->type = WITH_WINGS;
-  a[0]->name = "duck";
-  a[0]->wings = 2;
-
-  animal cow;
-  a[1] = &cow;
-  a[1]->type = WITH_LEGS;
-  a[1]->name = "cow";
-  a[1]->legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->name,
-              ((with_legs *) a[i])-> legs);
-    else if (a[i]->type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->name,
-              ((with_wings *) a[i])-> wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->name);
-
-  return 0;
-}
diff --git a/20200116/aufgabe-3b.c b/20200116/aufgabe-3b.c
deleted file mode 100644
index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000
--- a/20200116/aufgabe-3b.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct animal
-{
-  int type;
-  char *name;
-} animal;
-
-typedef struct with_wings
-{
-  int wings;
-} with_wings;
-
-typedef struct with_legs
-{
-  int legs;
-} with_legs;
-
-int main (void)
-{
-  animal *a[2];
-
-  animal duck;
-  a[0] = &duck;
-  a[0]->type = WITH_WINGS;
-  a[0]->name = "duck";
-  ((with_wings *) a[0])->wings = 2;
-
-  animal cow;
-  a[1] = &cow;
-  a[1]->type = WITH_LEGS;
-  a[1]->name = "cow";
-  ((with_legs *) a[1])->legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->name,
-              ((with_legs *) a[i])-> legs);
-    else if (a[i]->type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->name,
-              ((with_wings *) a[i])-> wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->name);
-
-  return 0;
-}
diff --git a/20200116/dynmem-1.c b/20200116/dynmem-1.c
deleted file mode 100644
index 56148108873fc8dae9bdb7f8b555a4172883c6ad..0000000000000000000000000000000000000000
--- a/20200116/dynmem-1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-  for (int i = 0; i < 3; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/dynmem-2.c b/20200116/dynmem-2.c
deleted file mode 100644
index f78a21ec7a8285f4c3fc41e3b549dd333e11c22e..0000000000000000000000000000000000000000
--- a/20200116/dynmem-2.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  char **new_name = malloc (4 * sizeof (char*));
-  for (int i = 0; i < 3; i++)
-    new_name[i] = name[i];
-  name = new_name;   /* Speicherleck: Array wurde nicht freigegeben! */
-
-  name[3] = "Dieter";
-
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/dynmem-2a.c b/20200116/dynmem-2a.c
deleted file mode 100644
index 8a0bb60241555d1493c0527340bdc335d3fbdc1e..0000000000000000000000000000000000000000
--- a/20200116/dynmem-2a.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  char **new_name = malloc (4 * sizeof (char*));
-  for (int i = 0; i < 3; i++)
-    new_name[i] = name[i];
-  name = new_name;   /* Speicherleck: Array wurde nicht freigegeben! */
-
-  name[3] = "Dieter";
-
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  free (new_name);
-  return 0;
-}
diff --git a/20200116/dynmem-3.c b/20200116/dynmem-3.c
deleted file mode 100644
index 0db6dd4f7f67d8d4db8ce8264a0ba533082da721..0000000000000000000000000000000000000000
--- a/20200116/dynmem-3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  char **new_name = malloc (4 * sizeof (char*));
-  for (int i = 0; i < 3; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;   /* kein Speicherleck: Array wurde freigegeben. */
-
-  name[3] = "Dieter";
-
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/dynmem-4.c b/20200116/dynmem-4.c
deleted file mode 100644
index d1ebf99fd76b60aa3bcf97ebc2eb7b76c1a583a9..0000000000000000000000000000000000000000
--- a/20200116/dynmem-4.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  char **new_name = malloc (4 * sizeof (char*));
-  for (int i = 0; i < 3; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;
-
-  name[3] = "Dieter";
-
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  free (new_name);   /* Fehler: Array wurde bereits freigegeben! */
-  return 0;
-}
diff --git a/20200116/dynmem-5.c b/20200116/dynmem-5.c
deleted file mode 100644
index c8a5807d1172df17419fa05efffcb643b8e75ba7..0000000000000000000000000000000000000000
--- a/20200116/dynmem-5.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  char **new_name = malloc (4 * sizeof (char*));
-  for (int i = 0; i < 3; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;
-  new_name = NULL;   /* Zeiger wird nicht mehr gebraucht. */
-
-  name[3] = "Dieter";
-
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/dynmem-6.c b/20200116/dynmem-6.c
deleted file mode 100644
index b80cd7fa18551d2046a2aa77e7f4d1bc74157f0b..0000000000000000000000000000000000000000
--- a/20200116/dynmem-6.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-  name = realloc (name, 4 * sizeof (char));
-  name[3] = "Dieter";        /* Fehler: ^ "*" vergessen; zu wenig Speicher */
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/dynmem-7.c b/20200116/dynmem-7.c
deleted file mode 100644
index 414a24a14321085196c5c2887f3c7d90e7c81e01..0000000000000000000000000000000000000000
--- a/20200116/dynmem-7.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anton";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-  name = realloc (name, 4 * sizeof (char *));
-  name[3] = "Dieter";
-  for (int i = 0; i < 4; i++)
-    printf ("%s\n", name[i]);
-  free (name);
-  return 0;
-}
diff --git a/20200116/hp-20200116.pdf b/20200116/hp-20200116.pdf
deleted file mode 100644
index 84ce95667edd1658a8f2ec1fc34804d4f0ca70e9..0000000000000000000000000000000000000000
Binary files a/20200116/hp-20200116.pdf and /dev/null differ
diff --git a/20200116/hp-20200116.tex b/20200116/hp-20200116.tex
deleted file mode 100644
index f7797183646fd8c6051b65cfdd6ad2eebc138517..0000000000000000000000000000000000000000
--- a/20200116/hp-20200116.tex
+++ /dev/null
@@ -1,940 +0,0 @@
-% hp-20200116.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: objektorientierte Programmierung, dynamische Speicherverwaltung
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{tikz}
-\usepackage{rotating}
-
-\usefonttheme[onlymath]{serif}
-
-\definecolor{medcyan}{rgb}{0.0,0.5,0.7}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{16.\ Januar 2020}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \color{medcyan}
-        \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer
-        \vspace*{1pt}
-        \color{medgreen}
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[6.0] Dynamische Speicherverwaltung
-        \color{medgreen}
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \color{red}
-        \item[6.3] Unions
-        \item[6.4] Virtuelle Methoden
-        \color{black}
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{4}
-\section{Algorithmen}
-\setcounter{subsection}{1}
-\subsection{Rekursion}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Vollständige Induktion:
-  \vspace*{-0.725cm}
-  \begin{displaymath}
-    \hspace*{4cm}
-    \left.
-      \begin{array}{r}
-        \mbox{Aussage gilt für $n = 1$}\\[2pt]
-        \mbox{Schluß von $n - 1$ auf $n$}
-      \end{array}
-    \right\}
-    \mbox{Aussage gilt für alle $n\in\mathbb{N}$}
-  \end{displaymath}
-  \vspace*{-0.5cm}
-
-  \pause
-
-  Türme von Hanoi
-
-  \begin{onlyenv}<2>
-    \begin{center}
-      \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg}
-    \end{center}
-  \end{onlyenv}
-
-  \begin{onlyenv}<3->
-    \begin{itemize}
-      \item
-        64 Scheiben, 3 Plätze,
-        \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\
-        immer 1 Scheibe verschieben
-      \item
-        Ziel: Turm verschieben
-      \item
-        Es dürfen nur kleinere Scheiben\\
-        auf größeren liegen.
-      \bigskip
-      \pause
-      \pause
-      \item
-        $n = 1$ Scheibe: fertig
-      \item
-        Wenn $n - 1$ Scheiben verschiebbar:\\
-        schiebe $n - 1$ Scheiben auf Hilfsplatz,\\
-        verschiebe die darunterliegende,\\
-        hole $n - 1$ Scheiben von Hilfsplatz
-    \end{itemize}
-    \begin{onlyenv}<5>
-      \vspace{-4.3cm}
-      \begin{lstlisting}[gobble=8,xleftmargin=6.4cm]
-        void move (int from, int to, int disks)
-        {
-          if (disks == 1)
-            move_one_disk (from, to);
-          else
-            {
-              int help = 0 + 1 + 2 - from - to;
-              move (from, help, disks - 1);
-              move (from, to, 1);
-              move (help, to, disks - 1);
-            }
-        }
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<6->
-      \vspace{-5.0cm}
-      \hspace*{7.4cm}\begin{minipage}[t]{5cm}
-        32 Scheiben:
-        \begin{lstlisting}[gobble=10,style=terminal]
-          $ ¡time ./hanoi-9a¿
-          ...
-          real    0m32,712s
-          user    0m32,708s
-          sys     0m0,000s
-        \end{lstlisting}
-        \pause[7]
-        \begin{itemize}
-          \arrowitem
-            etwas über 1 Minute\\
-            für 64 Scheiben
-        \end{itemize}
-        \pause
-        \vspace*{-0.5cm}
-        \begin{picture}(0,0)
-          \color{red}
-          \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}}
-          \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}}
-        \end{picture}
-
-        Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-        % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-        \begin{itemize}
-          \arrowitem
-            $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-            Jahre\\[\smallskipamount]
-            für 64 Scheiben
-        \end{itemize}
-      \end{minipage}
-    \end{onlyenv}
-  \end{onlyenv}
-
-\end{frame}
-
-\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse}
-
-\begin{frame}[fragile]
-
-%  \newcommand{\w}{\hspace*{0.75pt}}
-
-  \showsubsection
-
-  \begin{picture}(0,0)
-    \put(7.6,-0.5){%
-      \begin{minipage}[t]{5.3cm}
-%        \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf}
-        \vspace*{-1.0cm}\alt<6->{\includegraphics{landau-symbols-3.pdf}}%
-                       {\alt<5->{\includegraphics{landau-symbols-2.pdf}}%
-                                {\includegraphics{landau-symbols.pdf}}}
-        \small
-        \begin{description}\itemsep0pt\leftskip-0.5cm
-          \item[$n$:] Eingabedaten
-          \item[$g(n)$:] Rechenzeit
-        \end{description}
-      \end{minipage}}
-  \end{picture}
-
-  \vspace*{-\bigskipamount}
-
-  Wann ist ein Programm "`schnell"'?
-
-  \medskip
-
-  \begin{onlyenv}<1-2>
-      Türme von Hanoi: $\mathcal{O}(2^n)$
-      \par\medskip
-      Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit!
-      % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859
-      \begin{itemize}
-        \arrowitem
-          $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$
-          Jahre\\[\smallskipamount]
-          für 64 Scheiben
-      \end{itemize}
-
-      \bigskip
-  \end{onlyenv}
-
-  \begin{onlyenv}<2->
-    Faustregel:\\Schachtelung der Schleifen zählen\\
-    $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$
-
-    \bigskip
-  \end{onlyenv}
-
-  \begin{onlyenv}<3>
-    \textbf{Beispiel: Sortieralgorithmen}
-
-    \smallskip
-
-    Anzahl der Vergleiche bei $n$ Strings
-    \begin{itemize}
-      \item
-        Maximum suchen mit Schummeln: $\mathcal{O}(1)$
-      \item
-        Maximum suchen: $\mathcal{O}(n)$
-      \item
-        Selection-Sort: $\mathcal{O}(n^2)$
-      \item
-        Bubble-Sort: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$
-      \item
-        Quicksort: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$
-    \end{itemize}
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<4>
-    \textbf{Wie schnell ist RSA-Verschlüsselung?}
-
-    \smallskip
-
-    \begin{math}
-      c = m^e\,\%\,N
-    \end{math}
-    \quad
-    ("`$\%$"' = "`modulo"')
-
-    \medskip
-
-    \begin{lstlisting}[gobble=6,xleftmargin=2em]
-      int c = 1;
-      for (int i = 0; i < e; i++)
-        c = (c * m) % N;
-    \end{lstlisting}
-
-    \smallskip
-
-    \begin{itemize}
-      \item
-        $\mathcal{O}(e)$ Iterationen
-%      \item
-%        wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist:
-%        $\mathcal{O}(2^n)$ Iterationen
-      \item
-        mit Trick:
-        $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$)
-    \end{itemize}
-
-    \smallskip
-
-    Jede Iteration enthält eine Multiplikation und eine Division.\\
-    Aufwand dafür: $\mathcal{O}(\log e)$\\
-    \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<5->
-
-    \textbf{Wie schnell ist RSA?}\\
-
-    \smallskip
-
-    ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$)
-
-    \begin{itemize}
-      \item
-        Ver- und Entschlüsselung (Exponentiation):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}}
-      \item
-        Schlüsselerzeugung (Berechnung von $d$):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}}
-      \item
-        Verschlüsselung brechen (Primfaktorzerlegung):\\
-        \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss}
-        \only<6->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}}
-    \end{itemize}
-
-    \vspace{0cm plus 1filll}
-
-    \textbf{Die Sicherheit von RSA beruht darauf,
-    daß das Brechen der Verschlüsselung aufwendiger ist als
-    \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).}
-
-    \vspace*{0.65cm}
-
-  \end{onlyenv}
-
-\end{frame}
-
-\section{Objektorientierte Programmierung}
-
-\addtocounter{subsection}{-1}
-\subsection{Dynamische Speicherverwaltung}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-    \item
-      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-  \end{itemize}
-
-  \bigskip
-
-  \begin{lstlisting}
-    char *name[] = { "Anna", "Berthold", "Caesar" };
-
-    ...
-
-     name[3] = "Dieter";
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(0,0){\line(3,1){3.5}}
-    \put(0,1){\line(3,-1){3.5}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdlib.h>
-
-    ...
-
-      char **name = malloc (3 * sizeof (char *));
-        /* Speicherplatz für 3 Zeiger anfordern */
-
-    ...
-
-      free (name)
-        /* Speicherplatz freigeben */
-
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{Konzepte und Ziele}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-%      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-      Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen)
-%    \item
-%      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-  \end{itemize}
-  \begin{itemize}
-    \item
-      Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden}
-    \begin{onlyenv}<1>
-      \item
-        Was die Funktion bewirkt,\\
-        hängt vom Typ des Objekts ab
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \item
-        Was die Funktion bewirkt
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(3.75,0.3);}}
-        \end{picture}%
-        Welche Funktion aufgerufen wird,\\
-        hängt vom Typ des Objekts ab: \newterm{virtuelle Methode}
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten%
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(2.5,0.3);}}
-          \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\
-                           kommt gleich
-%                           nächste Woche
-                         \end{rotate}}
-        \end{picture}
-        Zeiger, die im Objekt gespeichert sind\\
-        (Genaugenommen: Tabelle von Zeigern)
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-    \item
-      \newterm{Methoden\/} und \newterm{virtuelle Methoden}
-  \end{itemize}
-
-  \begin{itemize}
-    \item
-      Zeiger auf verschiedene Strukturen\\
-      mit einem gemeinsamen Anteil von Datenfeldern\\
-      \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten
-    \item
-      Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\
-      \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung}
-    \item
-%      Explizite Typumwandlung eines Zeigers auf die Basisklasse\\
-%      in einen Zeiger auf die \newterm{abgeleitete Klasse}\\
-%      \textarrow\ Man kann ein Array unterschiedlicher Objekte\\
-%      \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\
-      Zeiger auf die Basisklasse dürfen auf Objekte\\
-      der \newterm{abgeleiteten Klasse} zeigen\\
-      \textarrow\ \newterm{Polymorphie}
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Beispiel: Zahlen und Buchstaben}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.7cm]
-    \begin{onlyenv}<1>
-      \begin{minipage}{8cm}
-        \begin{lstlisting}[gobble=10]
-          ¡t_integer i = { 1, 42 };
-          t_string s = { 2, "Hello, world!" };
-
-          t_base *object[] = { (t_base *) &i, (t_base *) &s };¿
-        \end{lstlisting}
-      \end{minipage}%
-      \begin{picture}(0,0)
-        \color{red}
-        \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}}
-      \end{picture}
-    \end{onlyenv}
-%    \begin{onlyenv}<2>
-%      \begin{minipage}{5cm}
-%        \begin{lstlisting}[gobble=10]
-%          ¡typedef union
-%          {
-%            t_base base;
-%            t_integer integer;
-%            t_string string;
-%          } t_object;¿
-%        \end{lstlisting} %      \end{minipage}
-%    \end{onlyenv}
-  \end{center}
-  
-\end{frame}
-
-\subsection{Unions}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        int8_t i;
-        uint8_t u;
-      } num8_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num8_t test;
-        test.i = -1;
-        printf ("%d\n", test.u);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        char s[8];
-        uint64_t x;
-      } num_char_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num_char_t test = { "Hello!" };
-        printf ("%lx\n", test.x);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        t_base base;
-        t_integer integer;
-        t_string string;
-      } t_object;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-      } t_base;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        int content;
-      } t_integer;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        char *content;
-      } t_string;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \bigskip
-
-  \begin{center}
-    \begin{minipage}{8.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡if (this->base.type == T_INTEGER)
-          printf ("Integer: %d\n", this->integer.content);
-        else if (this->base.type == T_STRING)
-          printf ("String: \"%s\"\n", this->string.content);¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-\end{frame}
-
-\subsection{Virtuelle Methoden}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    void print_object (t_object *this)
-    {
-      if (this->base.type == T_INTEGER)
-        printf ("Integer: %d\n", this->integer.content);
-      else if (this->base.type == T_STRING)
-        printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}}
-    \put(1,-2){\mbox{\textarrow}}
-    \put(0,-3){\mbox{Zeiger auf Funktionen}}
-  \end{picture}
-
-  \begin{lstlisting}[xleftmargin=4cm]
-    void print_integer (t_object *this)
-    {
-      printf ("Integer: %d\n", this->integer.content);
-    }
-
-    void print_string (t_object *this)
-    {
-      printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Zeiger auf Funktionen
-
-  \medskip
-
-  \begin{lstlisting}
-    void (* print) (t_object *this);
-  \end{lstlisting}
-  \begin{picture}(0,1.2)(0,-0.9)
-    \color{red}
-    \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}}
-    \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}}
-  \end{picture}
-
-  \begin{itemize}
-    \item
-      Objekt enthält Zeiger auf Funktion
-      \begin{onlyenv}<1>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<2->
-        \vspace*{-3.5cm}  % Why doesn't a picture environment work here??? :-(
-        \begin{lstlisting}[gobble=10,xleftmargin=5.5cm]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-        \vspace*{0.85cm}
-        \bigskip
-        \smallskip
-      \end{onlyenv}
-    \pause
-    \item
-      Konstruktor initialisiert diesen Zeiger
-      \begin{onlyenv}<2>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          t_object *new_integer (int i)
-          {
-            t_object *p = malloc (sizeof (t_integer));
-            p->integer.print = print_integer;
-            p->integer.content = i;
-            return p;
-          }
-        \end{lstlisting}
-        \vspace*{-2cm}
-      \end{onlyenv}
-    \pause
-    \item
-      Aufruf: "`automatisch"' die richtige Funktion
-      \begin{onlyenv}<3>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          for (int i = 0; object[i]; i++)
-            object[i]->base.print (object[i]);
-        \end{lstlisting}
-      \end{onlyenv}
-    \pause
-    \medskip
-    \item
-      in größeren Projekten:\\
-      Objekt enthält Zeiger auf Tabelle von Funktionen
-  \end{itemize}
-\end{frame}
-
-\iffalse
-
-\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \scriptsize
-  \begin{lstlisting}
-    #include <gtk/gtk.h>
-
-    int main (int argc, char **argv)
-    {
-      gtk_init (&argc, &argv);
-      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-      gtk_window_set_title (GTK_WINDOW (window), "Hello");
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-      GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-      gtk_container_add (GTK_CONTAINER (window), vbox);
-      gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
-      GtkWidget *label = gtk_label_new ("Hello, world!");
-      gtk_container_add (GTK_CONTAINER (vbox), label);
-      GtkWidget *button = gtk_button_new_with_label ("Quit");
-      g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-      gtk_container_add (GTK_CONTAINER (vbox), button);
-      gtk_widget_show (button);
-      gtk_widget_show (label);
-      gtk_widget_show (vbox);
-      gtk_widget_show (window);
-      gtk_main ();
-      return 0;
-    }
-  \end{lstlisting}
-
-  \vspace*{-6cm}\strut\hfill
-  \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm]
-  \begin{flushright}
-    \normalsize\bf Praktikumsversuch:\\
-    Objektorientiertes Zeichenprogramm
-  \end{flushright}
-  
-\end{frame}
-
-\subsection{Ausblick: C++}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (...);
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TBase
-        {
-          virtual void print (void);
-        };¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TInteger: public TBase
-        {
-          virtual void print (void);
-          int content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TString: public TBase
-        {
-          virtual void print (void);
-          char *content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\fi
-
-\end{document}
diff --git a/20200116/hp-musterloesung-20200116.pdf b/20200116/hp-musterloesung-20200116.pdf
deleted file mode 100644
index 241351faab1a3617afcff9bab54759db2ccfa30c..0000000000000000000000000000000000000000
Binary files a/20200116/hp-musterloesung-20200116.pdf and /dev/null differ
diff --git a/20200116/hp-musterloesung-20200116.tex b/20200116/hp-musterloesung-20200116.tex
deleted file mode 100644
index 2f5cbdab1e7cad09a280f868d2fef06fe9f9b645..0000000000000000000000000000000000000000
--- a/20200116/hp-musterloesung-20200116.tex
+++ /dev/null
@@ -1,636 +0,0 @@
-% hp-musterloesung-20200116.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 16.\ Januar 2020}
-
-  \exercise{Fakultät}
-
-  Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als:
-  \begin{eqnarray*}
-    1 & \mbox{für} & n = 0, \\
-    n \cdot (n-1)! & \mbox{für} & n > 0.
-  \end{eqnarray*}
-
-  Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$.
-
-  Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv}
-  (Datei: \gitfile{hp}{20200116}{aufgabe-1.c}):
-
-  \begin{lstlisting}
-    int fak (int n)
-    {
-      if (n <= 0)
-        return 1;
-      else
-        return n * fak (n - 1);
-    }
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\
-      d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.
-      \points{3}
-    \item
-      Wie viele Multiplikationen (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-    \item
-      Wieviel Speicherplatz (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.
-      \points{3}
-  \end{enumerate}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\
-      d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.}
-
-      Datei: \gitfile{hp}{20200116}{loesung-1.c}
-      \begin{lstlisting}[gobble=8]
-        int fak (int n)
-        {
-          int f = 1;
-          for (int i = 2; i <= n; i++)
-            f *= i;
-          return f;
-        }
-      \end{lstlisting}
-
-    \item[(b)]
-      \textbf{Wie viele Multiplikationen (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.}
-
-      In beiden Fällen werden $n$ Zahlen miteinander multipliziert --
-      oder $n - 1$, wenn man Multiplikationen mit 1 ausspart.
-      In jedem Fall hängt die Anzahl der Multiplikationen
-      linear von $n$ ab; es sind $\mathcal{O}(n)$ Multiplikationen.
-      Insbesondere arbeiten also beide Versionen gleich schnell.
-
-    \item[(c)]
-      \textbf{Wieviel Speicherplatz (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.}
-
-      Die iterative Version der Funktion benötigt 2 Variable vom Typ \lstinline{int},
-      nämlich \lstinline{n} und \lstinline{f}.
-      Dies ist eine konstante Zahl;
-      der Speicherplatzverbrauch ist daher $\mathcal{O}(1)$.
-
-      Die rekursive Version der Funktion erzeugt
-      jedesmal, wenn sie sich selbst aufruft,
-      eine zusätzliche Variable \lstinline{n}.
-      Es sind $n + 1$ Aufrufe; die Anzahl der Variablen \lstinline{n}
-      hängt linear von $n$ ab; der Speicherplatzverbrauch ist also $\mathcal{O}(n)$.
-  \end{itemize}
-
-  \exercise{Länge von Strings}
-
-  Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der
-  Übung vom 14.\ November 2019,\\
-  ergänzt um die Teilaufgaben (f) und (g).
-
-  \medskip
-
-  Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Beispiel: \lstinline{char *hello_world = "Hello, world!\n"}
-
-  Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\
-  zur Verfügung (\lstinline{#include <string.h>}).
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Auf welche Weise ist die Länge eines Strings gekennzeichnet?
-      \points{1}
-    \item
-      Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?\\
-      \points{2}
-    \item
-      Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.\\
-      \points{3}
-  \end{enumerate}
-
-  \goodbreak
-
-  Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20200116}{aufgabe-2.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s)
-        {
-          int x = 0;
-          for (int i = 0; i < strlen (s); i++)
-            x += s[i];
-          return x;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{6cm}
-      \vspace*{-1cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_2 (char *s)
-        {
-          int i = 0, x = 0;
-          int len = strlen (s);
-          while (i < len)
-            x += s[i++];
-          return x;
-        }
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{minipage}
-  \end{center}
-  \begin{enumerate}[\quad(a)]\setcounter{enumi}{3}
-    \item
-      Was bewirken die beiden Funktionen?
-      \points{2}
-    \item
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\
-      nur effizienter.
-      \points{4}
-    \item
-      Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String?
-      Begründen Sie Ihre Antwort.
-      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.
-       \points{3}
-    \item
-      Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\
-      Begründen Sie Ihre Antwort.
-      \points{1}
-  \end{enumerate}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?}
-
-      Ein String ist ein Array von \lstinline{char}s.
-      Nach den eigentlichen Zeichen des Strings enthält das Array
-      \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0,
-      nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung.
-      Die Länge eines Strings ist die Anzahl der Zeichen
-      \emph{vor\/} diesem Symbol.
-
-    \item[(b)]
-      {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?}
-
-      Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen;
-      das Null-Symbol, das das Ende markiert, zählt hier nicht mit)
-      und belegt Speicherplatz für 15 Zeichen
-      (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung).
-
-    \item[(c)]
-      \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.}
-
-      Siehe die Dateien \gitfile{hp}{20181105}{loesung-2c-1.c} (mit Array-Index)
-      und \gitfile{hp}{20181105}{loesung-2c-2.c} (mit Zeiger-Arithmetik).
-      Beide Lösungen sind korrekt und arbeiten gleich schnell.
-
-      Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"}
-      kann normalerweise ignoriert werden;
-      auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()}
-      beim Linken Vorrang vor der selbstgeschriebenen,
-      so daß die selbstgeschriebene Funktion nie aufgerufen wird.
-      In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion
-      anders zu nennen (z.\,B.\ \lstinline{my_strlen()}).
-
-    \item[(d)]
-      \textbf{Was bewirken die beiden Funktionen?}
-
-      Beide addieren die Zahlenwerte der im String enthaltenen Zeichen
-      und geben die Summe als Funktionsergebnis zurück.
-
-      Im Falle des Test-Strings \lstinline{"Hello, world!\n"}
-      lautet der Rückgabewert 1171 (siehe \gitfile{hp}{20181105}{loesung-2d-1.c} und \gitfile{hp}{20181105}{loesung-2d-2.c}).
-
-    \item[(e)]
-      \textbf{Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},
-      nur effizienter.}
-
-      Die Funktion wird effizienter,
-      wenn man auf den Aufruf von \lstinline{strlen()} verzichtet
-      und stattdessen die Ende-Prüfung in derselben Schleife vornimmt,
-      in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert.
-
-      Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{20181105}{loesung-2e-1.c}
-      realisiert dies mit einem Array-Index,
-      Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{20181105}{loesung-2e-2.c}
-      mit Zeiger-Arithmetik.
-      Beide Lösungen sind korrekt und arbeiten gleich schnell.
-
-      \textbf{Bemerkung:} Die effizientere Version der Funktion
-      arbeitet doppelt so schnell wie die ursprüngliche,
-      hat aber ebenfalls die Ordnung $\mathcal{O}(n)$ -- siehe unten.
-
-    \item[(f)]
-      \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String?
-      Begründen Sie Ihre Antwort.
-      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.}
-
-      Vorüberlegung: \lstinline{strlen()} greift in einer Schleife
-      auf alle Zeichen des Strings der Länge $n$ zu,
-      hat also $\mathcal{O}(n)$.
-
-      \lstinline{fun_1()} ruft in jedem Schleifendurchlauf
-      (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf
-      und greift anschließend auf ein Zeichen des Strings zu,
-      hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$.
-
-      \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf
-      und greift anschließend in einer Schleife auf alle Zeichen des Strings zu,
-      hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$.
-
-    \item[(g)]
-      \textbf{Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\
-      Begründen Sie Ihre Antwort.}
-
-      In beiden o.\,a.\ Lösungsvarianten
-      -- \gitfile{hp}{20181105}{loesung-2e-1.c}
-      und \gitfile{hp}{20181105}{loesung-2e-2.c} --
-      arbeitet die Funktion mit einer einzigen Schleife,
-      die gleichzeitig die Zahlenwerte addiert und das Ende des Strings sucht.
-
-      Mit jeweils einer einzigen Schleife
-      haben beide Funktionen die Ordnung $\mathcal{O}(n)$.
-
-  \end{itemize}
-
-  \exercise{Objektorientierte Tier-Datenbank}
-
-  Das auf der nächsten Seite in Blau dargestellte Programm (Datei: \gitfile{hp}{20200116}{aufgabe-3a.c})\\
-  soll Daten von Tieren verwalten.
-
-  Beim Compilieren erscheinen die folgende Fehlermeldungen:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿
-    aufgabe-2a.c: In function 'main':
-    aufgabe-2a.c:31: error: 'animal' has no member named 'wings'
-    aufgabe-2a.c:37: error: 'animal' has no member named 'legs'
-  \end{lstlisting}
-
-  Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\
-  (Datei: \gitfile{hp}{20200116}{aufgabe-3b.c}).
-  Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿
-    $ ¡./aufgabe-2b¿
-    A duck has 2 legs.
-    Error in animal: cow
-  \end{lstlisting}
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.
-      \points{2}
-    \item[(b)]
-      Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?
-      \points{3}
-    \item[(c)]
-      Erklären Sie die Ausgabe des Programms.
-      \points{5}
-    \item[(d)]
-      Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg,
-      das Programm so zu berichtigen, daß es die Eingabedaten
-      (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\
-      \points{4}
-%    \item[(e)]
-%      Schreiben Sie das Programm so um,
-%      daß es keine expliziten Typumwandlungen mehr benötigt.\par
-%      Hinweis: Verwenden Sie \lstinline{union}.
-%      \points{4}
-%    \item[(f)]
-%      Schreiben Sie das Programm weiter um,
-%      so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow}
-%      dynamisch erzeugt.\par
-%      Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.
-%      \points{4}
-%    \item[(g)]
-%      Schreiben Sie das Programm weiter um,
-%      so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt,
-%      sondern stattdessen eine virtuelle Methode \lstinline{print()}
-%      aufgerufen wird.\par
-%      Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen,
-%      und initialisieren Sie diese in den Konstruktoren.
-%      \points{4}
-  \end{itemize}
-
-  \begin{minipage}[t]{0.34\textwidth}
-    \begin{lstlisting}[gobble=6,xleftmargin=0pt]
-      #include <stdio.h>
-
-      #define ANIMAL     0
-      #define WITH_WINGS 1
-      #define WITH_LEGS  2
-
-      typedef struct animal
-      {
-        int type;
-        char *name;
-      } animal;
-
-      typedef struct with_wings
-      {
-        int wings;
-      } with_wings;
-
-      typedef struct with_legs
-      {
-        int legs;
-      } with_legs;
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.65\textwidth}
-    \begin{lstlisting}[gobble=6,xleftmargin=0pt]
-      int main (void)
-      {
-        animal *a[2];
-
-        animal duck;
-        a[0] = &duck;
-        a[0]->type = WITH_WINGS;
-        a[0]->name = "duck";
-        a[0]->wings = 2;
-
-        animal cow;
-        a[1] = &cow;
-        a[1]->type = WITH_LEGS;
-        a[1]->name = "cow";
-        a[1]->legs = 4;
-
-        for (int i = 0; i < 2; i++)
-          if (a[i]->type == WITH_LEGS)
-            printf ("A %s has %d legs.\n", a[i]->name,
-                    ((with_legs *) a[i])-> legs);
-          else if (a[i]->type == WITH_WINGS)
-            printf ("A %s has %d wings.\n", a[i]->name,
-                    ((with_wings *) a[i])-> wings);
-          else
-            printf ("Error in animal: %s\n", a[i]->name);
-
-        return 0;
-      }
-    \end{lstlisting}
-    \begin{picture}(0,0)
-      \color{red}
-      \put(3.7,6.207){\vector(-1,0){0.7}}
-      \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}}
-      \put(4.0,8.735){\vector(-1,0){0.7}}
-      \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}}
-    \end{picture}
-  \end{minipage}
-
-  \solution
-
-  \begin{itemize}
-    \item[(a)]
-      \textbf{Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.}
-
-      \lstinline{a[0]} und \lstinline{a[1]}
-      sind gemäß der Deklaration \lstinline{animal *a[2]}
-      Zeiger auf Variablen vom Typ \lstinline{animal} (ein \lstinline{struct}).
-      Wenn man diesen Zeiger dereferenziert (\lstinline{->}),
-      erhält man eine \lstinline{animal}-Variable.
-      Diese enthält keine Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}.
-
-    \item[(b)]
-      \textbf{Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?}
-
-      Durch die \emph{explizite Typumwandlung des Zeigers\/}
-      erhalten wir einen Zeiger auf eine \lstinline{with_wings}-
-      bzw.\ auf eine \lstinline{with_legs}-Variable.
-      Diese enthalten die Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}.
-
-    \item[(c)]
-      \textbf{Erklären Sie die Ausgabe des Programms.}
-
-      Durch die explizite Typumwandlung des Zeigers
-      zeigt \lstinline{a[0]} auf eine \lstinline{with_wings}-Variable.
-      Diese enthält nur ein einziges Datenfeld \lstinline{wings},
-      das an genau derselben Stelle im Speicher liegt
-      wie \lstinline{a[0]->type}, also das Datenfeld \lstinline{type}
-      der \lstinline{animal}-Variable, auf die der Zeiger \lstinline{a[0]} zeigt.
-      Durch die Zuweisung der Zahl \lstinline{2}
-      an \lstinline{((with_wings *) a[0])->wings}
-      überschreiben wir also \lstinline{a[0]->type},
-      so daß das \lstinline{if} in der \lstinline{for}-Schleife
-      \lstinline{a[0]} als \lstinline{WITH_LEGS} erkennt.
-
-      Bei der Ausgabe \lstinline[style=terminal]{A duck has 2 legs.}
-      wird das Datenfeld \lstinline{((with_legs *)a[0])->legs} als Zahl ausgegeben.
-      Dieses Datenfeld befindet sich in denselben Speicherzellen wie
-      \lstinline{a[0]->type} und \lstinline{((with_wings *)} % :-(
-      \lstinline{a[0]->wings}
-      und hat daher ebenfalls den Wert 2.
-
-      Auf die gleiche Weise überschreiben wir durch die Zuweisung der Zahl 4
-      an \lstinline{((with_legs *) a[1])->legs}
-      das Datenfeld \lstinline{a[0]->type},
-      so daß das \lstinline{if} in der \lstinline{for}-Schleife
-      \lstinline{a[1]} als unbekanntes Tier (Nr.\ 4) erkennt und
-      \lstinline[style=terminal]{Error in animal: cow} ausgibt.
-
-    \item[(d)]
-      \textbf{Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg,
-      das Programm so zu berichtigen, daß es die Eingabedaten
-      (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.}
-
-      Damit die \emph{Vererbung\/} zwischen den Objekten
-      \lstinline{animal}, \lstinline{with_wings} und \lstinline{with_legs}
-      funktioniert, müssen die abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs}
-      alle Datenfelder der Basisklasse \lstinline{animal} erben.
-      In C geschieht dies explizit; die Datenfelder müssen in den
-      abgeleiteten Klassen neu angegeben werden
-      (siehe \gitfile{hp}{20200116}{loesung-3d-1.c}):
-
-      \begin{lstlisting}[gobble=8]
-        typedef struct animal
-        {
-          int type;
-          char *name;
-        } animal;
-
-        typedef struct with_wings
-        {
-          int type;
-          char *name;
-          int wings;
-        } with_wings;
-
-        typedef struct with_legs
-        {
-          int type;
-          char *name;
-          int legs;
-        } with_legs;
-      \end{lstlisting}
-
-      Zusätzlich ist es notwendig,
-      die Instanzen \lstinline{duck} und \lstinline{cow}
-      der abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs}
-      auch als solche zu deklarieren,
-      damit für sie genügend Speicher reserviert wird:
-
-      \begin{lstlisting}[gobble=8]
-        animal *a[2];
-
-        with_wings duck;
-        a[0] = (animal *) &duck;
-        a[0]->type = WITH_WINGS;
-        a[0]->name = "duck";
-        ((with_wings *) a[0])->wings = 2;
-
-        with_legs cow;
-        a[1] = (animal *) &cow;
-        a[1]->type = WITH_LEGS;
-        a[1]->name = "cow";
-        ((with_legs *) a[1])->legs = 4;
-      \end{lstlisting}
-
-      Wenn man dies vergißt und sie nur als \lstinline{animal} deklariert,
-      wird auch nur Speicherplatz für (kleinere)
-      \lstinline{animal}-Variable angelegt.
-      Dadurch kommt es zu Speicherzugriffen außerhalb der
-      deklarierten Variablen, was letztlich zu einem Absturz führt
-      (siehe \gitfile{hp}{20200116}{loesung-3d-0f.c}).
-
-      Für die Zuweisung eines Zeigers auf \lstinline{duck}
-      an \lstinline{a[0]}, also an einen Zeiger auf \lstinline{animal}
-      wird eine weitere explizite Typumwandlung notwendig.
-      Entsprechendes gilt für die Zuweisung eines Zeigers auf \lstinline{cow}
-      an \lstinline{a[1]}.
-
-      Es ist sinnvoll, explizite Typumwandlungen so weit wie möglich zu vermeiden.
-      Es ist einfacher und gleichzeitig sicherer,
-      direkt in die Variablen \lstinline{duck} und \lstinline{cow}
-      zu schreiben, anstatt dies über die Zeiger \lstinline{a[0]}
-      und \lstinline{a[1]} zu tun
-      (siehe \gitfile{hp}{20200116}{loesung-3d-2.c}):
-
-      \begin{lstlisting}[gobble=8]
-        animal *a[2];
-
-        with_wings duck;
-        a[0] = (animal *) &duck;
-        duck.type = WITH_WINGS;
-        duck.name = "duck";
-        duck.wings = 2;
-
-        with_legs cow;
-        a[1] = (animal *) &cow;
-        cow.type = WITH_LEGS;
-        cow.name = "cow";
-        cow.legs = 4;
-      \end{lstlisting}
-
-    \item[(e)]
-      \textbf{Schreiben Sie das Programm so um,
-      daß es keine expliziten Typumwandlungen mehr benötigt.}\par
-      \textbf{Hinweis: Verwenden Sie \lstinline{union}.}
-
-      Siehe \gitfile{hp}{20200116}{loesung-3e.c}.
-      
-      Diese Lösung basiert auf \gitfile{hp}{20200116}{loesung-3d-2.c},
-      da diese bereits weniger explizite Typumwandlungen enthält
-      als \gitfile{hp}{20200116}{loesung-3d-1.c}.
-
-      Arbeitsschritte:
-      \begin{itemize}
-        \item
-          Umbenennen des Basistyps \lstinline{animal} in \lstinline{base},
-          damit wir den Bezeichner \lstinline{animal}
-          für die \lstinline{union} verwenden können
-        \item
-          Schreiben einer \lstinline{union animal},
-          die die drei Klassen \lstinline{base},
-          \lstinline{with_wings} und \lstinline{with_legs}
-          als Datenfelder enthält
-        \item
-          Umschreiben der Initialisierungen:
-          Zugriff auf Datenfelder erfolgt nun durch
-          z.\,B.\ \lstinline{a[0]->b.name}.
-          Hierbei ist \lstinline{b} der Name des \lstinline{base}-Datenfelds
-          innerhalb der \lstinline{union animal}.
-        \item
-          Auf gleiche Weise schreiben wir die \lstinline{if}-Bedingungen
-          innerhalb der \lstinline{for}-Schleife
-          sowie die Parameter der \lstinline{printf()}-Aufrufe um.
-      \end{itemize}
-      Explizite Typumwandlungen sind nun nicht mehr nötig.
-
-      Nachteil dieser Lösung:
-      Jede Objekt-Variable belegt nun Speicherplatz
-      für die gesamte \lstinline{union animal},
-      anstatt nur für die benötigte Variable vom Typ
-      \lstinline{with_wings} oder \lstinline{with_legs}.
-      Dies kann zu einer Verschwendung von Speicherplatz führen,
-      auch wenn dies in diesem Beispielprogramm tatsächlich nicht der Fall ist.
-
-    \item[(f)]
-      \textbf{Schreiben Sie das Programm weiter um,
-      so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow}
-      dynamisch erzeugt.}\par
-      \textbf{Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.}
-
-      Siehe \gitfile{hp}{20200116}{loesung-3f.c}.
-
-    \item[(g)]
-      \textbf{Schreiben Sie das Programm weiter um,
-      so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt,
-      sondern stattdessen eine virtuelle Methode \lstinline{print()}
-      aufgerufen wird.}\par
-      \textbf{Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen,
-      und initialisieren Sie diese in den Konstruktoren.}
-
-      Siehe \gitfile{hp}{20200116}{loesung-3g.c}.
-
-  \end{itemize}
-
-\end{document}
diff --git a/20200116/hp-uebung-20200116.pdf b/20200116/hp-uebung-20200116.pdf
deleted file mode 100644
index cdb02e0f9acd51366d371fc41b1e89663e00b20a..0000000000000000000000000000000000000000
Binary files a/20200116/hp-uebung-20200116.pdf and /dev/null differ
diff --git a/20200116/hp-uebung-20200116.tex b/20200116/hp-uebung-20200116.tex
deleted file mode 100644
index fda26a8e623cfb5d0e13526a30eb4a10a80cb683..0000000000000000000000000000000000000000
--- a/20200116/hp-uebung-20200116.tex
+++ /dev/null
@@ -1,297 +0,0 @@
-% hp-uebung-20200116.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 16.\ Januar 2020}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  19 Punkte (von insgesamt \totalpoints) erreichen.
-  (Davon entfallen 12 Punkte, entsprechend 30 Minuten,
-  auf die bereits früher gestellte Aufgabe 2, Teilaufgaben (a) bis (e).)
-
-  \exercise{Fakultät}
-
-  Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als:
-  \begin{eqnarray*}
-    1 & \mbox{für} & n = 0, \\
-    n \cdot (n-1)! & \mbox{für} & n > 0.
-  \end{eqnarray*}
-
-  Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$.
-
-  Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv}
-  (Datei: \gitfile{hp}{20200116}{aufgabe-1.c}):
-
-  \begin{lstlisting}
-    int fak (int n)
-    {
-      if (n <= 0)
-        return 1;
-      else
-        return n * fak (n - 1);
-    }
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\
-      d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.
-      \points{3}
-    \item
-      Wie viele Multiplikationen (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.
-      \points{2}
-    \item
-      Wieviel Speicherplatz (Landau-Symbol)
-      erfordern beide Versionen der Fakultätsfunktion\\
-      in Abhängigkeit von \lstinline$n$?
-      Begründen Sie Ihre Antwort.
-      \points{3}
-  \end{enumerate}
-
-  \exercise{Länge von Strings}
-
-  Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der
-  Übung vom 14.\ November 2019,\\
-  ergänzt um die Teilaufgaben (f) und (g).
-
-  \medskip
-
-  Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Beispiel: \lstinline{char *hello_world = "Hello, world!\n"}
-
-  Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\
-  zur Verfügung (\lstinline{#include <string.h>}).
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Auf welche Weise ist die Länge eines Strings gekennzeichnet?
-      \points{1}
-    \item
-      Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"},
-      und wieviel Speicherplatz belegt sie?\\
-      \points{2}
-    \item
-      Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)},
-      die die Länge eines Strings zurückgibt.\\
-      \points{3}
-  \end{enumerate}
-
-  \goodbreak
-
-  Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20200116}{aufgabe-2.c}):
-  \begin{center}
-    \begin{minipage}{8cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_1 (char *s)
-        {
-          int x = 0;
-          for (int i = 0; i < strlen (s); i++)
-            x += s[i];
-          return x;
-        }
-      \end{lstlisting}
-    \end{minipage}%
-    \begin{minipage}{6cm}
-      \vspace*{-1cm}
-      \begin{lstlisting}[gobble=8]
-        int fun_2 (char *s)
-        {
-          int i = 0, x = 0;
-          int len = strlen (s);
-          while (i < len)
-            x += s[i++];
-          return x;
-        }
-      \end{lstlisting}
-      \vspace*{-1cm}
-    \end{minipage}
-  \end{center}
-  \begin{enumerate}[\quad(a)]\setcounter{enumi}{3}
-    \item
-      Was bewirken die beiden Funktionen?
-      \points{2}
-    \item
-      Schreiben Sie eine eigene Funktion,
-      die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\
-      nur effizienter.
-      \points{4}
-    \item
-      Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen
-      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String?
-      Begründen Sie Ihre Antwort.
-      Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.
-       \points{3}
-    \item
-      Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\
-      Begründen Sie Ihre Antwort.
-      \points{1}
-  \end{enumerate}
-
-  \exercise{Objektorientierte Tier-Datenbank}
-
-  Das auf der nächsten Seite in Blau dargestellte Programm (Datei: \gitfile{hp}{20200116}{aufgabe-3a.c})\\
-  soll Daten von Tieren verwalten.
-
-  Beim Compilieren erscheinen die folgende Fehlermeldungen:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿
-    aufgabe-2a.c: In function 'main':
-    aufgabe-2a.c:31: error: 'animal' has no member named 'wings'
-    aufgabe-2a.c:37: error: 'animal' has no member named 'legs'
-  \end{lstlisting}
-
-  Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\
-  (Datei: \gitfile{hp}{20200116}{aufgabe-3b.c}).
-  Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿
-    $ ¡./aufgabe-2b¿
-    A duck has 2 legs.
-    Error in animal: cow
-  \end{lstlisting}
-
-  \begin{itemize}
-    \item[(a)]
-      Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.
-      \points{2}
-    \item[(b)]
-      Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?
-      \points{3}
-    \item[(c)]
-      Erklären Sie die Ausgabe des Programms.
-      \points{5}
-    \item[(d)]
-      Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg,
-      das Programm so zu berichtigen, daß es die Eingabedaten
-      (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\
-      \points{4}
-%    \item[(e)]
-%      Schreiben Sie das Programm so um,
-%      daß es keine expliziten Typumwandlungen mehr benötigt.\par
-%      Hinweis: Verwenden Sie \lstinline{union}.
-%      \points{4}
-%    \item[(f)]
-%      Schreiben Sie das Programm weiter um,
-%      so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow}
-%      dynamisch erzeugt.\par
-%      Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.
-%      \points{4}
-%    \item[(g)]
-%      Schreiben Sie das Programm weiter um,
-%      so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt,
-%      sondern stattdessen eine virtuelle Methode \lstinline{print()}
-%      aufgerufen wird.\par
-%      Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen,
-%      und initialisieren Sie diese in den Konstruktoren.
-%      \points{4}
-  \end{itemize}
-
-  \begin{minipage}[t]{0.34\textwidth}
-    \begin{lstlisting}[gobble=6,xleftmargin=0pt]
-      #include <stdio.h>
-
-      #define ANIMAL     0
-      #define WITH_WINGS 1
-      #define WITH_LEGS  2
-
-      typedef struct animal
-      {
-        int type;
-        char *name;
-      } animal;
-
-      typedef struct with_wings
-      {
-        int wings;
-      } with_wings;
-
-      typedef struct with_legs
-      {
-        int legs;
-      } with_legs;
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.65\textwidth}
-    \begin{lstlisting}[gobble=6,xleftmargin=0pt]
-      int main (void)
-      {
-        animal *a[2];
-
-        animal duck;
-        a[0] = &duck;
-        a[0]->type = WITH_WINGS;
-        a[0]->name = "duck";
-        a[0]->wings = 2;
-
-        animal cow;
-        a[1] = &cow;
-        a[1]->type = WITH_LEGS;
-        a[1]->name = "cow";
-        a[1]->legs = 4;
-
-        for (int i = 0; i < 2; i++)
-          if (a[i]->type == WITH_LEGS)
-            printf ("A %s has %d legs.\n", a[i]->name,
-                    ((with_legs *) a[i])-> legs);
-          else if (a[i]->type == WITH_WINGS)
-            printf ("A %s has %d wings.\n", a[i]->name,
-                    ((with_wings *) a[i])-> wings);
-          else
-            printf ("Error in animal: %s\n", a[i]->name);
-
-        return 0;
-      }
-    \end{lstlisting}
-    \begin{picture}(0,0)
-      \color{red}
-      \put(3.7,6.207){\vector(-1,0){0.7}}
-      \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}}
-      \put(4.0,8.735){\vector(-1,0){0.7}}
-      \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}}
-    \end{picture}
-  \end{minipage}
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20200116/landau-symbols-2.pdf b/20200116/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20200116/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20200116/landau-symbols-3.pdf b/20200116/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20200116/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20200116/landau-symbols.pdf b/20200116/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20200116/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20200116/loesung-1.c b/20200116/loesung-1.c
deleted file mode 100644
index c2d6f6003924627ae97831407c191eaac42a09c1..0000000000000000000000000000000000000000
--- a/20200116/loesung-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int fak (int n)
-{
-  int f = 1;
-  for (int i = 2; i <= n; i++)
-    f *= i;
-  return f;
-}
-
-int main (void)
-{
-  for (int n = 0; n <= 5; n++)
-    printf ("%d\n", fak (n));
-  return 0;
-}
diff --git a/20200116/loesung-2c-1.c b/20200116/loesung-2c-1.c
deleted file mode 100644
index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000
--- a/20200116/loesung-2c-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  int l = 0;
-  while (s[l])
-    l++;
-  return l;
-}
-
-int main (void)
-{
-  printf ("%d\n", strlen ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-2c-2.c b/20200116/loesung-2c-2.c
deleted file mode 100644
index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000
--- a/20200116/loesung-2c-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  char *s0 = s;
-  while (*s)
-    s++;
-  return s - s0;
-}
-
-int main (void)
-{
-  printf ("%d\n", strlen ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-2d-1.c b/20200116/loesung-2d-1.c
deleted file mode 100644
index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000
--- a/20200116/loesung-2d-1.c
+++ /dev/null
@@ -1,34 +0,0 @@
-
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  int l = 0;
-  while (s[l])
-    l++;
-  return l;
-}
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_1 ("Hello, world!\n"));
-  printf ("%d\n", fun_2 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-2d-2.c b/20200116/loesung-2d-2.c
deleted file mode 100644
index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000
--- a/20200116/loesung-2d-2.c
+++ /dev/null
@@ -1,34 +0,0 @@
-
-#include <stdio.h>
-
-int strlen (char *s)
-{
-  char *s0 = s;
-  while (*s)
-    s++;
-  return s - s0;
-}
-
-int fun_1 (char *s)
-{
-  int x = 0;
-  for (int i = 0; i < strlen (s); i++)
-    x += s[i];
-  return x;
-}
-
-int fun_2 (char *s)
-{
-  int i = 0, x = 0;
-  int len = strlen (s);
-  while (i < len)
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_1 ("Hello, world!\n"));
-  printf ("%d\n", fun_2 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-2e-1.c b/20200116/loesung-2e-1.c
deleted file mode 100644
index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000
--- a/20200116/loesung-2e-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int fun_3 (char *s)
-{
-  int i = 0, x = 0;
-  while (s[i])
-    x += s[i++];
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_3 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-2e-2.c b/20200116/loesung-2e-2.c
deleted file mode 100644
index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000
--- a/20200116/loesung-2e-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int fun_4 (char *s)
-{
-  int x = 0;
-  while (*s)
-    x += *s++;
-  return x;
-}
-
-int main (void)
-{
-  printf ("%d\n", fun_4 ("Hello, world!\n"));
-  return 0;
-}
diff --git a/20200116/loesung-3d-0f.c b/20200116/loesung-3d-0f.c
deleted file mode 100644
index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000
--- a/20200116/loesung-3d-0f.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct animal
-{
-  int type;
-  char *name;
-} animal;
-
-typedef struct with_wings
-{
-  int type;
-  char *name;
-  int wings;
-} with_wings;
-
-typedef struct with_legs
-{
-  int type;
-  char *name;
-  int legs;
-} with_legs;
-
-int main (void)
-{
-  animal *a[2];
-
-  animal duck;
-  a[0] = &duck;
-  a[0]->type = WITH_WINGS;
-  a[0]->name = "duck";
-  ((with_wings *) a[0])->wings = 2;
-
-  animal cow;
-  a[1] = &cow;
-  a[1]->type = WITH_LEGS;
-  a[1]->name = "cow";
-  ((with_legs *) a[1])->legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->name,
-              ((with_legs *) a[i])-> legs);
-    else if (a[i]->type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->name,
-              ((with_wings *) a[i])-> wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->name);
-
-  return 0;
-}
diff --git a/20200116/loesung-3d-1.c b/20200116/loesung-3d-1.c
deleted file mode 100644
index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000
--- a/20200116/loesung-3d-1.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct animal
-{
-  int type;
-  char *name;
-} animal;
-
-typedef struct with_wings
-{
-  int type;
-  char *name;
-  int wings;
-} with_wings;
-
-typedef struct with_legs
-{
-  int type;
-  char *name;
-  int legs;
-} with_legs;
-
-int main (void)
-{
-  animal *a[2];
-
-  with_wings duck;
-  a[0] = (animal *) &duck;
-  a[0]->type = WITH_WINGS;
-  a[0]->name = "duck";
-  ((with_wings *) a[0])->wings = 2;
-
-  with_legs cow;
-  a[1] = (animal *) &cow;
-  a[1]->type = WITH_LEGS;
-  a[1]->name = "cow";
-  ((with_legs *) a[1])->legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->name,
-              ((with_legs *) a[i])-> legs);
-    else if (a[i]->type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->name,
-              ((with_wings *) a[i])-> wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->name);
-
-  return 0;
-}
diff --git a/20200116/loesung-3d-2.c b/20200116/loesung-3d-2.c
deleted file mode 100644
index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000
--- a/20200116/loesung-3d-2.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct animal
-{
-  int type;
-  char *name;
-} animal;
-
-typedef struct with_wings
-{
-  int type;
-  char *name;
-  int wings;
-} with_wings;
-
-typedef struct with_legs
-{
-  int type;
-  char *name;
-  int legs;
-} with_legs;
-
-int main (void)
-{
-  animal *a[2];
-
-  with_wings duck;
-  a[0] = (animal *) &duck;
-  duck.type = WITH_WINGS;
-  duck.name = "duck";
-  duck.wings = 2;
-
-  with_legs cow;
-  a[1] = (animal *) &cow;
-  cow.type = WITH_LEGS;
-  cow.name = "cow";
-  cow.legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->name,
-              ((with_legs *) a[i])-> legs);
-    else if (a[i]->type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->name,
-              ((with_wings *) a[i])-> wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->name);
-
-  return 0;
-}
diff --git a/20200116/loesung-3e.c b/20200116/loesung-3e.c
deleted file mode 100644
index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000
--- a/20200116/loesung-3e.c
+++ /dev/null
@@ -1,61 +0,0 @@
-#include <stdio.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct
-{
-  int type;
-  char *name;
-} base;
-
-typedef struct
-{
-  int type;
-  char *name;
-  int wings;
-} with_wings;
-
-typedef struct
-{
-  int type;
-  char *name;
-  int legs;
-} with_legs;
-
-typedef union
-{
-  base b;
-  with_wings w;
-  with_legs l;
-} animal;
-
-int main (void)
-{
-  animal *a[2];
-
-  animal duck;
-  a[0] = &duck;
-  duck.b.type = WITH_WINGS;
-  duck.b.name = "duck";
-  duck.w.wings = 2;
-
-  animal cow;
-  a[1] = &cow;
-  cow.b.type = WITH_LEGS;
-  cow.b.name = "cow";
-  cow.l.legs = 4;
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->b.type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->b.name,
-              a[i]->l.legs);
-    else if (a[i]->b.type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->b.name,
-              a[i]->w.wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->b.name);
-
-  return 0;
-}
diff --git a/20200116/loesung-3f.c b/20200116/loesung-3f.c
deleted file mode 100644
index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000
--- a/20200116/loesung-3f.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-typedef struct
-{
-  int type;
-  char *name;
-} base;
-
-typedef struct
-{
-  int type;
-  char *name;
-  int wings;
-} with_wings;
-
-typedef struct
-{
-  int type;
-  char *name;
-  int legs;
-} with_legs;
-
-typedef union
-{
-  base b;
-  with_wings w;
-  with_legs l;
-} animal;
-
-animal *new_with_wings (char *name, int wings)
-{
-  animal *a = malloc (sizeof (with_wings));
-  a->b.type = WITH_WINGS;
-  a->b.name = name;
-  a->w.wings = wings;
-  return a;
-}
-
-animal *new_with_legs (char *name, int legs)
-{
-  animal *a = malloc (sizeof (with_legs));
-  a->b.type = WITH_LEGS;
-  a->b.name = name;
-  a->l.legs = legs;
-  return a;
-}
-
-int main (void)
-{
-  animal *a[2] = { new_with_wings ("duck", 2),
-                   new_with_legs ("cow", 4) };
-
-  for (int i = 0; i < 2; i++)
-    if (a[i]->b.type == WITH_LEGS)
-      printf ("A %s has %d legs.\n", a[i]->b.name,
-              a[i]->l.legs);
-    else if (a[i]->b.type == WITH_WINGS)
-      printf ("A %s has %d wings.\n", a[i]->b.name,
-              a[i]->w.wings);
-    else
-      printf ("Error in animal: %s\n", a[i]->b.name);
-
-  return 0;
-}
diff --git a/20200116/loesung-3g.c b/20200116/loesung-3g.c
deleted file mode 100644
index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000
--- a/20200116/loesung-3g.c
+++ /dev/null
@@ -1,77 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define ANIMAL     0
-#define WITH_WINGS 1
-#define WITH_LEGS  2
-
-union animal;
-
-typedef struct
-{
-  int type;
-  char *name;
-  void (*print) (union animal *this);
-} base;
-
-typedef struct
-{
-  int type;
-  char *name;
-  void (*print) (union animal *this);
-  int wings;
-} with_wings;
-
-typedef struct
-{
-  int type;
-  char *name;
-  void (*print) (union animal *this);
-  int legs;
-} with_legs;
-
-typedef union animal
-{
-  base b;
-  with_wings w;
-  with_legs l;
-} animal;
-
-void print_with_wings (animal *this)
-{
-  printf ("A %s has %d wings.\n", this->b.name, this->w.wings);
-}
-
-void print_with_legs (animal *this)
-{
-  printf ("A %s has %d legs.\n", this->b.name, this->l.legs);
-}
-
-animal *new_with_wings (char *name, int wings)
-{
-  animal *a = malloc (sizeof (with_wings));
-  a->b.type = WITH_WINGS;
-  a->b.name = name;
-  a->b.print = print_with_wings;
-  a->w.wings = wings;
-  return a;
-}
-
-animal *new_with_legs (char *name, int legs)
-{
-  animal *a = malloc (sizeof (with_legs));
-  a->b.type = WITH_LEGS;
-  a->b.name = name;
-  a->b.print = print_with_legs;
-  a->l.legs = legs;
-  return a;
-}
-
-int main (void)
-{
-  animal *a[2] = { new_with_wings ("duck", 2),
-                   new_with_legs ("cow", 4) };
-  for (int i = 0; i < 2; i++)
-    a[i]->b.print (a[i]);
-  return 0;
-}
diff --git a/20200116/logo-hochschule-bochum-cvh-text-v2.pdf b/20200116/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20200116/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20200116/logo-hochschule-bochum.pdf b/20200116/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20200116/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20200116/objects-1.c b/20200116/objects-1.c
deleted file mode 100644
index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000
--- a/20200116/objects-1.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { &i, &s };
-
-  return 0;
-}
diff --git a/20200116/objects-10.c b/20200116/objects-10.c
deleted file mode 100644
index ac47c0ed5479be655b7d76aba558526b2dc774a3..0000000000000000000000000000000000000000
--- a/20200116/objects-10.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define T_BASE    0
-#define T_INTEGER 1
-#define T_STRING  2
-
-typedef struct
-{
-  int type;
-  void (* print) (t_object *this);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (t_object *this);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  void (* print) (t_object *this);
-  char *content;
-} t_string;
-
-typedef union
-{
-  t_base base;
-  t_integer integer;
-  t_string string;
-} t_object;
-
-void print_integer (t_object *this)
-{
-  printf ("Integer: %d\n", this->integer.content);
-}
-
-void print_string (t_object *this)
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)
-{
-  t_object *p = malloc (sizeof (t_integer));
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->string.type = T_STRING;
-  p->string.print = print_string;
-  p->string.content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_object *object[] = { new_integer (42),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->base.print (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-11.c b/20200116/objects-11.c
deleted file mode 100644
index a15c8eb239b2315845f24f3b4f111d3670d7ea33..0000000000000000000000000000000000000000
--- a/20200116/objects-11.c
+++ /dev/null
@@ -1,75 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define T_BASE    0
-#define T_INTEGER 1
-#define T_STRING  2
-
-union t_object;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this);
-  char *content;
-} t_string;
-
-typedef union t_object
-{
-  t_base base;
-  t_integer integer;
-  t_string string;
-} t_object;
-
-void print_integer (t_object *this)
-{
-  printf ("Integer: %d\n", this->integer.content);
-}
-
-void print_string (t_object *this)
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)
-{
-  t_object *p = malloc (sizeof (t_integer));
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->string.type = T_STRING;
-  p->string.print = print_string;
-  p->string.content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_object *object[] = { new_integer (42),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->base.print (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-12.c b/20200116/objects-12.c
deleted file mode 100644
index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000
--- a/20200116/objects-12.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-union t_object;
-
-typedef struct
-{
-  void (* print) (union t_object *this);
-} t_base;
-
-typedef struct
-{
-  void (* print) (union t_object *this);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  void (* print) (union t_object *this);
-  char *content;
-} t_string;
-
-typedef union t_object
-{
-  t_base base;
-  t_integer integer;
-  t_string string;
-} t_object;
-
-void print_integer (t_object *this)
-{
-  printf ("Integer: %d\n", this->integer.content);
-}
-
-void print_string (t_object *this)
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)
-{
-  t_object *p = malloc (sizeof (t_integer));
-  p->integer.print = print_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->string.print = print_string;
-  p->string.content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_object *object[] = { new_integer (42),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->base.print (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-13.c b/20200116/objects-13.c
deleted file mode 100644
index 81ef279b060e0b6290194fdeda8c3330cb716cdd..0000000000000000000000000000000000000000
--- a/20200116/objects-13.c
+++ /dev/null
@@ -1,75 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-union t_object;
-struct t_vmt;
-
-typedef struct
-{
-  struct t_vmt *vmt;
-} t_base;
-
-typedef struct
-{
-  struct t_vmt *vmt;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  struct t_vmt *vmt;
-  char *content;
-} t_string;
-
-typedef union t_object
-{
-  t_base base;
-  t_integer integer;
-  t_string string;
-} t_object;
-
-typedef struct t_vmt
-{
-  void (* print) (union t_object *this);
-} t_vmt;
-
-void print_integer (t_object *this)
-{
-  printf ("Integer: %d\n", this->integer.content);
-}
-
-void print_string (t_object *this)
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_vmt vmt_integer = { print_integer };
-t_vmt vmt_string = { print_string };
-
-t_object *new_integer (int i)
-{
-  t_object *p = malloc (sizeof (t_integer));
-  p->integer.vmt = &vmt_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->integer.vmt = &vmt_string;
-  p->string.content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_object *object[] = { new_integer (42),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->base.vmt->print (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-2.c b/20200116/objects-2.c
deleted file mode 100644
index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000
--- a/20200116/objects-2.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  return 0;
-}
diff --git a/20200116/objects-3.c b/20200116/objects-3.c
deleted file mode 100644
index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000
--- a/20200116/objects-3.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", object[i]->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", object[i]->content);
-
-  return 0;
-}
diff --git a/20200116/objects-3a.c b/20200116/objects-3a.c
deleted file mode 100644
index a285a87d72694f5259a8a736ab448383e7004580..0000000000000000000000000000000000000000
--- a/20200116/objects-3a.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { &i, &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", object[i]->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", object[i]->content);
-
-  return 0;
-}
diff --git a/20200116/objects-4.c b/20200116/objects-4.c
deleted file mode 100644
index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000
--- a/20200116/objects-4.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", (t_integer *) object[i]->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", (t_string *) object[i]->content);
-
-  return 0;
-}
diff --git a/20200116/objects-5.c b/20200116/objects-5.c
deleted file mode 100644
index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000
--- a/20200116/objects-5.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    if (object[i]->type == 1)
-      printf ("Integer: %d\n", ((t_integer *) object[i])->content);
-    else if (object[i]->type == 2)
-      printf ("String: \"%s\"\n", ((t_string *) object[i])->content);
-
-  return 0;
-}
diff --git a/20200116/objects-6.c b/20200116/objects-6.c
deleted file mode 100644
index 86847c9085083e2d5093026619550fb272b5f4ec..0000000000000000000000000000000000000000
--- a/20200116/objects-6.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-void print_object (t_base *this)
-{
-  if (this->type == 1)
-    printf ("Integer: %d\n", ((t_integer *) this)->content);
-  else if (this->type == 2)
-    printf ("String: \"%s\"\n", ((t_string *) this)->content);
-}
-
-int main (void)
-{
-  t_integer i = { 1, 42 };
-  t_string s = { 2, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s };
-
-  for (int i = 0; i < 2; i++)
-    print_object (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-7.c b/20200116/objects-7.c
deleted file mode 100644
index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000
--- a/20200116/objects-7.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <stdio.h>
-
-#define T_BASE    0
-#define T_INTEGER 1
-#define T_STRING  2
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-void print_object (t_base *this)
-{
-  if (this->type == T_INTEGER)
-    printf ("Integer: %d\n", ((t_integer *) this)->content);
-  else if (this->type == T_STRING)
-    printf ("String: \"%s\"\n", ((t_string *) this)->content);
-}
-
-int main (void)
-{
-  t_integer i = { T_INTEGER, 42 };
-  t_string s = { T_STRING, "Hello, world!" };
-
-  t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL };
-
-  for (int i = 0; object[i]; i++)
-    print_object (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-8.c b/20200116/objects-8.c
deleted file mode 100644
index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000
--- a/20200116/objects-8.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define T_BASE    0
-#define T_INTEGER 1
-#define T_STRING  2
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-void print_object (t_base *this)
-{
-  if (this->type == T_INTEGER)
-    printf ("Integer: %d\n", ((t_integer *) this)->content);
-  else if (this->type == T_STRING)
-    printf ("String: \"%s\"\n", ((t_string *) this)->content);
-}
-
-t_integer *new_integer (int i)
-{
-  t_integer *p = malloc (sizeof (t_integer));
-  p->type = T_INTEGER;
-  p->content = i;
-  return p;
-}
-
-t_string *new_string (char *s)
-{
-  t_string *p = malloc (sizeof (t_string));
-  p->type = T_STRING;
-  p->content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_base *object[] = { (t_base *) new_integer (42),
-                       (t_base *) new_string ("Hello, world!"),
-                       NULL };
-
-  for (int i = 0; object[i]; i++)
-    print_object (object[i]);
-
-  return 0;
-}
diff --git a/20200116/objects-9.c b/20200116/objects-9.c
deleted file mode 100644
index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000
--- a/20200116/objects-9.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define T_BASE    0
-#define T_INTEGER 1
-#define T_STRING  2
-
-typedef struct
-{
-  int type;
-} t_base;
-
-typedef struct
-{
-  int type;
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  char *content;
-} t_string;
-
-typedef union
-{
-  t_base base;
-  t_integer integer;
-  t_string string;
-} t_object;
-
-void print_object (t_object *this)
-{
-  if (this->base.type == T_INTEGER)
-    printf ("Integer: %d\n", this->integer.content);
-  else if (this->base.type == T_STRING)
-    printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)
-{
-  t_object *p = malloc (sizeof (t_integer));
-  p->integer.type = T_INTEGER;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->string.type = T_STRING;
-  p->string.content = s;
-  return p;
-}
-
-int main (void)
-{
-  t_object *object[] = { new_integer (42),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    print_object (object[i]);
-
-  return 0;
-}
diff --git a/20200116/pgscript.sty b/20200116/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20200116/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20200116/pgslides.sty b/20200116/pgslides.sty
deleted file mode 120000
index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000
--- a/20200116/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../20200102/pgslides.sty
\ No newline at end of file
diff --git a/20200116/unions-1.c b/20200116/unions-1.c
deleted file mode 100644
index b75a6063b50193e13e9a2fd0ce140db6a8827499..0000000000000000000000000000000000000000
--- a/20200116/unions-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef union
-{
-  int8_t i;
-  uint8_t u;
-} num8_t;
-
-int main (void)
-{
-  num8_t test;
-  test.i = -1;
-  printf ("%d\n", test.u);
-  return 0;
-}
diff --git a/20200116/unions-2.c b/20200116/unions-2.c
deleted file mode 100644
index be8562a50395e50e007dc1c0b19b98a476935670..0000000000000000000000000000000000000000
--- a/20200116/unions-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef union
-{
-  char s[8];
-  uint64_t x;
-} num_char_t;
-
-int main (void)
-{
-  num_char_t test = { "Hello!" };
-  printf ("%lx\n", test.x);
-  return 0;
-}
diff --git a/20200123/aufgabe-1.c b/20200123/aufgabe-1.c
deleted file mode 100644
index 82e5b1ca9e2f896bcbec98bc5c34cdf15d086e26..0000000000000000000000000000000000000000
--- a/20200123/aufgabe-1.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = pos; i < stack_pointer; i++)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = 0;
-  while (i < stack_pointer && x < stack[i])
-    i++;
-  insert (x, i);
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  return 0;
-}
diff --git a/20200123/aufgabe-2.c b/20200123/aufgabe-2.c
deleted file mode 100644
index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000
--- a/20200123/aufgabe-2.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-void foreach (int *a, void (*fun) (int x))
-{
-  for (int *p = a; *p >= 0; p++)
-    fun (*p);
-}
-
-void even_or_odd (int x)
-{
-  if (x % 2)
-    printf ("%d ist ungerade.\n", x);
-  else
-    printf ("%d ist gerade.\n", x);
-}
-
-int main (void)
-{
-  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-  foreach (numbers, even_or_odd);
-  return 0;
-}
diff --git a/20200123/ausgabeumleitung.txt b/20200123/ausgabeumleitung.txt
deleted file mode 100644
index 7129bf59114603220059e16b419df562f23a6780..0000000000000000000000000000000000000000
--- a/20200123/ausgabeumleitung.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6
-stack overflow
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6 2>/dev/null
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6 >/dev/null
-stack overflow
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5
-137
-7
-3
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5 2>/dev/null
-137
-7
-3
-cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5 >/dev/null
-cassini/home/peter/bo/2019ws/hp/20200123>
diff --git a/20200123/fifo-1.c b/20200123/fifo-1.c
deleted file mode 100644
index 8bce6c07c152381c11ce367027b980a9330be3e0..0000000000000000000000000000000000000000
--- a/20200123/fifo-1.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  return fifo[0];
-  fifo[0] = fifo[1];
-  fifo[1] = fifo[2];
-  fifo[2] = fifo[3];
-  /* ... */
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-2.c b/20200123/fifo-2.c
deleted file mode 100644
index f95579893f62180b408ecb10756ac8938b3c9848..0000000000000000000000000000000000000000
--- a/20200123/fifo-2.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  fifo[0] = fifo[1];
-  fifo[1] = fifo[2];
-  fifo[2] = fifo[3];
-  /* ... */
-  return fifo[0];
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-3.c b/20200123/fifo-3.c
deleted file mode 100644
index 5214e1b28fb1b060bdaeea7be09e346a644e7f5d..0000000000000000000000000000000000000000
--- a/20200123/fifo-3.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  int result = fifo[0];
-  fifo[0] = fifo[1];
-  fifo[1] = fifo[2];
-  fifo[2] = fifo[3];
-  /* ... */
-  return result;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-4.c b/20200123/fifo-4.c
deleted file mode 100644
index 957d5f18f6c8fe9d7c057db3d2467221b9dc463e..0000000000000000000000000000000000000000
--- a/20200123/fifo-4.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  int result = fifo[0];
-  for (int i = 1; i < FIFO_SIZE; i++)
-    fifo[i - 1] = fifo[i];
-  return result;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-5.c b/20200123/fifo-5.c
deleted file mode 100644
index 092c1cdb5863d5c7bdac98f48ca8527ca3520e6b..0000000000000000000000000000000000000000
--- a/20200123/fifo-5.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  int result = fifo[0];
-  for (int i = 1; i < FIFO_SIZE; i++)
-    fifo[i - 1] = fifo[i];
-  return result;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  push (42);
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-6.c b/20200123/fifo-6.c
deleted file mode 100644
index 2f055d6ce6df4c2fca950192053a6e008bed38b4..0000000000000000000000000000000000000000
--- a/20200123/fifo-6.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_pointer++] = x;
-}
-
-int pop (void)
-{
-  int result = fifo[0];
-  for (int i = 1; i < FIFO_SIZE; i++)
-    fifo[i - 1] = fifo[i];
-  fifo_pointer--;
-  return result;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  push (42);
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-7.c b/20200123/fifo-7.c
deleted file mode 100644
index 0d739115c136639f64c4d98c439af7e4d72fe420..0000000000000000000000000000000000000000
--- a/20200123/fifo-7.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_write_pointer = 0;
-int fifo_read_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_write_pointer++] = x;
-  if (fifo_write_pointer >= FIFO_SIZE)
-    fifo_write_pointer = 0;
-}
-
-int pop (void)
-{
-  int result = fifo[fifo_read_pointer++];
-  if (fifo_read_pointer >= FIFO_SIZE)
-    fifo_read_pointer = 0;
-  return result;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  push (42);
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-8.c b/20200123/fifo-8.c
deleted file mode 100644
index b4ff68713645e0a5782b516071022bf71a8c50ac..0000000000000000000000000000000000000000
--- a/20200123/fifo-8.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_write_pointer = 0;
-int fifo_read_pointer = 0;
-
-void push (int x)
-{
-  fifo[fifo_write_pointer++] = x;
-  if (fifo_write_pointer >= FIFO_SIZE)
-    fifo_write_pointer = 0;
-  if (fifo_write_pointer == fifo_read_pointer)
-    {
-      fprintf (stderr, "fifo overflow\n");
-      exit (1);
-    }
-}
-
-int pop (void)
-{
-  if (fifo_read_pointer == fifo_write_pointer)
-    {
-      fprintf (stderr, "fifo underflow\n");
-      exit (1);
-    }
-  else
-    {
-      int result = fifo[fifo_read_pointer++];
-      if (fifo_read_pointer >= FIFO_SIZE)
-        fifo_read_pointer = 0;
-      return result;
-    }
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  push (42);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/fifo-9.c b/20200123/fifo-9.c
deleted file mode 100644
index 27f77412bac52fd70c52378c25531f03bd93d734..0000000000000000000000000000000000000000
--- a/20200123/fifo-9.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_write_pointer = 0;
-int fifo_read_pointer = 0;
-
-void push (int x)
-{
-  int old_fifo_write_pointer = fifo_write_pointer;
-  fifo_write_pointer++;
-  if (fifo_write_pointer >= FIFO_SIZE)
-    fifo_write_pointer = 0;
-  if (fifo_write_pointer == fifo_read_pointer)
-    {
-      fprintf (stderr, "fifo overflow\n");
-      exit (1);
-    }
-  else
-    fifo[old_fifo_write_pointer] = x;
-}
-
-int pop (void)
-{
-  if (fifo_read_pointer == fifo_write_pointer)
-    {
-      fprintf (stderr, "fifo underflow\n");
-      exit (1);
-    }
-  else
-    {
-      int result = fifo[fifo_read_pointer++];
-      if (fifo_read_pointer >= FIFO_SIZE)
-        fifo_read_pointer = 0;
-      return result;
-    }
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  for (int i = 0; i < 42; i++)
-    push (i);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  push (42);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/hello-gtk.png b/20200123/hello-gtk.png
deleted file mode 120000
index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000
--- a/20200123/hello-gtk.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/hello-gtk.png
\ No newline at end of file
diff --git a/20200123/hp-20200123.pdf b/20200123/hp-20200123.pdf
deleted file mode 100644
index 49af789dfc725f295aafce3c8a8d50e440c467c9..0000000000000000000000000000000000000000
Binary files a/20200123/hp-20200123.pdf and /dev/null differ
diff --git a/20200123/hp-20200123.tex b/20200123/hp-20200123.tex
deleted file mode 100644
index 38285760dbf24d041fc88dab65310ac4a66f071c..0000000000000000000000000000000000000000
--- a/20200123/hp-20200123.tex
+++ /dev/null
@@ -1,1127 +0,0 @@
-% hp-20200123.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Objektorientierte Programmierung, Datenstrukturen
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{tikz}
-\usepackage{rotating}
-
-\usefonttheme[onlymath]{serif}
-
-\definecolor{medcyan}{rgb}{0.0,0.5,0.7}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{23.\ Januar 2020}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[6.0] Dynamische Speicherverwaltung
-        \color{black}
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \color{medgreen}
-        \item[6.3] Unions
-        \item[6.4] Virtuelle Methoden
-        \color{red}
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-      \begin{itemize}
-        \color{red}
-        \item[7.1] Stack und FIFO
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-      \end{itemize}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{5}
-\section{Objektorientierte Programmierung}
-\addtocounter{subsection}{-1}
-\subsection{Dynamische Speicherverwaltung}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-    \item
-      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-  \end{itemize}
-
-  \bigskip
-
-  \begin{lstlisting}
-    char *name[] = { "Anna", "Berthold", "Caesar" };
-
-    ...
-
-     name[3] = "Dieter";
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(0,0){\line(3,1){3.5}}
-    \put(0,1){\line(3,-1){3.5}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \bigskip
-
-  \begin{lstlisting}
-    #include <stdlib.h>
-
-    ...
-
-      char **name = malloc (3 * sizeof (char *));
-        /* Speicherplatz für 3 Zeiger anfordern */
-
-    ...
-
-      free (name)
-        /* Speicherplatz freigeben */
-
-  \end{lstlisting}
-
-\end{frame}
-
-\subsection{Konzepte und Ziele}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-%      Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen)
-      Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen)
-%    \item
-%      Dynamisches Array: variable Anzahl von Elementen desselben Typs
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-  \end{itemize}
-  \begin{itemize}
-    \item
-      Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden}
-    \begin{onlyenv}<1>
-      \item
-        Was die Funktion bewirkt,\\
-        hängt vom Typ des Objekts ab
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \item
-        Was die Funktion bewirkt
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(3.75,0.3);}}
-        \end{picture}%
-        Welche Funktion aufgerufen wird,\\
-        hängt vom Typ des Objekts ab: \newterm{virtuelle Methode}
-      \item
-        Realisierung über endlose \lstinline{if}-Ketten%
-        \begin{picture}(0,0)
-          \color{red}
-          \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);%
-                                  \draw[thick](-0.1,-0.05)--(2.5,0.3);}}
-%          \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\
-%                           kommt gleich
-%                           nächste Woche
-%                         \end{rotate}}
-        \end{picture}
-        Zeiger, die im Objekt gespeichert sind\\
-        (Genaugenommen: Tabelle von Zeigern)
-    \end{onlyenv}
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{itemize}
-    \item
-      Problem: Elemente unterschiedlichen Typs
-    \item
-      Lösung: den Typ des Elements zusätzlich speichern
-    \item
-      \newterm{Methoden\/} und \newterm{virtuelle Methoden}
-  \end{itemize}
-
-  \begin{itemize}
-    \item
-      Zeiger auf verschiedene Strukturen\\
-      mit einem gemeinsamen Anteil von Datenfeldern\\
-      \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten
-    \item
-      Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\
-      \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung}
-    \item
-%      Explizite Typumwandlung eines Zeigers auf die Basisklasse\\
-%      in einen Zeiger auf die \newterm{abgeleitete Klasse}\\
-%      \textarrow\ Man kann ein Array unterschiedlicher Objekte\\
-%      \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\
-      Zeiger auf die Basisklasse dürfen auf Objekte\\
-      der \newterm{abgeleiteten Klasse} zeigen\\
-      \textarrow\ \newterm{Polymorphie}
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Beispiel: Zahlen und Buchstaben}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.7cm]
-    \begin{onlyenv}<1>
-      \begin{minipage}{8cm}
-        \begin{lstlisting}[gobble=10]
-          ¡t_integer i = { 1, 42 };
-          t_string s = { 2, "Hello, world!" };
-
-          t_base *object[] = { (t_base *) &i, (t_base *) &s };¿
-        \end{lstlisting}
-      \end{minipage}%
-      \begin{picture}(0,0)
-        \color{red}
-        \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}}
-      \end{picture}
-    \end{onlyenv}
-%    \begin{onlyenv}<2>
-%      \begin{minipage}{5cm}
-%        \begin{lstlisting}[gobble=10]
-%          ¡typedef union
-%          {
-%            t_base base;
-%            t_integer integer;
-%            t_string string;
-%          } t_object;¿
-%        \end{lstlisting} %      \end{minipage}
-%    \end{onlyenv}
-  \end{center}
-  
-\end{frame}
-
-\subsection{Unions}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        int8_t i;
-        uint8_t u;
-      } num8_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num8_t test;
-        test.i = -1;
-        printf ("%d\n", test.u);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        char s[8];
-        uint64_t x;
-      } num_char_t;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        num_char_t test = { "Hello!" };
-        printf ("%lx\n", test.x);
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Variable teilen sich denselben Speicherplatz.
-
-  \medskip
-
-  \begin{minipage}[t]{3.7cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef union
-      {
-        t_base base;
-        t_integer integer;
-        t_string string;
-      } t_object;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-      } t_base;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        int content;
-      } t_integer;¿
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.0cm}
-    \begin{lstlisting}[gobble=6]
-
-      ¡typedef struct
-      {
-        int type;
-        char *content;
-      } t_string;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \bigskip
-
-  \begin{center}
-    \begin{minipage}{8.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡if (this->base.type == T_INTEGER)
-          printf ("Integer: %d\n", this->integer.content);
-        else if (this->base.type == T_STRING)
-          printf ("String: \"%s\"\n", this->string.content);¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-\end{frame}
-
-\subsection{Virtuelle Methoden}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{lstlisting}
-    void print_object (t_object *this)
-    {
-      if (this->base.type == T_INTEGER)
-        printf ("Integer: %d\n", this->integer.content);
-      else if (this->base.type == T_STRING)
-        printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-  \begin{picture}(0,0)
-    \color{red}
-    \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}}
-    \put(1,-2){\mbox{\textarrow}}
-    \put(0,-3){\mbox{Zeiger auf Funktionen}}
-  \end{picture}
-
-  \begin{lstlisting}[xleftmargin=4cm]
-    void print_integer (t_object *this)
-    {
-      printf ("Integer: %d\n", this->integer.content);
-    }
-
-    void print_string (t_object *this)
-    {
-      printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  Zeiger auf Funktionen
-
-  \medskip
-
-  \begin{lstlisting}
-    void (* print) (t_object *this);
-  \end{lstlisting}
-  \begin{picture}(0,1.2)(0,-0.9)
-    \color{red}
-    \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}}
-    \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}}
-  \end{picture}
-
-  \begin{itemize}
-    \item
-      Objekt enthält Zeiger auf Funktion
-      \begin{onlyenv}<1>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<2->
-        \vspace*{-3.5cm}  % Why doesn't a picture environment work here??? :-(
-        \begin{lstlisting}[gobble=10,xleftmargin=5.5cm]
-          typedef struct
-          {
-            void (* print) (union t_object *this);
-            int content;
-          } t_integer;
-        \end{lstlisting}
-        \vspace*{0.85cm}
-        \bigskip
-        \smallskip
-      \end{onlyenv}
-    \pause
-    \item
-      Konstruktor initialisiert diesen Zeiger
-      \begin{onlyenv}<2>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          t_object *new_integer (int i)
-          {
-            t_object *p = malloc (sizeof (t_integer));
-            p->integer.print = print_integer;
-            p->integer.content = i;
-            return p;
-          }
-        \end{lstlisting}
-        \vspace*{-2cm}
-      \end{onlyenv}
-    \pause
-    \item
-      Aufruf: "`automatisch"' die richtige Funktion
-      \begin{onlyenv}<3>
-        \medskip
-        \begin{lstlisting}[gobble=10]
-          for (int i = 0; object[i]; i++)
-            object[i]->base.print (object[i]);
-        \end{lstlisting}
-      \end{onlyenv}
-    \pause
-    \medskip
-    \item
-      in größeren Projekten:\\
-      Objekt enthält Zeiger auf Tabelle von Funktionen
-  \end{itemize}
-\end{frame}
-
-\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \scriptsize
-  \begin{lstlisting}
-    #include <gtk/gtk.h>
-
-    int main (int argc, char **argv)
-    {
-      gtk_init (&argc, &argv);
-      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-      gtk_window_set_title (GTK_WINDOW (window), "Hello");
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-      GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-      gtk_container_add (GTK_CONTAINER (window), vbox);
-      gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
-      GtkWidget *label = gtk_label_new ("Hello, world!");
-      gtk_container_add (GTK_CONTAINER (vbox), label);
-      GtkWidget *button = gtk_button_new_with_label ("Quit");
-      g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
-      gtk_container_add (GTK_CONTAINER (vbox), button);
-      gtk_widget_show (button);
-      gtk_widget_show (label);
-      gtk_widget_show (vbox);
-      gtk_widget_show (window);
-      gtk_main ();
-      return 0;
-    }
-  \end{lstlisting}
-
-  \vspace*{-6cm}\strut\hfill
-  \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm]
-  \begin{flushright}
-    \normalsize\bf Praktikumsversuch:\\
-    Objektorientiertes Zeichenprogramm
-  \end{flushright}
-  
-\end{frame}
-
-\subsection{Ausblick: C++}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-        } t_base;¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (...);
-          int content;
-        } t_integer;¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡typedef struct
-        {
-          void (* print) (union t_object *this);
-          char *content;
-        } t_string;¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TBase
-        {
-          virtual void print (void);
-        };¿
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5.5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TInteger: public TBase
-        {
-          virtual void print (void);
-          int content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        ¡struct TString: public TBase
-        {
-          virtual void print (void);
-          char *content;
-        };¿
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-  
-\end{frame}
-
-\section{Datenstrukturen}
-\subsection{Stack und FIFO}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{minipage}{0.48\textwidth}
-    Im letzten Praktikumsversuch:
-    \begin{itemize}
-      \item
-        Array nur zum Teil benutzt
-      \item
-        Variable speichert genutzte Länge
-      \item
-        Elemente hinten anfügen\\
-        oder entfernen
-      \arrowitem
-        Stack\\
-        \strut
-    \end{itemize}
-    \bigskip
-    \begin{itemize}
-      \item
-        hinten anfügen/entfernen: $\mathcal{O}(1)$\hspace*{-1cm}
-      \item
-        vorne oder in der Mitte einfügen/entfernen: $\mathcal{O}(n)$
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}{0.52\textwidth}
-    Auch möglich:
-    \begin{itemize}
-      \item
-        Array nur zum Teil benutzt
-      \item
-        2 Variable speichern\\genutzte Länge (ringförmig)
-      \item
-        Elemente hinten anfügen\\
-        oder vorne entfernen
-      \arrowitem
-        FIFO
-    \end{itemize}
-    \bigskip
-    \begin{itemize}
-      \item
-        vorne oder hinten\\
-        anfügen oder entfernen: $\mathcal{O}(1)$
-      \item
-        in der Mitte einfügen/entfernen: $\mathcal{O}(n)$
-    \end{itemize}
-  \end{minipage}\hspace*{-1.5mm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \bigskip
-
-  \begin{minipage}[b]{6cm}
-    \begin{center}
-      "`First In -- First Out"'
-
-      \bigskip
-
-      \begin{picture}(6,4)
-        \thicklines
-        \color{structure}
-        \put(0.5,0){\line(1,0){5}}
-
-        \put(3.5,0){\only<1-5>{\line(0,1){1}}}
-        \put(4.5,0){\only<1-4>{\line(0,1){1}}}
-        \put(3.5,1){\only<1-4>{\line(1,0){1}}}
-        \put(4.0,0.5){\only<1-4>{\makebox(0,0){\lstinline{3}}}}
-        \put(3.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(3.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}}
-
-        \put(2.5,0){\only<2-6>{\line(0,1){1}}}
-        \put(2.5,1){\only<2-5>{\line(1,0){1}}}
-        \put(3.0,0.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}}
-        \put(2.0,1.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(2.0,1.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}}
-
-        \put(1.5,0){\only<3-6>{\line(0,1){1}}}
-        \put(1.5,1){\only<3-6>{\line(1,0){1}}}
-        \put(2.0,0.5){\only<3-6>{\makebox(0,0){\lstinline{137}}}}
-        \put(1.0,1.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(1.0,1.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}}
-
-        \put(4.55,1.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(5.00,1.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}}
-
-        \put(3.55,1.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(4.00,1.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}}
-
-        \put(2.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(3.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}}
-      \end{picture}
-
-      \bigskip
-
-      FIFO = Queue = Reihe
-    \end{center}
-  \end{minipage}\hfill
-  \begin{minipage}[b]{6cm}
-    \begin{center}
-      "`Last In -- First Out"'
-
-      \bigskip
-
-      \begin{picture}(6,4)
-        \thicklines
-        \color{structure}
-        \put(1.5,0){\line(1,0){3}}
-
-        \put(2.5,0){\line(0,1){1}}
-        \put(3.5,0){\line(0,1){1}}
-        \put(2.5,1){\line(1,0){1}}
-        \put(3.0,0.5){\makebox(0,0){\lstinline{3}}}
-        \put(2.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(2.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}}
-
-        \put(2.5,1){\only<2-5>{\line(0,1){1}}}
-        \put(3.5,1){\only<2-5>{\line(0,1){1}}}
-        \put(2.5,2){\only<2-5>{\line(1,0){1}}}
-        \put(3.0,1.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}}
-        \put(2.0,2.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(2.0,2.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}}
-
-        \put(2.5,2){\only<3-4>{\line(0,1){1}}}
-        \put(3.5,2){\only<3-4>{\line(0,1){1}}}
-        \put(2.5,3){\only<3-4>{\line(1,0){1}}}
-        \put(3.0,2.5){\only<3-4>{\makebox(0,0){\lstinline{137}}}}
-        \put(2.0,3.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}}
-        \put(2.0,3.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}}
-
-        \put(3.55,3.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(4.00,3.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}}
-
-        \put(3.55,2.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(4.00,2.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}}
-
-        \put(3.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}}
-        \put(4.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}}
-      \end{picture}
-
-      \bigskip
-
-      LIFO = Stack = Stapel
-    \end{center}
-  \end{minipage}
-
-%
-%  \dots
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \bigskip
-
-  \begin{minipage}[t]{6cm}
-    Array (Stack, FIFO):\\
-    in der Mitte einfügen
-    \begin{center}
-      \begin{picture}(6,3.8)
-        \thicklines
-        \color{structure}
-        \put(1.5,0){\line(1,0){3}}
-
-        \put(2.5,0){\line(0,1){3}}
-        \put(3.5,0){\line(0,1){3}}
-        \put(2.5,1){\line(1,0){1}}
-        \put(3.0,0.5){\makebox(0,0){\lstinline{3}}}
-        \put(2.5,1){\line(1,0){1}}
-        \put(3.0,1.5){\makebox(0,0){\lstinline{7}}}
-        \put(2.5,2){\line(1,0){1}}
-        \put(3.0,2.5){\makebox(0,0){\lstinline{137}}}
-        \put(2.5,3){\line(1,0){1}}
-
-        \put(1.5,1.5){\makebox(0,0)[b]{\lstinline{push (5)}}}
-        \put(1.5,1.45){\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.95,-0.45);}}}
-
-        \put(3.55,2.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}}
-        \put(3.55,1.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}}
-
-        \pause
-        \color{red}
-        \put(4.1,3.0){\makebox(0,0)[l]{\textbf{1.}}}
-        \put(4.1,2.0){\makebox(0,0)[l]{\textbf{2.}}}
-        \put(1.5,1.9){\makebox(0,0)[b]{\textbf{3.}}}
-
-        \pause
-        \put(6.0,1.5){\makebox(0,0)[tl]{$\mathcal{O}(n)$}}
-        \put(5.95,1.45){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,0.4);}}}
-        \put(5.95,1.49){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,1.1);}}}
-      \end{picture}
-    \end{center}
-  \end{minipage}\pause\hfill
-  \begin{minipage}[t]{5cm}
-    In Array (Stack, FIFO) \dots
-    \begin{itemize}
-      \item
-        einfügen: $\mathcal{O}(n)$
-      \item
-        suchen: $\mathcal{O}(n)$
-      \item
-        geschickt suchen: $\mathcal{O}(\log n)$
-      \item
-        beim Einfügen sortieren:\\
-        $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);}
-        $\mathcal{O}(n^2)$
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\subsection{Verkettete Listen}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{tikzpicture}
-    \color{structure}
-    \node(first) at (0,0.5) {first};
-    \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3};
-    \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5};
-    \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7};
-    \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137};
-    \node(NULL) at (7,2) {NULL};
-    \draw[-latex](first)--(3);
-    \only<1>{\draw[-latex](3)--(7);}
-    \only<2>{\draw[-latex](3) to[out=0] (5);}
-    \only<2>{\draw[-latex](5) to[in=180] (7);}
-    \draw[-latex](7)--(137);
-    \draw[-latex](137)--(NULL);
-  \end{tikzpicture}
-  \begin{itemize}
-    \item
-      Jeder Datensatz enthält einen Zeiger auf das nächste Element.
-    \item
-      Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}.
-    \item
-      Eine Variable zeigt auf das erste Element.
-    \item
-      Wenn die Liste leer ist, zeigt die Variable auf \lstinline{NULL}.
-    \arrowitem
-      (einfach) \textbf{verkettete Liste}
-  \end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-  \showsection
-  \showsubsection
-
-  \begin{minipage}[t]{5cm}
-    In Array (Stack, FIFO) \dots
-    \begin{itemize}
-      \item
-        in der Mitte einfügen: $\mathcal{O}(n)$
-      \item
-        wahlfreier Zugriff: $\mathcal{O}(1)$
-      \item
-        suchen: $\mathcal{O}(n)$
-      \item
-        geschickt suchen: $\mathcal{O}(\log n)$
-      \item
-        beim Einfügen sortieren:\\
-        $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);}
-        $\mathcal{O}(n^2)$
-    \end{itemize}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{6cm}
-    In (einfach) verkettete/r Liste \dots
-    \begin{itemize}
-      \item
-        in der Mitte einfügen: $\mathcal{O}(1)$
-      \item
-        wahlfreier Zugriff: $\mathcal{O}(n)$
-      \item
-        suchen: $\mathcal{O}(n)$
-      \item
-        geschickt \hspace*{-1.7cm}\tikz{\draw[red](-1.7,0)--(0,0.2);\draw[red](-1.7,0.2)--(0,0);}
-        suchen: {\color{red}$\mathcal{O}(n)$}
-      \item
-        beim Einfügen sortieren:
-        $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);}
-        $\mathcal{O}(n^2)$
-    \end{itemize}
-  \end{minipage}
-  \pause
-  \medskip
-  \begin{center}
-    \begin{minipage}[t]{6cm}
-      In (ausbalancierten) Bäumen \dots
-      \begin{itemize}
-        \item
-          in der Mitte einfügen: $\mathcal{O}(\log n)$
-        \item
-          wahlfreier Zugriff: $\mathcal{O}(\log n)$
-        \item
-          suchen: $\mathcal{O}(\log n)$
-        \item
-          beim Einfügen sortieren:
-          $\mathcal{O}(n \log n)$
-      \end{itemize}
-    \end{minipage}
-  \end{center}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Bäume}
-
-\begin{frame}[fragile]
-
-  \showsection
-  \showsubsection
-
-  \begin{minipage}[t]{5cm}
-    \vspace*{-6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡typedef struct node
-      {
-        int content;
-        struct node *left, *right;
-      } node;¿
-    \end{lstlisting}
-    \bigskip
-    \bigskip
-    \begin{onlyenv}<6->
-      \begin{itemize}
-        \item
-          Einfügen: rekursiv, $\mathcal{O}(\log n)$
-        \item
-          Suchen: rekursiv, $\mathcal{O}(\log n)$
-        \item
-          beim Einfügen sortieren:\\
-          rekursiv, $\mathcal{O}(n\log n)$
-        \begin{onlyenv}<7->
-          \smallskip
-          \item
-            {\color{red}
-            \emph{Worst Case\/}: $\mathcal{O}(n^2)$\\
-            vorher bereits sortiert}\\
-            \textarrow\ balancierte Bäume\\
-            \hspace*{2.15em}Anwendung: Datenbanken\hspace*{-2cm}
-        \end{onlyenv}
-      \end{itemize}
-      \vspace*{-1cm}
-    \end{onlyenv}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{7cm}
-    \begin{center}
-      \begin{tikzpicture}
-        \color{structure}
-        \node(root) at (0,0) {\lstinline{node *root;}};
-        \begin{onlyenv}<2>
-          \node(3) at (-2,-3) {\lstinline{NULL}};
-          \node(137) at (2,-3) {\lstinline{NULL}};
-        \end{onlyenv}
-        \begin{onlyenv}<2->
-          \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7};
-          \draw[-latex](root)--(7);
-          \draw[-latex](7)--(3);
-          \draw[-latex](7)--(137);
-        \end{onlyenv}
-        \begin{onlyenv}<3>
-          \node(3) at (-2,-3) {\lstinline{NULL}};
-        \end{onlyenv}
-        \begin{onlyenv}<3->
-          \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137};
-          \node(137_left) at (1,-4.5) {\lstinline{NULL}};
-          \node(137_right) at (3,-4.5) {\lstinline{NULL}};
-          \draw[-latex](137)--(137_left);
-          \draw[-latex](137)--(137_right);
-        \end{onlyenv}
-        \begin{onlyenv}<4>
-          \node(5) at (-1,-4.5) {\lstinline{NULL}};
-        \end{onlyenv}
-        \begin{onlyenv}<4->
-          \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3};
-          \node(3_left) at (-3,-4.5) {\lstinline{NULL}};
-          \draw[-latex](3)--(3_left);
-          \draw[-latex](3)--(5);
-        \end{onlyenv}
-        \begin{onlyenv}<5->
-          \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5};
-          \node(5_left) at (-2,-6) {\lstinline{NULL}};
-          \node(5_right) at (0,-6) {\lstinline{NULL}};
-          \draw[-latex](5)--(5_left);
-          \draw[-latex](5)--(5_right);
-        \end{onlyenv}
-      \end{tikzpicture}
-    \end{center}
-  \end{minipage}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-        \item[6.3] Unions
-        \item[6.4] Virtuelle Methoden
-        \color{medgreen}
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[7.1] Stack und FIFO
-        \item[7.2] Verkettete Listen
-        \item[7.3] Bäume
-      \end{itemize}
-  \end{itemize}
-  \vspace*{-1.5cm}
-  \begin{flushright}
-    \rightskip 2cm
-    \large
-    \em
-    \color{orange}%
-    Viel Erfolg\hspace*{0.25cm}\strut\\
-    in der Klausur!
-  \end{flushright}
-
-\end{frame}
-
-\end{document}
diff --git a/20200123/hp-musterloesung-20200123.pdf b/20200123/hp-musterloesung-20200123.pdf
deleted file mode 100644
index a304827618f10201d5b3d7648dc325119db3d508..0000000000000000000000000000000000000000
Binary files a/20200123/hp-musterloesung-20200123.pdf and /dev/null differ
diff --git a/20200123/hp-musterloesung-20200123.tex b/20200123/hp-musterloesung-20200123.tex
deleted file mode 100644
index 1d023aa05996a895cb54ab635e9a5be8cf1a6d1e..0000000000000000000000000000000000000000
--- a/20200123/hp-musterloesung-20200123.tex
+++ /dev/null
@@ -1,487 +0,0 @@
-% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Stack-Operationen, Iterationsfunktionen, dynamisches Bit-Array
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 23.\ Januar 2020}
-
-  \exercise{Stack-Operationen}
-
-  Das folgende Programm (\gitfile{hp}{20200123}{aufgabe-1.c})
-  implementiert einen Stapelspeicher (Stack).
-  Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer)
-  tatsächlich genutzt wird.
-  An dieser Obergrenze kann man Elemente hinzufügen (push).
-  
-  In dieser Aufgabe sollen zusätzlich Elemente
-  in der Mitte eingefügt werden (insert).
-  Die dafür bereits existierenden Funktionen \lstinline{insert()}
-  und \lstinline{insert_sorted()} sind jedoch fehlerhaft.
-
-  \begin{minipage}[t]{0.5\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      #define STACK_SIZE 10
-
-      int stack[STACK_SIZE];
-      int stack_pointer = 0;
-
-      void push (int x)
-      {
-        stack[stack_pointer++] = x;
-      }
-
-      void show (void)
-      {
-        printf ("stack content:");
-        for (int i = 0; i < stack_pointer; i++)
-          printf (" %d", stack[i]);
-        if (stack_pointer)
-          printf ("\n");
-        else
-          printf (" (empty)\n");
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.5\textwidth}
-    \begin{lstlisting}[gobble=6]
-      void insert (int x, int pos)
-      {
-        for (int i = pos; i < stack_pointer; i++)
-          stack[i + 1] = stack[i];
-        stack[pos] = x;
-        stack_pointer++;
-      }
-
-      void insert_sorted (int x)
-      {
-        int i = 0;
-        while (i < stack_pointer && x < stack[i])
-          i++;
-        insert (x, i);
-      }
-
-      int main (void)
-      {
-        push (3);
-        push (7);
-        push (137);
-        show ();
-        insert (5, 1);
-        show ();
-        insert_sorted (42);
-        show ();
-        insert_sorted (2);
-        show ();
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x}
-      an der Stelle \lstinline{pos} in den Stack einfügt
-      und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört.
-      \points{3}
-    \item
-      Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x}
-      an derjenigen Stelle einfügt, an die er von der Sortierung her gehört.
-      (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.)
-      \points{2}
-    \item
-      Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)},
-      die die Position (Index) des Elements \lstinline{x}
-      innerhalb des Stack zurückgibt -- oder die Zahl
-      \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist.
-      Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen.
-      \points{3}
-    \item
-      Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen.
-      \points{4}
-  \end{enumerate}
-
-  \clearpage
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x}
-      an der Stelle \lstinline{pos} in den Stack einfügt,
-      und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört.}
-
-      Die \lstinline{for}-Schleife in der  Funktion \lstinline{insert()}
-      durchläuft das Array von unten nach oben.
-      Um den Inhalt des Arrays von unten nach oben zu verschieben,
-      muß man die Schleife jedoch von oben nach unten durchlaufen.
-
-      \goodbreak
-      Um die Funktion zu reparieren, ersetze man also
-      \begin{lstlisting}[gobble=8]
-        for (int i = pos; i < stack_pointer; i++)
-      \end{lstlisting}
-      durch:
-      \begin{lstlisting}[gobble=8]
-        for (int i = stack_pointer - 1; i >= pos; i--)
-      \end{lstlisting}
-      (Siehe auch: \gitfile{hp}{20200123}{loesung-1.c})
-
-    \item
-      \textbf{Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x}
-      an derjenigen Stelle einfügt, an die er von der Sortierung her gehört.
-      (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.)}
-
-      Der Vergleich \lstinline{x < stack[i]}
-      als Bestandteil der \lstinline{while}-Bedingung
-      paßt nicht zur Durchlaufrichtung der Schleife (von unten nach oben).
-
-      Um die Funktion zu reparieren, kann man daher entweder
-      das Kleinerzeichen durch ein Größerzeichen ersetzen
-      (\lstinline{x > stack[i]} -- siehe \gitfile{hp}{20200123}{loesung-1b-1.c})
-      oder die Schleife von oben nach unten durchlaufen
-      (siehe \gitfile{hp}{20200123}{loesung-1b-2.c}).
-
-      Eine weitere Möglichkeit besteht darin,
-      das Suchen nach der Einfügeposition
-      mit dem Verschieben des Arrays zu kombinieren
-      (siehe \gitfile{hp}{20200123}{loesung-1.c}).
-      Hierdurch spart man sich eine Schleife; das Programm wird schneller.
-      (Es bleibt allerdings bei $\mathcal{O}(n)$.)
-
-    \item
-      \textbf{Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)},
-      die die Position (Index) des Elements \lstinline{x}
-      innerhalb des Stack zurückgibt
-      -- oder \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist.
-      Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen.}
-
-      Man geht in einer Schleife den Stack (= den genutzten Teil des Arrays) durch.
-      Bei Gleichheit gibt man direkt mit \lstinline{return} den Index zurück.
-      Nach dem Schleifendurchlauf steht fest,
-      daß \lstinline{x} nicht im Stack vorhanden ist;
-      man kann dann direkt \lstinline{-1} zurückgeben
-      (siehe \gitfile{hp}{20200123}{loesung-1c.c}).
-
-      Da es sich um eine einzelne Schleife handelt,
-      ist die Ordnung $\mathcal{O}(n)$.
-
-    \item
-      \textbf{Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen.}
-
-      Um $\mathcal{O}(\log n)$ zu erreichen,
-      halbiert man fortwährend das Intervall von (einschließlich) \lstinline{0}
-      bis (ausschließlich) \lstinline{stack_pointer}
-      (siehe \gitfile{hp}{20200123}{loesung-1d.c}) --
-      wie in der Funktion \lstinline{push_sorted()}
-      im Beispiel-Programm \gitfile{hp}{20200123}{stack-11.c}.
-
-      Ein wichtiger Unterschied besteht darin,
-      daß man nach dem Durchlauf der Schleife noch auf die Gleichheit
-      \lstinline{x == stack[left]} (insbesondere nicht: \lstinline{stack[right]})
-      prüfen und ggf.\ \lstinline{left} bzw.\ \lstinline{-1} zurückgeben muß.
-  \end{enumerate}
-
-  \clearpage
-
-  \exercise{Iterationsfunktionen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200123}{aufgabe-2.c}):
-
-  \begin{minipage}[t]{0.4\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      void foreach (int *a, void (*fun) (int x))
-      {
-        for (int *p = a; *p >= 0; p++)
-          fun (*p);
-      }
-
-      void even_or_odd (int x)
-      {
-        if (x % 2)
-          printf ("%d ist ungerade.\n", x);
-        else
-          printf ("%d ist gerade.\n", x);
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.52\textwidth}
-    \begin{lstlisting}[gobble=6]
-      int main (void)
-      {
-        int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-        foreach (numbers, even_or_odd);
-        return 0;
-      }
-    \end{lstlisting}
-    \begin{enumerate}[\quad(a)]
-      \item
-        Was bedeutet \lstinline{void (*fun) (int x)},
-        und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?
-        \points{2}
-      \item
-        Schreiben Sie das Hauptprogramm \lstinline{main()} so um,
-        daß es unter Verwendung der Funktion \lstinline{foreach()}
-        die Summe aller positiven Zahlen in dem Array berechnet.
-        Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.
-        \points{4}
-    \end{enumerate}
-  \end{minipage}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Was bedeutet \lstinline{void (*fun) (int x)},
-      und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?}
-
-      \lstinline{void (*fun) (int x)} deklariert einen Zeiger \lstinline{fun},
-      der auf Funktionen zeigen kann, die einen Parameter \lstinline{x}
-      vom Typ \lstinline{int} erwarten und keinen Wert zurückgeben (\lstinline{void}).
-
-      Durch die Übergabe eines derartigen Parameters an die Funktion \lstinline{foreach()}
-      lassen wir dem Aufrufer die Wahl,
-      welche Aktion für alle Elemente des Arrays aufgerufen werden soll.
-
-    \item
-      \textbf{Schreiben Sie das Hauptprogramm \lstinline{main()} so um,
-      daß es unter Verwendung der Funktion \lstinline{foreach()}
-      die Summe aller positiven Zahlen in dem Array berechnet.
-      Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.}
-
-      Siehe: \gitfile{hp}{20200123}{loesung-1.c}
-
-      Damit die Funktion \lstinline{add_up()} Zugriff auf die Variable \lstinline{sum} hat,
-      muß diese global sein
-      und vor der Funktion \lstinline{add_up()} deklariert werden.
-
-      Die Bedingung, daß nur positive Zahlen summiert werden sollen,
-      ist durch die Arbeitsweise der Funktion \lstinline{foreach()}
-      bereits gewährleistet, da negative Zahlen als Ende-Markierungen dienen.
-
-      Wichtig ist, daß die Variable \lstinline{sum}
-      vor dem Aufruf der Funktion \lstinline{foreach()}
-      auf den Wert \lstinline{0} gesetzt wird.
-      In \gitfile{hp}{20200123}{loesung-1.c} geschieht dies
-      durch die Initialisierung von \lstinline{sum}.
-      Wenn mehrere Summen berechnet werden sollen,
-      muß dies durch explizite Zuweisungen \lstinline{sum = 0}
-      vor den Aufrufen von \lstinline{foreach()} erfolgen.
-  \end{enumerate}
-
-  \exercise{Dynamisches Bit-Array}
-
-  Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays:
-  \begin{itemize}
-    \item
-      \lstinline{void bit_array_init (int n)}\\
-      Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\
-      Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\
-      Die Bits sollen auf den Anfangswert 0 initialisiert werden.
-    \item
-      \lstinline{void bit_array_set (int i, int value)}\\
-      Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen;
-      der Wert \lstinline{value} darf 1 oder 0 sein.
-    \item
-      \lstinline{void bit_array_flip (int i)}\\
-      Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\
-      also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen.
-    \item
-      \lstinline{int bit_array_get (int i)}\\
-      Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen.
-    \item
-      \lstinline{void bit_array_resize (int new_n)}\\
-      Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\
-      Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\
-      Neu hinzukommende Bits sollen auf 0 initialisiert werden.
-    \item
-      \lstinline{void bit_array_done (void)}\\
-      Den vom Array belegten Speicherplatz wieder freigeben.
-  \end{itemize}
-  Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben,
-  beispielsweise um mehrere Arrays parallel verwalten zu können.
-  (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this},
-  der auf die Objekt-Struktur zeigt.)
-
-  Die Bits sollen möglichst effizient gespeichert werden,
-  z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen.
-
-  Die Funktionen sollen möglichst robust sein,
-  d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen,
-  sondern soll eine Fehlermeldung ausgeben.
-
-  \medskip
-
-  Die \textbf{Hinweise} auf der nächsten Seite\footnote{Auf dem Übungszettel
-    befanden sich die Hinweise auf der nächsten Seite. In dieser Musterlösung
-    befinden sie sich direkt darunter.} beschreiben
-  einen möglichen Weg, die Aufgabe zu lösen.\\
-  Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen.
-
-  \goodbreak
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat,
-      und schreiben Sie zunächst nur die Funktionen
-      \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und
-      \lstinline{bit_array_get()}.
-    \item
-      Verallgemeinern Sie nun auf eine konstante Länge,
-      bei der es sich um ein Vielfaches von 8 handelt.
-    \item
-      Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte.
-      Damit können Sie sich gleichzeitig von der Bedingung lösen,
-      daß die Länge des Arrays ein Vielfaches von 8 sein muß.
-    \item
-      Gehen Sie nun von einem statischen zu einem dynamischen Array über,
-      und implementieren sie die Funktionen \lstinline{bit_array_init()},
-      \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}.
-  \end{itemize}
-
-  \points{14}
-
-  \medskip
-
-  (Hinweis für die Klausur:
-  Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.)
-
-  \solution
-
-  Die hier vorgestellte Lösung folgt den Hinweisen.
-  \begin{itemize}
-    \item
-      \textbf{Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat,
-      und schreiben Sie zunächst nur die Funktionen
-      \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und
-      \lstinline{bit_array_get()}.}
-
-      Siehe: \gitfile{hp}{20200123}{loesung-3-1.c}
-
-      Wir speichern in jedem der acht Bit einer \lstinline{uint8_t}-Variablen
-      jeweils eine Zahl, die 0 oder 1 sein kann.
-      Dies geschieht durch Setzen bzw.\ Löschen bzw.\ Umklappen einzelner Bits
-      in der Variablen.
-
-      Das Programm enthält zusätzlich eine Funktion \lstinline{output()},
-      mit der man sich den Inhalt des Arrays anzeigen lassen kann,
-      sowie ein Hauptprogramm \lstinline{main()}, um die Funktionen zu testen.
-
-    \item
-      \textbf{Verallgemeinern Sie nun auf eine konstante Länge,
-      bei der es sich um ein Vielfaches von 8 handelt.}
-
-      Siehe: \gitfile{hp}{20200123}{loesung-3-2.c}
-
-      In diesem Programm setzen wir die Länge auf konstant \lstinline{LENGTH} Bits,
-      wobei es sich um eine Präprozessor-Konstante mit dem Wert 32 handelt.
-
-      Um \lstinline{LENGTH} Bits zu speichern, benötigen wir ein Array
-      der Länge \lstinline{LENGTH / 8} Bytes.
-
-      Um auf ein einzelnes Bit zuzugreifen, müssen wir zunächst ermitteln,
-      in welchem der Bytes sich befindet. Außerdem interessieren wir uns
-      für die Nummer des Bits innerhalb des Bytes.
-      Den Array-Index des Bytes erhalten wir, indem wir den Index des Bits
-      durch 8 dividieren. Der bei dieser Division verbleibende Rest ist die
-      Nummer des Bits innerhalb des Bytes.
-
-      Diese Rechnungen führen wir in den drei Funktionen
-      \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und
-      \lstinline{bit_array_get()} durch.
-      (Diese ist eine eher unelegante Code-Verdopplung -- hier sogar eine Verdreifachung.
-      Für den Produktiveinsatz lohnt es sich, darüber nachzudenken,
-      wie man diese vermeiden kann, ohne gleichzeitig an Effizienz einzubüßen.
-      Hierfür käme z.\,B.\ ein Präprozessor-Makro in Frage.
-      Für die Lösung der Übungsaufgabe wird dies hingegen nicht verlangt.)
-
-    \item
-      \textbf{Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte.
-      Damit können Sie sich gleichzeitig von der Bedingung lösen,
-      daß die Länge des Arrays ein Vielfaches von 8 sein muß.}
-
-      Siehe: \gitfile{hp}{20200123}{loesung-3-3.c}
-
-      Um weitere Code-Verdopplungen zu vermeiden,
-      führen wir eine Funktion \lstinline{check_index()} ein,
-      die alle Prüfungen durchführt.
-
-      Wenn die Länge des Arrays kein Vielfaches von 8 ist,
-      wird das letzte Byte nicht vollständig genutzt.
-      Die einzige Schwierigkeit besteht darin, die korrekte Anzahl von Bytes
-      zu ermitteln, nämlich die Länge dividiert durch 8, aber nicht ab-, sondern
-      aufgerundet. Am elegantesten geht dies durch vorherige Addition von 7:
-      \lstinline{#define BYTES ((LENGTH + 7) / 8)}.
-      Es ist aber auch zulässig, die Anzahl der Bytes mit Hilfe einer
-      \lstinline{if}-Anweisung zu ermitteln: Länge durch 8 teilen und abrunden;
-      falls die Division nicht glatt aufging, um 1 erhöhen.
-
-    \item
-      \textbf{Gehen Sie nun von einem statischen zu einem dynamischen Array über,
-      und implementieren sie die Funktionen \lstinline{bit_array_init()},
-      \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}.}
-
-      Siehe: \gitfile{hp}{20200123}{loesung-3-4.c}.
-      Damit ist die Aufgabe gelöst.
-
-      Aus den Präprozessor-Konstanten \lstinline{LENGTH} und \lstinline{BYTES}
-      werden nun globale \lstinline{int}-Variable.
-      Die Funktion \lstinline{bit_array_init()} berechnet die korrekten Werte
-      für diese Variablen und legt das Array mittels \lstinline{malloc()} dynamisch
-      an. Eine Größenänderung des Arrays erfolgt mittels \lstinline{realloc()},
-      das Freigeben mittels \lstinline{free()}.
-
-      Das Programm setzt Variable, die aktuell nicht verwendet werden,
-      auf den Wert \lstinline{0} bzw.\ \lstinline{NULL}.
-      Dies ermöglicht es der Funktion \lstinline{check_index()},
-      auch zu prüfen, ob das Array vorher korrekt mit \lstinline{bit_array_init()}
-      erzeugt wurde -- oder ob es vielleicht schon wieder mit
-      \lstinline{bit_array_done()} freigegeben wurde.
-
-  \end{itemize}
-
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg in der Klausur!}
-  \end{flushright}
-
-\end{document}
diff --git a/20200123/hp-uebung-20200123.pdf b/20200123/hp-uebung-20200123.pdf
deleted file mode 100644
index 737653183b7785090211a763d50b818d355a2293..0000000000000000000000000000000000000000
Binary files a/20200123/hp-uebung-20200123.pdf and /dev/null differ
diff --git a/20200123/hp-uebung-20200123.tex b/20200123/hp-uebung-20200123.tex
deleted file mode 100644
index 743a6d6a40c9824a668dbe07e57b29320536720b..0000000000000000000000000000000000000000
--- a/20200123/hp-uebung-20200123.tex
+++ /dev/null
@@ -1,278 +0,0 @@
-% hp-uebung-20200123.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Stack-Operationen, Iterationsfunktionen, dynamisches Bit-Array
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 23.\ Januar 2020}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  16 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Stack-Operationen}
-
-  Das folgende Programm (\gitfile{hp}{20200123}{aufgabe-1.c})
-  implementiert einen Stapelspeicher (Stack).
-  Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer)
-  tatsächlich genutzt wird.
-  An dieser Obergrenze kann man Elemente hinzufügen (push).
-  
-  In dieser Aufgabe sollen zusätzlich Elemente
-  in der Mitte eingefügt werden (insert).
-  Die dafür bereits existierenden Funktionen \lstinline{insert()}
-  und \lstinline{insert_sorted()} sind jedoch fehlerhaft.
-
-  \begin{minipage}[t]{0.5\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      #define STACK_SIZE 10
-
-      int stack[STACK_SIZE];
-      int stack_pointer = 0;
-
-      void push (int x)
-      {
-        stack[stack_pointer++] = x;
-      }
-
-      void show (void)
-      {
-        printf ("stack content:");
-        for (int i = 0; i < stack_pointer; i++)
-          printf (" %d", stack[i]);
-        if (stack_pointer)
-          printf ("\n");
-        else
-          printf (" (empty)\n");
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.5\textwidth}
-    \begin{lstlisting}[gobble=6]
-      void insert (int x, int pos)
-      {
-        for (int i = pos; i < stack_pointer; i++)
-          stack[i + 1] = stack[i];
-        stack[pos] = x;
-        stack_pointer++;
-      }
-
-      void insert_sorted (int x)
-      {
-        int i = 0;
-        while (i < stack_pointer && x < stack[i])
-          i++;
-        insert (x, i);
-      }
-
-      int main (void)
-      {
-        push (3);
-        push (7);
-        push (137);
-        show ();
-        insert (5, 1);
-        show ();
-        insert_sorted (42);
-        show ();
-        insert_sorted (2);
-        show ();
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x}
-      an der Stelle \lstinline{pos} in den Stack einfügt
-      und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört.
-      \points{3}
-    \item
-      Korrigieren Sie das Programm so,
-      daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x}
-      an derjenigen Stelle einfügt, an die er von der Sortierung her gehört.
-      (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.)
-      \points{2}
-    \item
-      Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)},
-      die die Position (Index) des Elements \lstinline{x}
-      innerhalb des Stack zurückgibt -- oder die Zahl
-      \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist.
-      Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen.
-      \points{3}
-    \item
-      Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen.
-      \points{4}
-  \end{enumerate}
-
-  \clearpage
-
-  \exercise{Iterationsfunktionen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{20200123}{aufgabe-2.c}):
-
-  \begin{minipage}[t]{0.4\textwidth}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-
-      void foreach (int *a, void (*fun) (int x))
-      {
-        for (int *p = a; *p >= 0; p++)
-          fun (*p);
-      }
-
-      void even_or_odd (int x)
-      {
-        if (x % 2)
-          printf ("%d ist ungerade.\n", x);
-        else
-          printf ("%d ist gerade.\n", x);
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{0.52\textwidth}
-    \begin{lstlisting}[gobble=6]
-      int main (void)
-      {
-        int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-        foreach (numbers, even_or_odd);
-        return 0;
-      }
-    \end{lstlisting}
-    \begin{enumerate}[\quad(a)]
-      \item
-        Was bedeutet \lstinline{void (*fun) (int x)},
-        und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?
-        \points{2}
-      \item
-        Schreiben Sie das Hauptprogramm \lstinline{main()} so um,
-        daß es unter Verwendung der Funktion \lstinline{foreach()}
-        die Summe aller positiven Zahlen in dem Array berechnet.
-        Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.
-        \points{4}
-    \end{enumerate}
-  \end{minipage}
-
-  \exercise{Dynamisches Bit-Array}
-
-  Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays:
-  \begin{itemize}
-    \item
-      \lstinline{void bit_array_init (int n)}\\
-      Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\
-      Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\
-      Die Bits sollen auf den Anfangswert 0 initialisiert werden.
-    \item
-      \lstinline{void bit_array_set (int i, int value)}\\
-      Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen;
-      der Wert \lstinline{value} darf 1 oder 0 sein.
-    \item
-      \lstinline{void bit_array_flip (int i)}\\
-      Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\
-      also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen.
-    \item
-      \lstinline{int bit_array_get (int i)}\\
-      Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\
-      Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen.
-    \item
-      \lstinline{void bit_array_resize (int new_n)}\\
-      Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\
-      Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\
-      Neu hinzukommende Bits sollen auf 0 initialisiert werden.
-    \item
-      \lstinline{void bit_array_done (void)}\\
-      Den vom Array belegten Speicherplatz wieder freigeben.
-  \end{itemize}
-  Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben,
-  beispielsweise um mehrere Arrays parallel verwalten zu können.
-  (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this},
-  der auf die Objekt-Struktur zeigt.)
-
-  Die Bits sollen möglichst effizient gespeichert werden,
-  z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen.
-
-  Die Funktionen sollen möglichst robust sein,
-  d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen,
-  sondern soll eine Fehlermeldung ausgeben.
-
-  \medskip
-
-  Die \textbf{Hinweise} auf der nächsten Seite beschreiben
-  einen möglichen Weg, die Aufgabe zu lösen.\\
-  Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen.
-
-  \goodbreak
-
-  Hinweise:
-  \begin{itemize}
-    \item
-      Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat,
-      und schreiben Sie zunächst nur die Funktionen
-      \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und
-      \lstinline{bit_array_get()}.
-    \item
-      Verallgemeinern Sie nun auf eine konstante Länge,
-      bei der es sich um ein Vielfaches von 8 handelt.
-    \item
-      Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte.
-      Damit können Sie sich gleichzeitig von der Bedingung lösen,
-      daß die Länge des Arrays ein Vielfaches von 8 sein muß.
-    \item
-      Gehen Sie nun von einem statischen zu einem dynamischen Array über,
-      und implementieren sie die Funktionen \lstinline{bit_array_init()},
-      \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}.
-  \end{itemize}
-
-  \points{14}
-
-  \medskip
-
-  (Hinweis für die Klausur:
-  Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.)
-
-  \bigskip
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg -- auch in der Klausur!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20200123/lists-1.c b/20200123/lists-1.c
deleted file mode 100644
index a04067e1403601ef56dd706d6148c1d386884e82..0000000000000000000000000000000000000000
--- a/20200123/lists-1.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int content;
-  node *next;
-} node;
-
-int main (void)
-{
-  return 0;
-}
diff --git a/20200123/lists-2.c b/20200123/lists-2.c
deleted file mode 100644
index f27d1d5af7c0c237f0d0286155380ef9452a497a..0000000000000000000000000000000000000000
--- a/20200123/lists-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-int main (void)
-{
-  return 0;
-}
diff --git a/20200123/lists-3.c b/20200123/lists-3.c
deleted file mode 100644
index 9c9029724efff25263813c5491add92504779d17..0000000000000000000000000000000000000000
--- a/20200123/lists-3.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-int main (void)
-{
-  node node3 = { 3, NULL };
-  node node7 = { 7, NULL };
-  node node137 = { 137, NULL };
-
-  node *first = &node3;
-
-  for (node *p = first; p; p = p->next)
-    printf ("%d\n", p->content);
-
-  return 0;
-}
diff --git a/20200123/lists-4.c b/20200123/lists-4.c
deleted file mode 100644
index e048736b85cc228c35f31644d003e00cdefc5496..0000000000000000000000000000000000000000
--- a/20200123/lists-4.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-int main (void)
-{
-  node node3 = { 3, NULL };
-  node node7 = { 7, NULL };
-  node node137 = { 137, NULL };
-
-  node3.next = &node7;
-  node7.next = &node137;
-  node137.next = NULL;
-
-  node *first = &node3;
-
-  for (node *p = first; p; p = p->next)
-    printf ("%d\n", p->content);
-
-  return 0;
-}
diff --git a/20200123/lists-5.c b/20200123/lists-5.c
deleted file mode 100644
index a0cc620a884c133dd89582de726139091bc9c5d0..0000000000000000000000000000000000000000
--- a/20200123/lists-5.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-int main (void)
-{
-  node node3 = { 3, NULL };
-  node node7 = { 7, NULL };
-  node node137 = { 137, NULL };
-
-  node3.next = &node7;
-  node7.next = &node137;
-  node137.next = NULL;
-
-  node node5 = { 5, NULL };
-  node5.next = node3.next;
-  node3.next = &node5;
-
-  node *first = &node3;
-
-  for (node *p = first; p; p = p->next)
-    printf ("%d\n", p->content);
-
-  return 0;
-}
diff --git a/20200123/lists-5.s b/20200123/lists-5.s
deleted file mode 100644
index 110bc231d950988e1f9a926e2c87167bab979457..0000000000000000000000000000000000000000
--- a/20200123/lists-5.s
+++ /dev/null
@@ -1,51 +0,0 @@
-	.file	"lists-5.c"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	pushq	%rbx
-	.cfi_def_cfa_offset 24
-	.cfi_offset 3, -24
-	subq	$72, %rsp
-	.cfi_def_cfa_offset 96
-	movl	$3, 48(%rsp)
-	movl	$7, 32(%rsp)
-	movl	$137, 16(%rsp)
-	movq	$0, 24(%rsp)
-	leaq	16(%rsp), %rax
-	movq	%rax, 40(%rsp)
-	movl	$5, (%rsp)
-	leaq	32(%rsp), %rax
-	movq	%rax, 8(%rsp)
-	movq	%rsp, 56(%rsp)
-	leaq	48(%rsp), %rbx
-	leaq	.LC0(%rip), %rbp
-.L2:
-	movl	(%rbx), %esi
-	movq	%rbp, %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movq	8(%rbx), %rbx
-	testq	%rbx, %rbx
-	jne	.L2
-	movl	$0, %eax
-	addq	$72, %rsp
-	.cfi_def_cfa_offset 24
-	popq	%rbx
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20200123/loesung-1.c b/20200123/loesung-1.c
deleted file mode 100644
index 9b87d6c2f977af2843bcc2b75896fb5f00d8fc35..0000000000000000000000000000000000000000
--- a/20200123/loesung-1.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = stack_pointer - 1;
-  while (i >= 0 && x < stack[i])
-    {
-      stack[i + 1] = stack[i];
-      i--;
-    }
-  stack[i + 1] = x;
-  stack_pointer++;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  return 0;
-}
diff --git a/20200123/loesung-1b-1.c b/20200123/loesung-1b-1.c
deleted file mode 100644
index cbbe37055109d203105a7ad4acb63d5bef61f4c0..0000000000000000000000000000000000000000
--- a/20200123/loesung-1b-1.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = 0;
-  while (i < stack_pointer && x > stack[i])
-    i++;
-  insert (x, i);
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  return 0;
-}
diff --git a/20200123/loesung-1b-2.c b/20200123/loesung-1b-2.c
deleted file mode 100644
index b1e1ae846f15a29e9cd53a8d1d689e3ccbefacce..0000000000000000000000000000000000000000
--- a/20200123/loesung-1b-2.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = stack_pointer - 1;
-  while (i >= 0 && x < stack[i])
-    i--;
-  insert (x, i + 1);
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  return 0;
-}
diff --git a/20200123/loesung-1c.c b/20200123/loesung-1c.c
deleted file mode 100644
index 79d061e3d7b78a2bec05b632e74b083a16d5a326..0000000000000000000000000000000000000000
--- a/20200123/loesung-1c.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = stack_pointer - 1;
-  while (i >= 0 && x < stack[i])
-    {
-      stack[i + 1] = stack[i];
-      i--;
-    }
-  stack[i + 1] = x;
-  stack_pointer++;
-}
-
-int search (int x)
-{
-  for (int i = 0; i < stack_pointer; i++)
-    if (stack[i] == x)
-      return i;
-  return -1;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  printf ("%d\n", search (42));
-  printf ("%d\n", search (1117));
-  return 0;
-}
diff --git a/20200123/loesung-1d.c b/20200123/loesung-1d.c
deleted file mode 100644
index 9079d8d3be7a500498aede2cf8e89a7d7db48a35..0000000000000000000000000000000000000000
--- a/20200123/loesung-1d.c
+++ /dev/null
@@ -1,86 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack content:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  if (stack_pointer)
-    printf ("\n");
-  else
-    printf (" (empty)\n");
-}
-
-void insert (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void insert_sorted (int x)
-{
-  int i = stack_pointer - 1;
-  while (i >= 0 && x < stack[i])
-    {
-      stack[i + 1] = stack[i];
-      i--;
-    }
-  stack[i + 1] = x;
-  stack_pointer++;
-}
-
-int search (int x)
-{
-  int left = 0;
-  int right = stack_pointer;
-  while (left < right - 1)
-    {
-      int middle = (left + right) / 2;
-      if (x < stack[middle])
-        right = middle;
-      else
-        left = middle;
-    }
-  if (x == stack[left])
-    return left;
-  else
-   return -1;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  insert (5, 1);
-  show ();
-  insert_sorted (42);
-  show ();
-  insert_sorted (2);
-  show ();
-  printf ("%d\n", search (2));
-  printf ("%d\n", search (4));
-  printf ("%d\n", search (42));
-  printf ("%d\n", search (67));
-  printf ("%d\n", search (137));
-  printf ("%d\n", search (1117));
-  return 0;
-}
diff --git a/20200123/loesung-2.c b/20200123/loesung-2.c
deleted file mode 100644
index 7a277e7b514d05e3bffbb59cd09fc5f63a18e26a..0000000000000000000000000000000000000000
--- a/20200123/loesung-2.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-
-void foreach (int *a, void (*fun) (int x))
-{
-  for (int *p = a; *p >= 0; p++)
-    fun (*p);
-}
-
-void even_or_odd (int x)
-{
-  if (x % 2)
-    printf ("%d ist ungerade.\n", x);
-  else
-    printf ("%d ist gerade.\n", x);
-}
-
-int sum = 0;
-
-void add_up (int x)
-{
-  sum += x;
-}
-
-int main (void)
-{
-  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-  foreach (numbers, add_up);
-  printf  ("Summe: %d\n", sum);
-  return 0;
-}
diff --git a/20200123/loesung-3-1.c b/20200123/loesung-3-1.c
deleted file mode 100644
index 11ad08a28a2c16e645e4b55c1b0f4556246fd692..0000000000000000000000000000000000000000
--- a/20200123/loesung-3-1.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-uint8_t buffer = 0;
-
-void bit_array_set (int i, int value)
-{
-  uint8_t mask = 1 << i;
-  if (value)
-    buffer |= mask;
-  else
-    buffer &= ~mask;
-}
-
-void bit_array_flip (int i)
-{
-  uint8_t mask = 1 << i;
-  buffer ^= mask;
-}
-
-int bit_array_get (int i)
-{
-  uint8_t mask = 1 << i;
-  if (buffer & mask)
-    return 1;
-  else
-    return 0;
-}
-
-void output (void)
-{
-  for (int i = 0; i < 8; i++)
-    {
-      if (i % 4 == 0)
-        printf (" ");
-      printf ("%d", bit_array_get (i));
-    }
-  printf ("\n");
-}
-
-int main (void)
-{
-  output ();
-  bit_array_set (2, 1);
-  output ();
-  bit_array_flip (7);
-  output ();
-  bit_array_set (2, 0);
-  output ();
-}
diff --git a/20200123/loesung-3-2.c b/20200123/loesung-3-2.c
deleted file mode 100644
index e510904b033cf7d55737cee55ad08ecb9510f324..0000000000000000000000000000000000000000
--- a/20200123/loesung-3-2.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#define LENGTH 32
-
-uint8_t buffer[LENGTH / 8] = { 0, 0, 0, 0 };
-
-void bit_array_set (int i, int value)
-{
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (value)
-    buffer[byte_index] |= mask;
-  else
-    buffer[byte_index] &= ~mask;
-}
-
-void bit_array_flip (int i)
-{
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  buffer[byte_index] ^= mask;
-}
-
-int bit_array_get (int i)
-{
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (buffer[byte_index] & mask)
-    return 1;
-  else
-    return 0;
-}
-
-void output (void)
-{
-  for (int i = 0; i < LENGTH; i++)
-    {
-      if (i % 4 == 0)
-        printf (" ");
-      printf ("%d", bit_array_get (i));
-    }
-  printf ("\n");
-}
-
-int main (void)
-{
-  output ();
-  bit_array_set (12, 1);
-  output ();
-  bit_array_flip (31);
-  output ();
-  bit_array_set (12, 0);
-  output ();
-}
diff --git a/20200123/loesung-3-3.c b/20200123/loesung-3-3.c
deleted file mode 100644
index 4177464aebf41205169a6bb02b27ac972e3a4f4e..0000000000000000000000000000000000000000
--- a/20200123/loesung-3-3.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <error.h>
-
-#define LENGTH 29
-#define BYTES ((LENGTH + 7) / 8)
-
-uint8_t buffer[BYTES] = { 0, 0, 0, 0 };
-
-void check_index (int i)
-{
-  if (i < 0 || i >= LENGTH)
-    error (1, 0, "index %d out of range (0, ..., %d)", i, LENGTH - 1);
-}
-
-void bit_array_set (int i, int value)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (value)
-    buffer[byte_index] |= mask;
-  else
-    buffer[byte_index] &= ~mask;
-}
-
-void bit_array_flip (int i)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  buffer[byte_index] ^= mask;
-}
-
-int bit_array_get (int i)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (buffer[byte_index] & mask)
-    return 1;
-  else
-    return 0;
-}
-
-void output (void)
-{
-  for (int i = 0; i < LENGTH; i++)
-    {
-      if (i % 4 == 0)
-        printf (" ");
-      printf ("%d", bit_array_get (i));
-    }
-  printf ("\n");
-}
-
-int main (void)
-{
-  output ();
-  bit_array_set (12, 1);
-  output ();
-  bit_array_flip (28);
-  output ();
-  bit_array_set (12, 0);
-  output ();
-  bit_array_flip (31);
-  output ();
-}
diff --git a/20200123/loesung-3-4.c b/20200123/loesung-3-4.c
deleted file mode 100644
index 1930580aae8e8b24528852d1dacf58051f6bd6cc..0000000000000000000000000000000000000000
--- a/20200123/loesung-3-4.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <error.h>
-#include <stdlib.h>
-
-int length = 0;
-int bytes = 0;
-uint8_t *buffer = NULL;
-
-void bit_array_init (int n)
-{
-  length = n;
-  bytes = (length + 7) / 8;
-  if (buffer)
-    free (buffer);
-  buffer = malloc (bytes * sizeof (uint8_t));
-  for (int i = 0; i < bytes; i++)
-    buffer[i] = 0;
-}
-
-void bit_array_resize (int new_n)
-{
-  length = new_n;
-  bytes = (length + 7) / 8;
-  buffer = realloc (buffer, bytes * sizeof (uint8_t));
-}
-
-void bit_array_done (void)
-{
-  free (buffer);
-  buffer = NULL;
-  length = 0;
-  bytes = 0;
-}
-
-void check_index (int i)
-{
-  if (!buffer)
-    error (1, 0, "array not initialised");
-  if (i < 0 || i >= length)
-    error (1, 0, "index %d out of range (0, ..., %d)", i, length - 1);
-}
-
-void bit_array_set (int i, int value)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (value)
-    buffer[byte_index] |= mask;
-  else
-    buffer[byte_index] &= ~mask;
-}
-
-void bit_array_flip (int i)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  buffer[byte_index] ^= mask;
-}
-
-int bit_array_get (int i)
-{
-  check_index (i);
-  int byte_index = i / 8;
-  int bit_index = i % 8;
-  uint8_t mask = 1 << bit_index;
-  if (buffer[byte_index] & mask)
-    return 1;
-  else
-    return 0;
-}
-
-void output (void)
-{
-  for (int i = 0; i < length; i++)
-    {
-      if (i % 4 == 0)
-        printf (" ");
-      printf ("%d", bit_array_get (i));
-    }
-  printf ("\n");
-}
-
-int main (void)
-{
-  bit_array_init (29);
-  output ();
-  bit_array_set (12, 1);
-  output ();
-  bit_array_flip (28);
-  output ();
-  bit_array_set (12, 0);
-  output ();
-  bit_array_flip (31);
-  output ();
-  bit_array_done ();
-}
diff --git a/20200123/logo-hochschule-bochum-cvh-text-v2.pdf b/20200123/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 100644
index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000
Binary files a/20200123/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ
diff --git a/20200123/logo-hochschule-bochum.pdf b/20200123/logo-hochschule-bochum.pdf
deleted file mode 100644
index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000
Binary files a/20200123/logo-hochschule-bochum.pdf and /dev/null differ
diff --git a/20200123/pgscript.sty b/20200123/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20200123/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20200123/pgslides.sty b/20200123/pgslides.sty
deleted file mode 120000
index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000
--- a/20200123/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../20200102/pgslides.sty
\ No newline at end of file
diff --git a/20200123/pwgen.txt b/20200123/pwgen.txt
deleted file mode 100644
index dedad24d8f985e34a85f538dd15e0e7db6271068..0000000000000000000000000000000000000000
--- a/20200123/pwgen.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-cassini/home/peter/bo/2019ws/hp/20200123> pwgen 32
-CahleMohngai7joh8Shoo5yaJaejahZ6 lochie8fo2ohdoipoo9daeseegh1niuX
-eedo3ahbangocha8aigh0ahc8too2uuL ruPahyoo9oong5eeg6aiW3Ouphaegooj
-ufeoh9quae3ahNoh3aeshaafoil4aew5 taigheih5yaed3ea6ohWieXiu5Yu5die
-Aeshae7OoQuiewiu5zoh4tai1eeg4wu4 ooquioLahva0ahcohnah7bai4chahrai
-Euphoh0shoh4Thiethocuox5Iez9Eith shahvei6kieQuoh4oBae3wahngei4gae
-Ae6Yiereg7faihoo6cho1Wu6eegoh8ku veeZahyiziejaesoh0gahw7oogheeng3
-uew0Apoozies9quiex3Ohphohkei8eic awai9shahyei4eiLooK8eipaezohseeh
-aenepeNeech0koo4mahR0bae9eeteegh linguuD6phoht0Thohphai7eeCh4phee
-pheidau7uchahchahghafiepee6Oht9U aipahquaemeiculemaiGh6fieboohi1I
-yaepeenoh3SeQuiena1Xeirim6thooxa ohgh2thoh5Aijei6SheeYooguoNg4ga9
-Ohgush6ieRahsh7ieNaiY7gie3ootho5 eequ4enieSh4koo9EiBobaedooneshai
-ahr1lee1ahghaa3paek4ek4Eish4uu7l phoh5aLek0chohR7eiRooV3Nequaisha
-ooNieJu0Ojojohna8rutoosoi7feiWai yiek0kaiPeex8taZohyechahphoh3Aiz
-oofah3thaibieshiuxie3Rieree8quo7 bohL0am2peew3aijei5Waizauwo9chiX
-PeeTaeGhuY5roo8cheid3Geil2ooreex cie2shahs0tha1Da5kaez8oorohg6sha
-us0foh4ohXaipoh5euboota6ounaitha tai1Thuepe7eenae9ra5poh0gahzie5w
-theeho4queChoo8aekaekaephah4meew ethi4voefieGaiPesaz6eilathieth9i
-fieb2rohYooch4zahw6Oujiewievuw4p AiRoo2aa9aePh5aGee2aefeC3iemoque
-aidomee2ahThoo1feikohheingei9aeC be3sau2aemuo7thangaiRohve6thoh7o
-quuateevoonahNgeh2eetei0it1wibuf zu1heiPhai5aib3Thai3see2gahnahyu
diff --git a/20200123/stack-0.c b/20200123/stack-0.c
deleted file mode 100644
index 289aab7602e1e1f9f1e6433b858f295792499b1b..0000000000000000000000000000000000000000
--- a/20200123/stack-0.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-void push (int x)
-{
-}
-
-int pop (void)
-{
-  return 42;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-1.c b/20200123/stack-1.c
deleted file mode 100644
index d1de6e09d718b69a9d255b6c83f6f7815584b430..0000000000000000000000000000000000000000
--- a/20200123/stack-1.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer] = x;
-  stack_pointer++;
-}
-
-int pop (void)
-{
-  return 42;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-2.c b/20200123/stack-2.c
deleted file mode 100644
index 20bed3660cffea7e0a9803451f69ef56a4a04b93..0000000000000000000000000000000000000000
--- a/20200123/stack-2.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return 42;
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-3.c b/20200123/stack-3.c
deleted file mode 100644
index b20a444d628a88101416097c79b34e0669b24d21..0000000000000000000000000000000000000000
--- a/20200123/stack-3.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  stack_pointer--;
-  return stack[stack_pointer];
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-4.c b/20200123/stack-4.c
deleted file mode 100644
index 0d738f95ff81ce1701b4aa8a12df30094b723851..0000000000000000000000000000000000000000
--- a/20200123/stack-4.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-5.c b/20200123/stack-5.c
deleted file mode 100644
index 38a187208208488bdb8e988d93442d57730e421e..0000000000000000000000000000000000000000
--- a/20200123/stack-5.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  if (stack_pointer < STACK_SIZE)
-    stack[stack_pointer++] = x;
-  else
-    {
-      fprintf (stderr, "stack overflow\n");
-      exit (1);
-    }
-}
-
-int pop (void)
-{
-  if (stack_pointer > 0)
-    return stack[--stack_pointer];
-  else
-    {
-      fprintf (stderr, "stack underflow\n");
-      exit (1);
-    }
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-6.c b/20200123/stack-6.c
deleted file mode 100644
index be00e160384be5e4af05831547ed74b636c3bdf0..0000000000000000000000000000000000000000
--- a/20200123/stack-6.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  if (stack_pointer < STACK_SIZE)
-    stack[stack_pointer++] = x;
-  else
-    {
-      fprintf (stderr, "stack overflow\n");
-      exit (1);
-    }
-}
-
-int pop (void)
-{
-  if (stack_pointer > 0)
-    return stack[--stack_pointer];
-  else
-    {
-      fprintf (stderr, "stack underflow\n");
-      exit (1);
-    }
-}
-
-int main (void)
-{
-  for (int i = 0; i < 42; i++)
-    push (i);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/stack-7.c b/20200123/stack-7.c
deleted file mode 100644
index b583bc281f9ae3acd673ec9ea4de75720084fb50..0000000000000000000000000000000000000000
--- a/20200123/stack-7.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  if (stack_pointer < STACK_SIZE)
-    stack[stack_pointer++] = x;
-  else
-    {
-      fprintf (stderr, "stack overflow\n");
-      exit (1);
-    }
-}
-
-int pop (void)
-{
-  if (stack_pointer > 0)
-    return stack[--stack_pointer];
-  else
-    {
-      fprintf (stderr, "stack underflow\n");
-      exit (1);
-    }
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  for (int i = 0; i < 42; i++)
-    printf ("%d\n", pop ());
-  return 0;
-}
diff --git a/20200123/test.c b/20200123/test.c
deleted file mode 100644
index d572ac1cc5d3d3d36de5901ed87326f155d7eaa1..0000000000000000000000000000000000000000
--- a/20200123/test.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", 0b101010);
-  return 0;
-}
diff --git a/20200123/tree-1.c b/20200123/tree-1.c
deleted file mode 100644
index d347186a019709e416529c1b73c32f268e0fce57..0000000000000000000000000000000000000000
--- a/20200123/tree-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int content;
-  node *left, *right;
-} node;
-
-int main (void)
-{
-  node *root = NULL;
-  return 0;
-}
diff --git a/20200123/tree-10.c b/20200123/tree-10.c
deleted file mode 100644
index 26a5575d8c0dbd139b08ca9365ad0a667223841b..0000000000000000000000000000000000000000
--- a/20200123/tree-10.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content < root->content)
-        {
-          root = root->left;
-          insert (content);
-          save_root->left = root;
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-          save_root->right = root;
-        }
-      root = save_root;
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      if (root->left)
-        output (root->left);
-      printf ("%d\n", root->content);
-      if (root->right)
-        output (root->right);
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-11.c b/20200123/tree-11.c
deleted file mode 100644
index 508b24316bf6696abc9225fac3fe7ef398a7e094..0000000000000000000000000000000000000000
--- a/20200123/tree-11.c
+++ /dev/null
@@ -1,61 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content < root->content)
-        {
-          root = root->left;
-          insert (content);
-          save_root->left = root;
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-          save_root->right = root;
-        }
-      root = save_root;
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-12.c b/20200123/tree-12.c
deleted file mode 100644
index ff07e64e6dceb10266dc6d376d68fd15bc59e68b..0000000000000000000000000000000000000000
--- a/20200123/tree-12.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content < root->content)
-        {
-          root = root->left;
-          insert (content);
-          save_root->left = root;
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-          save_root->right = root;
-        }
-      root = save_root;
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-13.c b/20200123/tree-13.c
deleted file mode 100644
index 236930ed75a80984bfe343a582320470180db3ad..0000000000000000000000000000000000000000
--- a/20200123/tree-13.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-node *insert (node *root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    return p;
-  else
-    {
-      if (content < root->content)
-        {
-          root->left = insert (root->left, content);
-          return root;
-        }
-      else
-        {
-          root->right = insert (root->right, content);
-          return root;
-        }
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-}
-
-int main (void)
-{
-  root = insert (root, 7);
-  root = insert (root, 137);
-  root = insert (root, 3);
-  root = insert (root, 1117);
-  root = insert (root, 42);
-  root = insert (root, 13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-14.c b/20200123/tree-14.c
deleted file mode 100644
index a95a1fc5acec20d7fa0fcf714af2d5d746899c1c..0000000000000000000000000000000000000000
--- a/20200123/tree-14.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-node *insert (node *root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    return p;
-  else
-    {
-      if (content < root->content)
-        {
-          root->left = insert (root->left, content);
-          return root;
-        }
-      else
-        {
-          root->right = insert (root->right, content);
-          return root;
-        }
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-}
-
-int main (void)
-{
-  insert (root, 7);
-  insert (root, 137);
-  insert (root, 3);
-  insert (root, 1117);
-  insert (root, 42);
-  insert (root, 13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-15.c b/20200123/tree-15.c
deleted file mode 100644
index 929d253f77de0cc15a6707dd499420965eb9daca..0000000000000000000000000000000000000000
--- a/20200123/tree-15.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-void insert (node **root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (*root == NULL)
-    *root = p;
-  else
-    {
-      if (content < root->content)
-        insert (&root->left, content);
-      else
-        insert (&root->right, content);
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-}
-
-int main (void)
-{
-  node *root = NULL;
-  insert (&root, 7);
-  insert (&root, 137);
-  insert (&root, 3);
-  insert (&root, 1117);
-  insert (&root, 42);
-  insert (&root, 13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-16.c b/20200123/tree-16.c
deleted file mode 100644
index be7163d4fdf57b897887bb861418e342e5061961..0000000000000000000000000000000000000000
--- a/20200123/tree-16.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-void insert (node **root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (*root == NULL)
-    *root = p;
-  else
-    {
-      if (content < (*root)->content)
-        insert (&(*root)->left, content);
-      else
-        insert (&(*root)->right, content);
-    }
-}
-
-void output (node *root)
-{
-  if (root)
-    {
-      output (root->left);
-      printf ("%d\n", root->content);
-      output (root->right);
-    }
-}
-
-int main (void)
-{
-  node *root = NULL;
-  insert (&root, 7);
-  insert (&root, 137);
-  insert (&root, 3);
-  insert (&root, 1117);
-  insert (&root, 42);
-  insert (&root, 13);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-2.c b/20200123/tree-2.c
deleted file mode 100644
index 7e591c3282329f0211c479dfa1b8c82f3dc755a3..0000000000000000000000000000000000000000
--- a/20200123/tree-2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-int main (void)
-{
-  node *root = NULL;
-  return 0;
-}
diff --git a/20200123/tree-3.c b/20200123/tree-3.c
deleted file mode 100644
index b88b8671bbda9efe1031d09e3caa60ebeea8ccea..0000000000000000000000000000000000000000
--- a/20200123/tree-3.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-void insert (node *root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  root = p;
-}
-
-void output (node *root)
-{
-  if (root)
-    printf ("%d\n", root->content);
-}
-
-int main (void)
-{
-  node *root = NULL;
-  insert (root, 7);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-3a.c b/20200123/tree-3a.c
deleted file mode 100644
index 8031ec72af9bcb97b83c46b296ab5f2464832fcd..0000000000000000000000000000000000000000
--- a/20200123/tree-3a.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-void insert (node *root, int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  root = p;
-}
-
-void output (node *root)
-{
-  if (root)
-    printf ("%d\n", root->content);
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  node *root = NULL;
-  insert (root, 7);
-  output (root);
-  return 0;
-}
diff --git a/20200123/tree-3b.c b/20200123/tree-3b.c
deleted file mode 100644
index 5b47c41b61d5a76380bccefc98f2fd3057ad645b..0000000000000000000000000000000000000000
--- a/20200123/tree-3b.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  root = p;
-}
-
-void output (void)
-{
-  if (root)
-    printf ("%d\n", root->content);
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-4.c b/20200123/tree-4.c
deleted file mode 100644
index db3b53dde184a82e1f85aa46e1f7e76b38e6b775..0000000000000000000000000000000000000000
--- a/20200123/tree-4.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-}
-
-void output (void)
-{
-  if (root)
-    printf ("%d\n", root->content);
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-5.c b/20200123/tree-5.c
deleted file mode 100644
index 628d8803131ca8ff163a085ee8ff4cb6ede0bc88..0000000000000000000000000000000000000000
--- a/20200123/tree-5.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      if (content > root->content)
-        root->right = p;
-      else
-        root->left = p;
-    }
-}
-
-void output (void)
-{
-  if (root)
-    printf ("%d\n", root->content);
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-6.c b/20200123/tree-6.c
deleted file mode 100644
index f38634d004a020104e65e04cf437c87085dd0d18..0000000000000000000000000000000000000000
--- a/20200123/tree-6.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      if (content > root->content)
-        root->right = p;
-      else
-        root->left = p;
-    }
-}
-
-void output (void)
-{
-  if (root)
-    {
-      if (root->left)
-        printf ("%d\n", root->left->content);
-      printf ("%d\n", root->content);
-      if (root->right)
-        printf ("%d\n", root->right->content);
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-7.c b/20200123/tree-7.c
deleted file mode 100644
index df1dd66b3e1a5892235bcaa894888f8becb4de85..0000000000000000000000000000000000000000
--- a/20200123/tree-7.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content > root->content)
-        {
-          root = root->left;
-          insert (content);
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-        }
-      root = save_root;
-    }
-}
-
-void output (void)
-{
-  if (root)
-    {
-      if (root->left)
-        {
-          node *save_root = root;
-          root = root->left;
-          output ();
-          root = save_root;
-        }
-      printf ("%d\n", root->content);
-      if (root->right)
-        {
-          node *save_root = root;
-          root = root->right;
-          output ();
-          root = save_root;
-        }
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-8.c b/20200123/tree-8.c
deleted file mode 100644
index fd3cafcad82fb4b9bbc6d7c905c1005d7c202f6e..0000000000000000000000000000000000000000
--- a/20200123/tree-8.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content > root->content)
-        {
-          root = root->left;
-          insert (content);
-          save_root->left = root;
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-          save_root->right = root;
-        }
-      root = save_root;
-    }
-}
-
-void output (void)
-{
-  if (root)
-    {
-      if (root->left)
-        {
-          node *save_root = root;
-          root = root->left;
-          output ();
-          root = save_root;
-        }
-      printf ("%d\n", root->content);
-      if (root->right)
-        {
-          node *save_root = root;
-          root = root->right;
-          output ();
-          root = save_root;
-        }
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output ();
-  return 0;
-}
diff --git a/20200123/tree-9.c b/20200123/tree-9.c
deleted file mode 100644
index 6b44c1108c747f4e6021ddf92d771d77288af18d..0000000000000000000000000000000000000000
--- a/20200123/tree-9.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *left, *right;
-} node;
-
-node *root = NULL;
-
-void insert (int content)
-{
-  node *p = malloc (sizeof (node));
-  p->content = content;
-  p->left = NULL;
-  p->right = NULL;
-  if (root == NULL)
-    root = p;
-  else
-    {
-      node *save_root = root;
-      if (content < root->content)
-        {
-          root = root->left;
-          insert (content);
-          save_root->left = root;
-        }
-      else
-        {
-          root = root->right;
-          insert (content);
-          save_root->right = root;
-        }
-      root = save_root;
-    }
-}
-
-void output (void)
-{
-  if (root)
-    {
-      if (root->left)
-        {
-          node *save_root = root;
-          root = root->left;
-          output ();
-          root = save_root;
-        }
-      printf ("%d\n", root->content);
-      if (root->right)
-        {
-          node *save_root = root;
-          root = root->right;
-          output ();
-          root = save_root;
-        }
-    }
-  else
-    printf ("root is NULL\n");
-}
-
-int main (void)
-{
-  insert (7);
-  insert (137);
-  insert (3);
-  insert (1117);
-  insert (42);
-  insert (13);
-  output ();
-  return 0;
-}
diff --git a/20200128/aufgabe-4.xbm b/20200128/aufgabe-4.xbm
deleted file mode 100644
index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000
--- a/20200128/aufgabe-4.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define aufgabe_4_width 14
-#define aufgabe_4_height 14
-static unsigned char aufgabe_4_bits[] = {
-   0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
-   0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
-   0xf0, 0x03, 0x00, 0x00 };
diff --git a/20200128/hp-klausur-20190129.txt b/20200128/hp-klausur-20190129.txt
deleted file mode 100644
index 29bcadbf1265da9730109716a8050679a9384748..0000000000000000000000000000000000000000
--- a/20200128/hp-klausur-20190129.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-Inhalte, 27.01.2020, 12:46:35
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- - Seiteneffekte
- - Arrays, Zeiger, Speicherzellen
- - Bit-Manipulation, Endianness, Alignment
- - Algorithmen, Landau-Symbol
- - Objekte
-
-Klausurtutorium, 28.01.2020, 13:10:52
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- - Klausur von 2018ws durchgehen
-
-  zu Aufgabe 1b:
-
-    for (int i = len; i >= pos; i--)
-      target[i + 1] = target[i];
-
-    Diese Lösung ist korrekt, weil auch das Null-Symbol verschoben wird.
-
- - darin: Übung vom 14.11.2019: Fehler in der Musterlösung
- - darin: XBM, PBM
-
- * Musterlösung zu Aufgabe 2:
-   Wintersemester 2018/19, 7.1.2019
-   https://gitlab.cvh-server.de/pgerwinski/hp/blob/2018ws/20190107/hp-musterloesung-20190107.pdf
-
-:) char buffer[100] = "kürzerer Text";
-   --> Null-Symbol am Ende, danach undefiniert
-   char buffer[100] = { 'T', 'e', 's', 't' };
-   --> kein Null-Symbol am Ende, danach ebenfalls undefiniert
-:) Wenn man in einen String etwas einfügt und Buchstaben verschiebt,
-   muß man das Null-Symbol mit verschieben.
-:) 32-Bit-Variable als 64-Bit-Variable ausgeben
-   --> 2. Hälfte ist zufällig
-
-:) Quicksort: im schlechtesten Fall O(n²)
-   Um vorher die Länge des Arrays herauszufinden, braucht man eine Schleife.
-   --> O(n² + n) = O(n²)
-
-:) Unsinnige Parameterwerte von Funktionen abfangen:
-   Nur dann erforderlich, wenn es in der Aufgabenstellung steht.
-
-
-@@@@@ Verlängerungskabel/Mehrfachstecker aus dem Labor holen!
-
-@@ Problem mit Rechner lösen
-
-Test des Klausur-WLAN, 28.01.2020, 15:14:23
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-ESSID = klausur2
-Passwort = klausurklausur
-
-URL = https://klausur.cvh-server.de
-
-Benutzername = 00
-Passwort = gIghbg4mJAAV
-
-ZIP-Dateien herunter- und hochladen
diff --git a/20200128/loesung-1e-0.c b/20200128/loesung-1e-0.c
deleted file mode 100644
index 8d46b6841e1a9b519cc6b35e1fa52ff6b14f886e..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-0.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  if (len == 0)
-    {
-      target[0] = src;
-      return 0;
-    }
-  for (int i = 0; i < len; i++)
-    if (target[i] >= src)
-      {
-        insert_into_string (src, target, i);
-        return 0;
-      }
-  insert_into_string (src, target, len);
-}
-
-int main (void)
-{
-  char test[100] = "";
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1e-1.c b/20200128/loesung-1e-1.c
deleted file mode 100644
index 2a167527de7bc073a515f754c8bd18eea521a33e..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-1.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  if (len == 0)
-    {
-      target[0] = src;
-      return;
-    }
-  for (int i = 0; i < len; i++)
-    if (target[i] >= src)
-      {
-        insert_into_string (src, target, i);
-        return;
-      }
-  insert_into_string (src, target, len);
-}
-
-int main (void)
-{
-  char test[100] = "";
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1e-2.c b/20200128/loesung-1e-2.c
deleted file mode 100644
index 6d37362bc9137252d5cf5053416bd0aacbf5a9e1..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-2.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  if (len == 0)
-    {
-      target[0] = src;
-      target[1] = 0;
-      return;
-    }
-  for (int i = 0; i < len; i++)
-    if (target[i] >= src)
-      {
-        insert_into_string (src, target, i);
-        return;
-      }
-  insert_into_string (src, target, len);
-}
-
-int main (void)
-{
-  char test[100] = "";
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1e-3.c b/20200128/loesung-1e-3.c
deleted file mode 100644
index 896ea03e51429772ab109b51cf775caed2e5e9d0..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-3.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  if (len == 0)
-    {
-      insert_into_string (src, target, 0);
-      return;
-    }
-  for (int i = 0; i < len; i++)
-    if (target[i] >= src)
-      {
-        insert_into_string (src, target, i);
-        return;
-      }
-  insert_into_string (src, target, len);
-}
-
-int main (void)
-{
-  char test[100] = "";  /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1e-4.c b/20200128/loesung-1e-4.c
deleted file mode 100644
index 08aebb0f954280a0bcbc62d057e5bfc253d743fd..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-4.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  int pos = 0;
-  while (target[pos] >= src && pos < len)
-    pos++;
-  insert_into_string (src, target, pos);
-}
-
-int main (void)
-{
-  char test[100] = "";  /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1e-5.c b/20200128/loesung-1e-5.c
deleted file mode 100644
index 5668ee2c78a1ce9ccf3a43f225c48fd746b992be..0000000000000000000000000000000000000000
--- a/20200128/loesung-1e-5.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = len; i >= pos; i--)
-    target[i + 1] = target[i];
-  target[pos] = src;
-}
-
-void insert_into_string_sorted (char src, char *target)
-{
-  int len = strlen (target);
-  int pos = 0;
-  while (target[pos] <= src && pos < len)
-    pos++;
-  insert_into_string (src, target, pos);
-}
-
-int main (void)
-{
-  char test[100] = "";  /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */
-  insert_into_string_sorted ('c', test);
-  insert_into_string_sorted ('a', test);
-  insert_into_string_sorted ('d', test);
-  insert_into_string_sorted ('b', test);
-  printf ("test = \"%s\"\n", test);
-  return 0;
-}
diff --git a/20200128/loesung-1g-0.c b/20200128/loesung-1g-0.c
deleted file mode 100755
index 8276d4af8e6e0195bcff0a583a1f95b7886a70e1..0000000000000000000000000000000000000000
--- a/20200128/loesung-1g-0.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stackzw[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-
-
-int binSearch( int Suchwert) { 
-	int low = 0;
-	int high = stack_pointer;
-	int mid;
-
-	while (low <= high) {
-		mid = (low+high)/2;
-		if (Suchwert < stack[mid]) high = mid-1;
-		else if (Suchwert > stack[mid]) low = mid+1;
-		else return mid; // gefunden
-	}
-	return (-1); // nicht gefunden
-}
-int binSearchR(int lo, int hi, int x) 
-    {
-        if (lo>hi)
-            return -1;
-        int m=lo+(hi-lo)/2;
-        if (x<stack[m])
-            return binSearchR(lo, m-1, x);
-        if (x>stack[m])
-            return binSearchR(m+1, hi, x);
-        return m;
-    }
-
-    int main (void)
-{
-
-  printf("%d \n",binSearch(7));
-  printf("%d \n",binSearchR(0, stack_pointer,7));
-  return 0;
-}
\ No newline at end of file
diff --git a/20200128/loesung-1g-1.c b/20200128/loesung-1g-1.c
deleted file mode 100755
index 0db3a72cc299512cf860530e0f29b9c4d1417363..0000000000000000000000000000000000000000
--- a/20200128/loesung-1g-1.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#define STACK_SIZE 10
-
-int stack[STACK_SIZE];
-int stackzw[STACK_SIZE];
-int stack_pointer = 0;
-
-void push (int x)
-{
-  stack[stack_pointer++] = x;
-}
-
-
-
-int binSearch( int Suchwert) { 
-	int low = 0;
-	int high = stack_pointer;
-	int mid;
-
-	while (low <= high) {
-		mid = (low+high)/2;
-		if (Suchwert < stack[mid]) high = mid-1;
-		else if (Suchwert > stack[mid]) low = mid+1;
-		else return mid; // gefunden
-	}
-	return (-1); // nicht gefunden
-}
-int binSearchR(int lo, int hi, int x) 
-    {
-        if (lo>hi)
-            return -1;
-        int m=lo+(hi-lo)/2;
-        if (x<stack[m])
-            return binSearchR(lo, m-1, x);
-        if (x>stack[m])
-            return binSearchR(m+1, hi, x);
-        return m;
-    }
-
-int main (void)
-{
-  push (1);
-  push (3);
-  push (5);
-  push (7);
-  push (11);
-  printf("%d \n",binSearch(7));
-  printf("%d \n",binSearchR(0, stack_pointer,7));
-  return 0;
-}
diff --git a/20200128/loesung-3-0.c b/20200128/loesung-3-0.c
deleted file mode 100644
index 70e3399dab04b82d06f6c44386b6dfc04869869c..0000000000000000000000000000000000000000
--- a/20200128/loesung-3-0.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-int sum;
-
-void foreach (int *a, void (*fun) (int x))
-{
-  for (int *p = a; *p >= 0; p++)
-    fun (*p);
-}
-
-void sum_of_positives (int x)
-{
-  if (x > 0)
-    sum += x;
-}
-
-void even_or_odd (int x)
-{
-  if (x % 2)
-    printf ("%d ist ungerade.\n", x);
-  else
-    printf ("%d ist gerade.\n", x);
-}
-
-int main (void)
-{
-  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-  foreach (numbers, sum_of_positives);
-  printf ("%d\n", sum);
-  return 0;
-}
diff --git a/20200128/loesung-3-1.c b/20200128/loesung-3-1.c
deleted file mode 100644
index 0a1be7265b1038890372845e21570b14c94c6401..0000000000000000000000000000000000000000
--- a/20200128/loesung-3-1.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-int sum = 0;
-
-void foreach (int *a, void (*fun) (int x))
-{
-  for (int *p = a; *p >= 0; p++)
-    fun (*p);
-}
-
-void sum_of_positives (int x)
-{
-  if (x > 0)
-    sum += x;
-}
-
-void even_or_odd (int x)
-{
-  if (x % 2)
-    printf ("%d ist ungerade.\n", x);
-  else
-    printf ("%d ist gerade.\n", x);
-}
-
-int main (void)
-{
-  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-  foreach (numbers, sum_of_positives);
-  printf ("%d\n", sum);
-  return 0;
-}
diff --git a/20200128/loesung-4-0.c b/20200128/loesung-4-0.c
deleted file mode 100644
index a7c3270d5db9ebc15cb72fdc4796507547912f1b..0000000000000000000000000000000000000000
--- a/20200128/loesung-4-0.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  printf ("width = %d\n", aufgabe_4_width);
-  printf ("height = %d\n", aufgabe_4_height);
-  printf ("bits =");
-  int bytes_per_line = 2;  // 14 Bit aufgerundet --> 16 Bit
-  for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++)
-    printf (" %d", aufgabe_4_bits[i]);
-  printf ("\n");
-  return 0;
-}
diff --git a/20200128/loesung-4-1.c b/20200128/loesung-4-1.c
deleted file mode 100644
index 246f3d42b5e6e04a2e5806c6578d515c38b0f9b9..0000000000000000000000000000000000000000
--- a/20200128/loesung-4-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  printf ("width = %d\n", aufgabe_4_width);
-  printf ("height = %d\n", aufgabe_4_height);
-  printf ("bits =");
-  int bytes_per_line = 2;  // 14 Bit aufgerundet --> 16 Bit
-  for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++)
-    printf (" %x", aufgabe_4_bits[i]);
-  printf ("\n");
-  return 0;
-}
diff --git a/20200128/loesung-4-2.c b/20200128/loesung-4-2.c
deleted file mode 100644
index 5d9f8e96434cd7e8429ef20e95f6ce55aedeaa03..0000000000000000000000000000000000000000
--- a/20200128/loesung-4-2.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  int bytes_per_line = 2;  // 14 Bit aufgerundet --> 16 Bit
-
-  FILE *f = fopen ("test.pbm", "w");
-  fprintf (f, "P4\n");
-  fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height);
-  for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++)
-    fprintf (f, "%c", aufgabe_4_bits[i]);
-
-  fclose (f);
-  return 0;
-}
diff --git a/20200128/loesung-4-3.c b/20200128/loesung-4-3.c
deleted file mode 100644
index e0ac291ecd9f80a216841db0414a6ccf6c2d21f9..0000000000000000000000000000000000000000
--- a/20200128/loesung-4-3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  int bytes_per_line = 2;  // 14 Bit aufgerundet --> 16 Bit
-
-  FILE *f = fopen ("test.pbm", "w");
-  fprintf (f, "P4\n");
-  fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height);
-  for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++)
-    {
-      char byte = 0;
-      for (int k = 0; k < 8; k++)
-        if (aufgabe_4_bits[i] & (1 << k))
-          byte |= 1 << (7 - k);
-      fprintf (f, "%c", byte);
-    }
-
-  fclose (f);
-  return 0;
-}
diff --git a/20200128/loesung-4-4.c b/20200128/loesung-4-4.c
deleted file mode 100644
index dfcd72a96d476593ba544ad44003621befe37607..0000000000000000000000000000000000000000
--- a/20200128/loesung-4-4.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  int bytes_per_line = (aufgabe_4_width + 7) / 8;  // 14 Bit aufgerundet --> 16 Bit
-
-  FILE *f = fopen ("test.pbm", "w");
-  fprintf (f, "P4\n");
-  fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height);
-  for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++)
-    {
-      char byte = 0;
-      for (int k = 0; k < 8; k++)
-        if (aufgabe_4_bits[i] & (1 << k))
-          byte |= 1 << (7 - k);
-      fprintf (f, "%c", byte);
-    }
-
-  fclose (f);
-  return 0;
-}
diff --git a/20200128/test.pbm b/20200128/test.pbm
deleted file mode 100644
index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000
Binary files a/20200128/test.pbm and /dev/null differ
diff --git a/20191010/gitlab.png b/20201105/gitlab.png
similarity index 100%
rename from 20191010/gitlab.png
rename to 20201105/gitlab.png
diff --git a/20191010/hello-gtk.c b/20201105/hello-gtk.c
similarity index 100%
rename from 20191010/hello-gtk.c
rename to 20201105/hello-gtk.c
diff --git a/20191010/hello.c b/20201105/hello.c
similarity index 100%
rename from 20191010/hello.c
rename to 20201105/hello.c
diff --git a/20191010/hp-20191010-fig1.pdf b/20201105/hp-20201105-fig1.pdf
similarity index 100%
rename from 20191010/hp-20191010-fig1.pdf
rename to 20201105/hp-20201105-fig1.pdf
diff --git a/20191010/hp-20191010-fig1.tex b/20201105/hp-20201105-fig1.tex
similarity index 100%
rename from 20191010/hp-20191010-fig1.tex
rename to 20201105/hp-20201105-fig1.tex
diff --git a/20191010/hp-20191010.pdf b/20201105/hp-20201105.pdf
similarity index 66%
rename from 20191010/hp-20191010.pdf
rename to 20201105/hp-20201105.pdf
index c5ec236427165491223194a682a0e1c5c4a0b5a7..2c02ccc81ae5c7f44daf48b6bd2b5af95cc58715 100644
Binary files a/20191010/hp-20191010.pdf and b/20201105/hp-20201105.pdf differ
diff --git a/20191010/hp-20191010.tex b/20201105/hp-20201105.tex
similarity index 94%
rename from 20191010/hp-20191010.tex
rename to 20201105/hp-20201105.tex
index 778923a8dedc0ccdbae42ce122dc11d5594d734d..3860857857e2d771ab1b4c2bb2f0936e9fa5fe07 100644
--- a/20191010/hp-20191010.tex
+++ b/20201105/hp-20201105.tex
@@ -1,5 +1,5 @@
-% hp-20191010.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
+% hp-20201105.pdf - Lecture Slides on Low-Level Programming
+% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
 %
 % This document is free software: you can redistribute it and/or
 % modify it either under the terms of the Creative Commons
@@ -39,7 +39,7 @@
 
 \title{Hardwarenahe Programmierung}
 \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{10.\ Oktober 2019}
+\date{5.\ November 2020}
 
 \begin{document}
 
@@ -50,12 +50,47 @@
         \put(0.63,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{%
           \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}}
       \end{picture}%
-      10.\ Oktober 2019}
+      5.\ November 2020}
 
 \maketitleframe
 
 \title{Hardwarenahe Programmierung}
 
+\sectionnonumber{Vorab: Online-Werkzeuge}
+
+\begin{frame}
+
+  \showsectionnonumber
+  \begin{itemize}
+    \item
+      \textbf{Mumble}: Seminarraum 2\\
+      Fragen: Mikrophon einschalten oder über den Chat\\
+      Umfragen: über den Chat
+    \smallskip
+    \item
+      \textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\
+      Eigenen Bildschirm freigeben: über VNC oder über Jitsi Meet\\
+      Kamerabild übertragen: über Jitsi Meet
+    \smallskip
+    \item
+      Allgemeine Informationen:
+      \url{https://www.cvh-server.de/online-werkzeuge/}
+    \smallskip
+    \item
+      Notfall-Schnellzugang: \url{https://www.cvh-server.de/virtuelle-raeume/}\\
+      Seminarraum 2, VNC-Passwort: \lstinline[style=cmd]{testcvh}
+    \smallskip
+    \item
+      Bei Problemen: bitte notieren:\\
+      Art des Problems, genaue Uhrzeit, eigener Internet-Provider\\
+      speziell: Netzanschluß des Studierendenwohnheims
+    \bigskip
+    \item
+      GitLab: \url{https://gitlab.cvh-server.de/pgerwinski/hp}
+  \end{itemize}
+
+\end{frame}
+
 \begin{frame}[fragile]
 
   \vspace{-0.6cm}
@@ -293,11 +328,9 @@
       \textbf{Übungen}\\
       finden bereits diese Woche statt.
     \item
-      \textbf{Praktikumstermine:}
-      \begin{itemize}
-        \item Versuch 1: 17.\,10.\ und 24.\,10.\,2018
-        \item Versuch 2 bis 4: Termine werden noch bekanntgegeben.
-      \end{itemize}
+      Das \textbf{Praktikum}\\
+      findet weitgehend in Heimarbeit statt.\\
+      Bereits heute: vorbereitende Maßnahmen
   \end{itemize}
 
 \end{frame}
diff --git a/20201105/hp-uebung-20201105.pdf b/20201105/hp-uebung-20201105.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9c97bc67ecd62a761409718d9c64de50f812ded9
Binary files /dev/null and b/20201105/hp-uebung-20201105.pdf differ
diff --git a/20191010/hp-uebung-20191010.tex b/20201105/hp-uebung-20201105.tex
similarity index 91%
rename from 20191010/hp-uebung-20191010.tex
rename to 20201105/hp-uebung-20201105.tex
index e4594eb2d99daacb88ea64b13dfa2ae6f313f6bd..322b05a1dbfb76c3378e18586112d2042335c6e8 100644
--- a/20191010/hp-uebung-20191010.tex
+++ b/20201105/hp-uebung-20201105.tex
@@ -1,5 +1,5 @@
-% hp-uebung-20191010.pdf - Exercises on Low-Level Programming / Applied Computer Sciences
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
+% hp-uebung-20200511.pdf - Exercises on Low-Level Programming / Applied Computer Sciences
+% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
 %
 % This document is free software: you can redistribute it and/or
 % modify it either under the terms of the Creative Commons
@@ -33,18 +33,18 @@
   \thispagestyle{empty}
 
   \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 10.\ Oktober 2019}
+            Übungsaufgaben -- 5.\ November 2020}
 
   \exercise{Hello, world!}
 
-  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010}
+  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200511}
   können Sie
-  \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-uebung-20191010.pdf}%
+  \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200511/hp-uebung-20200511.pdf}%
        {diesen Übungszettel als PDF-Datei}
   herunterladen sowie die folgenden Beispielprogramme:
   \begin{enumerate}[\quad(a)]
-    \item \gitfile{hp}{20191010}{hello.c}
-    \item \gitfile{hp}{20191010}{hello-gtk.c}
+    \item \gitfile{hp}{20200511}{hello.c}
+    \item \gitfile{hp}{20200511}{hello-gtk.c}
   \end{enumerate}
   Bringen Sie diese Programme auf Ihrem eigenen Rechner
   und/oder auf einem Rechner der Hochschule
diff --git a/20191010/logo-hochschule-bochum-cvh-text-v2.pdf b/20201105/logo-hochschule-bochum-cvh-text-v2.pdf
similarity index 100%
rename from 20191010/logo-hochschule-bochum-cvh-text-v2.pdf
rename to 20201105/logo-hochschule-bochum-cvh-text-v2.pdf
diff --git a/20191010/logo-hochschule-bochum.pdf b/20201105/logo-hochschule-bochum.pdf
similarity index 100%
rename from 20191010/logo-hochschule-bochum.pdf
rename to 20201105/logo-hochschule-bochum.pdf
diff --git a/20191010/pgscript.sty b/20201105/pgscript.sty
similarity index 100%
rename from 20191010/pgscript.sty
rename to 20201105/pgscript.sty
diff --git a/20191010/pgslides.sty b/20201105/pgslides.sty
similarity index 100%
rename from 20191010/pgslides.sty
rename to 20201105/pgslides.sty
diff --git a/README.md b/README.md
deleted file mode 100644
index 1794e588716837622313a0a601a0413eea08661d..0000000000000000000000000000000000000000
--- a/README.md
+++ /dev/null
@@ -1,127 +0,0 @@
-Hardwarenahe Programmierung
-===========================
-
-Lehrveranstaltung im Wintersemester 2019/20  
-Hochschule Bochum, Campus Velbert/Heiligenhaus  
-Prof. Dr. rer. nat. Peter Gerwinski
-
-Copyright © 2012–2019  Peter Gerwinski
-
-**Diese Lehrmaterialien sind freie Software.**  
-Sie dürfen diese gemäß den jeweils angegebenen Lizenzen  
-([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0),
-[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3),
-[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED))  
-studieren, kopieren, modifizieren und/oder weitergeben.  
-Für Details siehe [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README).
-
-Vortragsfolien und Beispiele:
------------------------------
- * [10.10.2019: Einführung, Einführung in C (bis Schleifen)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-20191010.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010/)
- * [17.10.2019: Einführung in C: Seiteneffekte, Funktionen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-20191017.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191017/)
- * [24.10.2019: Einführung in C: Zeiger, Arrays und Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-20191024.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024/)
- * [31.10.2019: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-20191031.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191031/)
- * [07.11.2019: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-20191107.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191107/)
- * [14.11.2019: Bit-Operationen, I/O-Ports](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-20191114.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191114/)
- * [21.11.2019: Interrupts, volatile-Variable, Bibliotheken: Einführung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-20191121.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191121/)
- * [28.11.2019: Präprozessor, Bibliotheken](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-20191128.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191128/)
- * [05.12.2019: Bibliotheken, Differentialgleichungen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-20191205.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191205/)
- * [12.12.2019: make, Byte-Reihenfolge - Endianness](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-20191212.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191212/)
- * [19.12.2019: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-20191219.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191219/)
- * [02.01.2020: Quantencomputer, Datensicherheit und Datenschutz](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/hp-20200102.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200102/)
- * [09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-20200109.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200109/)
- * [16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-20200116.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200116/)
- * [23.01.2020: Objektorientierte Programmierung, Datenstrukturen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/)
- * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf)
-
-Übungsaufgaben:
----------------
- * [10.10.2019: Hello-World-Programme, Schaltjahr ermitteln, Maximum berechnen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-uebung-20191010.pdf)
- * [17.10.2019: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-uebung-20191017.pdf)
- * [24.10.2019: Seltsame Programme, Kalender-Berechnung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-uebung-20191024.pdf)
- * [31.10.2019: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-uebung-20191031.pdf)
- * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-uebung-20191107.pdf)
- * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-uebung-20191114.pdf)
- * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-uebung-20191121.pdf)
- * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-uebung-20191128.pdf)
- * [05.12.2019: Löschen aus Strings, Hexdumps](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-uebung-20191205.pdf)
- * [12.12.2019: Kondensator, hüpfender Ball](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-uebung-20191212.pdf)
- * [19.12.2019: Trickprogrammierung, Thermometer-Baustein an I²C-Bus](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-uebung-20191219.pdf)
- * [09.01.2020: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-uebung-20200109.pdf)
- * [16.01.2020: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-uebung-20200116.pdf)
- * [23.01.2020: Stack-Operationen, Iteratorfunktionen, dynamisches Bit-Array](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-uebung-20200123.pdf)
-
-Musterlösungen:
----------------
- * [17.10.2019: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-musterloesung-20191017.pdf)
- * [24.10.2019: Seltsame Programme, Kalender-Berechnung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-musterloesung-20191024.pdf)
- * [31.10.2019: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-musterloesung-20191031.pdf)
- * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-musterloesung-20191107.pdf)
- * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-musterloesung-20191114.pdf)
- * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-musterloesung-20191121.pdf)
- * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191128.pdf)
- * [05.12.2019: Löschen aus Strings, Hexdumps](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-musterloesung-20191205.pdf)
- * [12.12.2019: Kondensator, hüpfender Ball](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-musterloesung-20191212.pdf)
- * [19.12.2019: Trickprogrammierung, Thermometer-Baustein an I²C-Bus](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-musterloesung-20191219.pdf)
- * [09.01.2020: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-musterloesung-20200109.pdf)
- * [16.01.2020: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-musterloesung-20200116.pdf)
- * [23.01.2020: Stack-Operationen, Iteratorfunktionen, dynamisches Bit-Array](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-musterloesung-20200123.pdf)
-
-Tafelbilder:
-------------
- * [07.11.2019: Beispiele für Bit-Manipulation](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/photo-20191107-172458.jpg)
- * [14.11.2019: Logische und bitweise Und-Verknüpfung (rechts), einzelnes Bit auf 1 setzen (links)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172339.jpg)
- * [14.11.2019: Einzelnes Bit auf 1 (rechts) bzw. auf 0 (links) setzen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172358.jpg)
- * [14.11.2019: Einzelnes Bit auf 0 setzen (rechts) bzw. umklappen (Mitte) bzw. abfragen (links)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172434.jpg)
- * [05.12.2019: Schräger Wurf](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/photo-20191205-171706.jpg)
- * [19.12.2019: Interpretation von Bytes im Speicher als Zahlenwert](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/photo-20191219-172103.jpg)
- * [19.12.2019: Bildschirmspeicher als Beispiel für Speicherausrichting (Alignment)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/photo-20191219-172146.jpg)
- * [02.01.2020: Quantencomputer: physikalische Realisierung von Qubits](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/photo-20200102-174206.jpg)
-
-Praktikumsunterlagen:
----------------------
- * [Versuch 1, 17. und 31.10.2019: RSA-Verschlüsselung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-2019ws-p1.pdf)
- * [Versuch 2, 14. und 21.11.2019: Druckknopfampel](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-2019ws-p2.pdf)
- * [Versuch 3, 12. und 19.12.2019: Weltraum-Simulation](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-2019ws-p3.pdf)
- * [Versuch 4, 16. und 23.1.2020: Objektorientiertes Grafik-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-2019ws-p4.pdf)
-
-Alte Klausuren:
----------------
- * [Wintersemester 2015/16](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20160129/ainf-klausur-20160129.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20160129/)
- * [Wintersemester 2016/17](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20170206/hp-klausur-20170206.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20170206/)
- * [Wintersemester 2017/18](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20180213/hp-klausur-20180213.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20180213/)
-
-Skript:
--------
- * [Hardwarenahe Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/script/hp-2019ws.pdf)
-
-Original-Materialien einschließlich Beispiel-Programme und LaTeX-Quelltexte:
-----------------------------------------------------------------------------
- * [common – gemeinsame Dateien für Skript und Vortragsfolien](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common)
- * [script – Skript zur Lehrveranstaltung](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script)
- * [201????? – Vortragsfolien und Beispiele](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master)
- * [branch 2018ws – vollständige Lehrmaterialien vom Wintersemester 2018/19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws)
-
-
-Low-Level Programming
-=====================
-
-Course in winter semester 2019–20
-Bochum University of Applied Sciences, Campus Velbert/Heiligenhaus  
-Prof. Dr. rer. nat. Peter Gerwinski
-
-Copyright © 2012–2019  Peter Gerwinski
-
-**These teaching materials are Free Software.**  
-You may study, copy, modify, and/or distribute them  
-according to their respective licences  
-([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0),
-[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3),
-[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)).  
-See the file [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README) for details.
-
- * [common – common files for lecture notes and slides](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common)
- * [script – lecture notes](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script)
- * [201????? – slides and examples](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master)
- * [hp-slides-2019ws.pdf – all slides in 1 file](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf)
- * [branch 2018ws – complete teaching materials from winter semester 2018–19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws)
diff --git a/exams/20160129/ainf-klausur-20160129.pdf b/exams/20160129/ainf-klausur-20160129.pdf
deleted file mode 100644
index 98188d5dc9c53ae369995adcd740f311233698f4..0000000000000000000000000000000000000000
Binary files a/exams/20160129/ainf-klausur-20160129.pdf and /dev/null differ
diff --git a/exams/20160129/ainf-klausur-20160129.tex b/exams/20160129/ainf-klausur-20160129.tex
deleted file mode 100644
index 4f8a3d1d4252e6e2f741a1c60baf15fc726c543a..0000000000000000000000000000000000000000
--- a/exams/20160129/ainf-klausur-20160129.tex
+++ /dev/null
@@ -1,376 +0,0 @@
-% ainf-klausur-20160129.pdf - Examination on Applied Computer Sciences
-% Copyright (C) 2015, 2016  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Wintersemester 2015/16
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\newcounter{exercise}
-\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}}
-\usepackage{enumerate}
-\usepackage{ifthen}
-
-\newcommand{\workspacexyt}[3]{%
-  \begin{center}
-    \setlength{\unitlength}{0.5cm}
-    \begin{picture}(#1,#2)
-      \color[rgb]{0.7,0.7,0.7}
-      \put(0,0){\line(1,0){#1}}
-      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
-      \put(0,0){\line(0,1){#2}}
-      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
-      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
-    \end{picture}
-  \end{center}}
-
-\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
-
-\newcounter{points}
-\newcommand{\points}[1]{\ifthenelse{#1=1}{(1 Punkt)}{(#1 Punkte)}\addtocounter{points}{#1}}
-
-\begin{document}
-
-  \thispagestyle{empty}
-  \strut\hfill
-  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
-  \section*{Angewandte Informatik -- Klausur -- 29.\ Januar 2016}
-  Prof.~Dr.~Peter Gerwinski, Wintersemester 2015/16
-
-  \bigskip
-  \bigskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{2.0}
-    \begin{tabular}{|l|p{10cm}|} \hline
-      Name: & \\\hline
-      Matrikel-Nr.: & \\\hline
-    \end{tabular}
-  \end{center}
-
-  \bigskip
-
-  Zeit: 120 Minuten
-
-  Zulässige Hilfsmittel: 
-  \begin{itemize}
-    \item Schreibgerät
-    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
-    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)\\
-          \emph{ohne}\/ Zugang zu Datennetzen jeglicher Art
-  \end{itemize}
-
-  Nur die o.\,a.\ zulässigen Hilfsmittel
-  dürfen sich während der Klausur im Arbeitsbereich befinden.
-  \mbox{WLAN-,} Bluetooth- und sonstige Funkeinheiten von Notebooks o.\,ä.\
-  sind auszuschalten;
-  ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
-  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
-  sind auszuschalten und in der Tasche
-  zu verstauen.
-
-  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
-  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
-  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
-
-  Die Beispielprogramme werden Ihnen auf Datenträger (USB-Stick)
-  zur Verfügung gestellt. Die Abgabe von digital gelösten Aufgaben
-  hat auf demselben Datenträger zu erfolgen.
-
-  \clearpage
-
-  \exercise{Strings}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void fun (char *s)
-    {
-      int len = strlen (s);
-      for (int i = 0; i < len; i++)
-        for (int j = i + 1; j < len; j++)
-          if (s[i] > s[j])
-            {
-              char sx = s[i];
-              s[i] = s[j];
-              s[j] = sx;
-            }
-    }
-
-    int main (void)
-    {
-      char s[] = "Informatik";
-      fun (s);
-      printf ("%s\n", s);
-      return 0;
-    }
-  \end{lstlisting}
-  Auf einem Rechner, der den ASCII-Zeichensatz verwendet, lautet die Ausgabe:
-  \lstinline[style=terminal]{Iafikmnort}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Was bewirkt die Funktion \lstinline{fun}, und wie funktioniert sie?
-      \points{4}
-      \workspace{14}
-    \item
-      Warum beginnt der Ausgabe-String mit \lstinline{'I'} und nicht mit \lstinline{'a'}?
-      \points{2}
-      \workspace{10}
-    \item
-      Was passiert, wenn die Zeile \lstinline{char s[] = "Informatik";}
-      durch \lstinline|char s[] = { 'I', 'n', 'f', 'o'|~\lstinline|};| ersetzt wird, und warum?
-      \points{2}
-      \workspace{10}
-    \item
-      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun} und warum?
-
-      Wir beziehen uns hierbei auf die Anzahl der Vergleiche \lstinline{s[i] > s[j]}
-      in Abhängigkeit von der Länge des Eingabe-Strings \lstinline{"Informatik"}.
-      \points{1}
-      \workspace{10}
-    \item
-      Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
-      sich die Funktion \lstinline{fun} hinsichtlich der Rechenzeit
-      effizienter gestalten läßt. Von welcher Ordnung
-      (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?
-      \points{4}
-      \workspace{21}
-  \end{enumerate}
-
-  \exercise{Zeigerarithmetik}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <stdint.h>
-
-    void output (uint16_t *a)
-    {
-      for (int i = 0; a[i]; i++)
-        printf (" %d", a[i]);
-      printf ("\n");
-    }
-
-    int main (void)
-    {
-      uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
-
-      uint16_t *p1 = prime_numbers;
-      output (p1);
-      p1++;
-      output (p1);
-
-      char *p2 = prime_numbers;
-      output (p2);
-      p2++;
-      output (p2);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird compiliert und ausgeführt:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -std=c99 aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function 'main':
-    aufgabe-2.c:20:13: warning: initialization from
-                       incompatible pointer type [enabled by default]
-    aufgabe-2.c:21:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    aufgabe-2.c:23:3: warning: passing argument 1 of 'output' from
-                      incompatible pointer type [enabled by default]
-    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
-    $ ¡./aufgabe-2¿
-     2 3 5 7 11 13 17
-     3 5 7 11 13 17
-     2 3 5 7 11 13 17
-     768 1280 1792 2816 3328 4352
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.
-      \points{2}
-      \workspace{10}
-      \workspace{5}
-    \item
-      Begründen Sie den Unterschied zwischen der ersten (\lstinline{2 3 5 7 11 13 17})\\
-      und der zweiten Zeile (\lstinline{3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{2}
-      \workspace{11}
-    \item
-      Erklären Sie die beim Compilieren auftretenden Warnungen\\
-      und die dritte Zeile (\lstinline{2 3 5 7 11 13 17}) der Ausgabe des Programms.
-      \points{3}
-      \workspace{11}
-    \item
-      Erklären Sie die vierte Zeile (\lstinline{768 1280 1792 2816 3328 4352})
-      der Ausgabe des Programms.\\
-%      Welche Endianness hat der verwendete Rechner?\\
-%      Wie sähe die Ausgabezeile bei umgekehrter Endianness aus?
-%
-% 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% 0 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
-%   2 0 3 0 5 0 7 0 11 --> 768 1280 ...
-%
-% --> Endianness nicht erkennbar!
-%
-      Sie dürfen einen Little-Endian-Rechner voraussetzen.
-      \points{4}
-      \workspace{16}
-  \end{enumerate}
-
-  \exercise{Objektorientierte Programmierung}
-
-  Wir betrachten das folgende Fragment (\file{aufgabe-3.c})
-  eines objektorientierten Mathematik-Programms:
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <stdlib.h>
-
-    typedef struct
-    {
-      char symbol;
-      int (*calculate) (int a, int b);
-    }
-    operation;
-
-    operation *new_operation (void)
-    {
-      operation *op = malloc (sizeof (operation));
-      op->symbol = '?';
-      op->calculate = NULL;
-      return op;
-    }
-
-    [...]
-
-    int main (void)
-    {
-      operation *op[4];
-      op[0] = new_plus ();
-      op[1] = new_minus ();
-      op[2] = new_times ();
-      op[3] = NULL;
-      for (int i = 0; op[i]; i++)
-        printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
-      return 0;
-    }
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Was bedeutet \lstinline{int (*calculate) (int a, int b)},
-      und für welchen Zweck wird es verwendet?
-      \points{3}
-      \workspace{12}
-    \item
-      Ergänzen Sie das Fragment zu einem funktionsfähigen Programm,
-      das die folgende Ausgabe erzeugt:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        2 + 3 = 5
-        2 - 3 = -1
-        2 * 3 = 6
-      \end{lstlisting}
-      \points{5}
-
-      Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.\\
-      Für Notizen verwenden Sie nötigenfalls die Rückseiten der Klausurbögen
-      und/oder zusätzliche Blätter.
-    \item
-      Was geschieht, wenn man auf die Zeile \lstinline{op[3] = NULL;} verzichtet,
-      und warum?
-      \points{2}
-      \workspace{8}
-  \end{enumerate}
-
-  \exercise{XBM-Grafik}
-
-  Bei einer XBM-Grafikdatei handelt es sich
-  um ein als C-Quelltext abgespeichertes Array,
-  das die Bildinformationen enthält:
-  \begin{itemize}\itemsep0pt
-    \item Jedes Bit entspricht einem Pixel.
-    \item Nullen stehen für Weiß, Einsen für Schwarz.
-    \item LSB first.
-    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
-    \item Breite und Höhe des Bildes sind als Konstantendefinitionen
-          (\lstinline{#define}) in der Datei enthalten.
-  \end{itemize}
-  Sie können eine XBM-Datei sowohl mit einem Texteditor
-  als auch mit vielen Grafikprogrammen öffnen und bearbeiten.
-
-  Beispiel (\file{aufgabe-4.xbm}):\hfill
-  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
-  \begin{lstlisting}
-    #define aufgabe_4_width 14
-    #define aufgabe_4_height 14
-    static unsigned char aufgabe_4_bits[] = {
-       0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
-       0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
-       0xf0, 0x03, 0x00, 0x00 };
-  \end{lstlisting} 
-  Ein C-Programm, das eine XBM-Grafik nutzen will,
-  kann die \file{.xbm}-Datei mit \lstinline{#include "..."} direkt einbinden.
-
-  Schreiben Sie ein Programm, das die XBM-Datei als ASCII-Grafik ausgibt, z.\,B.:
-  \begin{lstlisting}[style=terminal,lineskip=-4pt]
-                  
-        ******    
-       *      *   
-      *        *  
-     *          * 
-     *  **  **  * 
-     *   *   *  * 
-     *          * 
-     * *      * * 
-     *  *    *  * 
-      *  ****  *  
-       *      *   
-        ******    
-    ¡              ¿
-  \end{lstlisting}
-  \points{8}
-
-  Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.\\
-  Für Notizen verwenden Sie nötigenfalls die Rückseiten der Klausurbögen
-  und/oder zusätzliche Blätter.
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-  \vfill
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-\end{document}
diff --git a/exams/20160129/aufgabe-1.c b/exams/20160129/aufgabe-1.c
deleted file mode 100644
index ea4fbee0996c834e8dfed3a72e0d46a2debcce68..0000000000000000000000000000000000000000
--- a/exams/20160129/aufgabe-1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void fun (char *s)
-{
-  int len = strlen (s);
-  for (int i = 0; i < len; i++)
-    for (int j = i + 1; j < len; j++)
-      if (s[i] > s[j])
-        {
-          char sx = s[i];
-          s[i] = s[j];
-          s[j] = sx;
-        }
-}
-
-int main (void)
-{
-  char s[] = "Informatik";
-  fun (s);
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/exams/20160129/aufgabe-1c.c b/exams/20160129/aufgabe-1c.c
deleted file mode 100644
index e6fd60d1a083b255af53f05089afb2da5333b157..0000000000000000000000000000000000000000
--- a/exams/20160129/aufgabe-1c.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void fun (char *s)
-{
-  int len = strlen (s);
-  for (int i = 0; i < len; i++)
-    for (int j = i + 1; j < len; j++)
-      if (s[i] > s[j])
-        {
-          char sx = s[i];
-          s[i] = s[j];
-          s[j] = sx;
-        }
-}
-
-int main (void)
-{
-  char s[] = { 'I', 'n', 'f', 'o' };
-  fun (s);
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/exams/20160129/aufgabe-2.c b/exams/20160129/aufgabe-2.c
deleted file mode 100644
index 33dbe39325bbfe9bf2481194b0be3420f1e3344e..0000000000000000000000000000000000000000
--- a/exams/20160129/aufgabe-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-void output (uint16_t *a)
-{
-  for (int i = 0; a[i]; i++)
-    printf (" %d", a[i]);
-  printf ("\n");
-}
-
-int main (void)
-{
-  uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
-
-  uint16_t *p1 = prime_numbers;
-  output (p1);
-  p1++;
-  output (p1);
-
-  char *p2 = prime_numbers;
-  output (p2);
-  p2++;
-  output (p2);
-
-  return 0;
-}
diff --git a/exams/20160129/aufgabe-3.c b/exams/20160129/aufgabe-3.c
deleted file mode 100644
index d99132fcf7a86b293c935794295c258c25726b55..0000000000000000000000000000000000000000
--- a/exams/20160129/aufgabe-3.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct
-{
-  char symbol;
-  int (*calculate) (int a, int b);
-}
-operation;
-
-operation *new_operation (void)
-{
-  operation *op = malloc (sizeof (operation));
-  op->symbol = '?';
-  op->calculate = NULL;
-  return op;
-}
-
-[...]
-
-int main (void)
-{
-  operation *op[4];
-  op[0] = new_plus ();
-  op[1] = new_minus ();
-  op[2] = new_times ();
-  op[3] = NULL;
-  for (int i = 0; op[i]; i++)
-    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
-  return 0;
-}
diff --git a/exams/20160129/aufgabe-4.png b/exams/20160129/aufgabe-4.png
deleted file mode 100644
index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000
Binary files a/exams/20160129/aufgabe-4.png and /dev/null differ
diff --git a/exams/20160129/aufgabe-4.xbm b/exams/20160129/aufgabe-4.xbm
deleted file mode 100644
index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000
--- a/exams/20160129/aufgabe-4.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define aufgabe_4_width 14
-#define aufgabe_4_height 14
-static unsigned char aufgabe_4_bits[] = {
-   0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
-   0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
-   0xf0, 0x03, 0x00, 0x00 };
diff --git a/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000
--- a/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20160129/logo-hochschule-bochum.pdf b/exams/20160129/logo-hochschule-bochum.pdf
deleted file mode 120000
index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000
--- a/exams/20160129/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20160129/pgscript.sty b/exams/20160129/pgscript.sty
deleted file mode 120000
index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000
--- a/exams/20160129/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../../common/pgscript.sty
\ No newline at end of file
diff --git a/exams/20170206/aufgabe-1.c b/exams/20170206/aufgabe-1.c
deleted file mode 100644
index da281ff2018fa58fcf5b0186922926e199c269b5..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-1.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void fun (char *s)
-{
-  int len = strlen (s);
-  for (int i = 0; i < len; i++)
-    {
-      for (int j = i - 1; j >= 0; j--)
-        {
-          if (s[i] < s[j])
-            {
-              char sx = s[i];
-              s[i] = s[j];
-              s[j] = sx;
-            }
-        }
-    }
-}
-
-int main (void)
-{
-  char s[] = "BAECD";
-  fun (s);
-  printf ("%s\n", s);
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-2.c b/exams/20170206/aufgabe-2.c
deleted file mode 100644
index 9be1f468a89b529d8d6927563a85237ce3da6e8a..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint16_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
-  printf ("%s", numbers);
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-2c.c b/exams/20170206/aufgabe-2c.c
deleted file mode 100644
index ef804f62f90340145cb321b9f0cc29da5cb30d0d..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-2c.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint32_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
-  printf ("%s\n", numbers);
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-2d.c b/exams/20170206/aufgabe-2d.c
deleted file mode 100644
index 325f461e52acb26ee88c6473d172e0a445141add..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-2d.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
-  printf ("%s\n", numbers);
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-3.c b/exams/20170206/aufgabe-3.c
deleted file mode 100644
index 69c78edeb13d6c015a3f2a7eca66dc46ccb8edfe..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-3.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-
-void sort (void **data, int (*compare) (void *x1, void *x2))
-{
-  for (int i = 0; data[i]; i++)
-    for (int j = i + 1; data[j]; j++)
-      if (compare (data[i], data[j]) > 0)
-        {
-          void *tmp = data[i];
-          data[i] = data[j];
-          data[j] = tmp;
-        }
-}
-
-[...]
-
-int main (void)
-{
-  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
-  sort (strings, compare_strings);
-  for (int i = 0; strings[i]; i++)
-    printf ("%s\n", strings[i]);
-
-  printf ("\n");
-
-  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
-  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
-  sort (numbers, compare_numbers);
-  for (int i = 0; numbers[i]; i++)
-    printf ("%d\n", *numbers[i]);
-
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-4.c b/exams/20170206/aufgabe-4.c
deleted file mode 100644
index 29d7f6b5d138009bb988867409a2c9cb97aadaa0..0000000000000000000000000000000000000000
--- a/exams/20170206/aufgabe-4.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-
-[...]
-
-int main (void)
-{
-  pbm_open (14, 14, "test.pbm");
-  pbm_line ("              ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("   X      X   ");
-  pbm_line ("  X        X  ");
-  pbm_line (" X          X ");
-  pbm_line (" X  XX  XX  X ");
-  pbm_line (" X   X   X  X ");
-  pbm_line (" X          X ");
-  pbm_line (" X X      X X ");
-  pbm_line (" X  X    X  X ");
-  pbm_line ("  X  XXXX  X  ");
-  pbm_line ("   X      X   ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("              ");
-  pbm_close ();
-  return 0;
-}
diff --git a/exams/20170206/aufgabe-4.pbm b/exams/20170206/aufgabe-4.pbm
deleted file mode 100644
index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000
Binary files a/exams/20170206/aufgabe-4.pbm and /dev/null differ
diff --git a/exams/20170206/aufgabe-4.png b/exams/20170206/aufgabe-4.png
deleted file mode 100644
index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000
Binary files a/exams/20170206/aufgabe-4.png and /dev/null differ
diff --git a/exams/20170206/hp-klausur-20170206.pdf b/exams/20170206/hp-klausur-20170206.pdf
deleted file mode 100644
index 61bc53b93f31062bf34b056bc292c198beddbaa3..0000000000000000000000000000000000000000
Binary files a/exams/20170206/hp-klausur-20170206.pdf and /dev/null differ
diff --git a/exams/20170206/hp-klausur-20170206.tex b/exams/20170206/hp-klausur-20170206.tex
deleted file mode 100644
index cf99f87fa2b4c3424e96f2456732e3382dadf17e..0000000000000000000000000000000000000000
--- a/exams/20170206/hp-klausur-20170206.tex
+++ /dev/null
@@ -1,56 +0,0 @@
-% hp-klausur-20170206.pdf - Examination on Applied Computer Sciences
-% Copyright (C) 2015, 2016, 2017  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Wintersemester 2016/17
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\newcommand{\workspacexyt}[3]{%
-  \begin{center}
-    \setlength{\unitlength}{0.5cm}
-    \begin{picture}(#1,#2)
-      \color[rgb]{0.7,0.7,0.7}
-      \put(0,0){\line(1,0){#1}}
-      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
-      \put(0,0){\line(0,1){#2}}
-      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
-      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
-    \end{picture}
-  \end{center}}
-
-\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
-
-\newcommand{\klausur}[2]{%
-  \clearpage
-  \setcounter{page}{1}
-  \setcounter{points}{0}
-  \setcounter{exercise}{0}
-  \gdef\username{#1}
-  \gdef\password{#2}
-  \input{klausur}
-}
-
-\begin{document}
-  \klausur{29}{ksVY3vujsxPY}
-\end{document}
diff --git a/exams/20170206/hp-musterloesung-20170206.pdf b/exams/20170206/hp-musterloesung-20170206.pdf
deleted file mode 100644
index 994b2f7fc7ea0b3f587d1c9b20749dd07c59c4ee..0000000000000000000000000000000000000000
Binary files a/exams/20170206/hp-musterloesung-20170206.pdf and /dev/null differ
diff --git a/exams/20170206/hp-musterloesung-20170206.tex b/exams/20170206/hp-musterloesung-20170206.tex
deleted file mode 100644
index a3eba568496f820c3f42989481bb0713d3dbe53d..0000000000000000000000000000000000000000
--- a/exams/20170206/hp-musterloesung-20170206.tex
+++ /dev/null
@@ -1,514 +0,0 @@
-% hp-musterloesung-20191205.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Löschen aus Strings, Hexdumps
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zur Klausur vom 6.\ Februar 2017}
-
-  \addtocounter{exercise}{1}
-
-\iffalse
-
-  \exercise{Strings umsortieren}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void fun (char *s)
-    {
-      int len = strlen (s);
-      for (int i = 0; i < len; i++)
-        {
-          for (int j = i - 1; j >= 0; j--)
-            {
-              if (s[i] < s[j])
-                {
-                  char sx = s[i];
-                  s[i] = s[j];
-                  s[j] = sx;
-                }
-            }
-        }
-    }
-
-    int main (void)
-    {
-      char s[] = "BAECD";
-      fun (s);
-      printf ("%s\n", s);
-      return 0;
-    }
-  \end{lstlisting}
-  Auf einem Rechner, der den ASCII-Zeichensatz verwendet, lautet die Ausgabe:
-  \lstinline[style=terminal]{ABCDE}
-
-  \begin{enumerate}[\quad(a)]
-%    \item
-%      Was bewirkt die Funktion \lstinline{fun}?
-%      \points{4}
-%      \workspace{12}
-    \item
-      Beweisen Sie (z.\,B.\ anhand eines Gegenbeispiels),
-      daß die Funktion allgemein \lstinline{fun} \emph{nicht\/} dazu geeignet ist,
-      die Buchstaben eines Strings gemäß ihrer ASCII-Reihenfolge zu sortieren.
-      \points{2}
-%      \workspace{9}
-    \item
-      Was kann passieren, wenn die Zeile \lstinline{char s[] = "BAECD";}
-      durch \lstinline|char s[] = { 'B', 'A', 'E', 'C', 'D'|~\lstinline|};| ersetzt wird, und warum?
-      \points{2}
-%      \workspace{10}
-    \item
-      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun} und warum?
-
-      Wir beziehen uns hierbei auf die Anzahl der Vergleiche \lstinline{s[i] < s[j]}
-      in Abhängigkeit von der Länge des Eingabe-Strings \lstinline{"BAECD"}.
-      \points{1}
-%      \workspace{10}
-    \item
-      Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
-      sich die Funktion \lstinline{fun} so abwandeln läßt,
-      daß sie die Buchstaben des Strings \lstinline{s} gemäß ihrer ASCII-Reihenfolge sortiert.
-      Von welcher Ordnung (Landau-Symbol) ist Ihre Version der Funktion und warum?
-      \points{3}
-%      \workspace{22}
-  \end{enumerate}
-
-\fi
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <stdint.h>
-
-    int main (void)
-    {
-      uint16_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
-      printf ("%s", numbers);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird compiliert und ausgeführt:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function ‘main’:
-    aufgabe-2.c:7:3: warning: format ‘%s’ expects argument of type ‘char *’,
-                     but argument 2 has type ‘uint16_t *’ [-Wformat]
-    $ ¡./aufgabe-2¿
-    Hello, world!
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die beim Compilieren auftretende Warnung.
-      \points{2}
-%      \workspace{8}
-    \item
-      Erklären Sie die Ausgabe des Programms.\\
-      Welche Endianness hat der verwendete Rechner?
-      \points{4}
-%      \workspace{16}
-%    \item
-%      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-%      \points{2}
-%      \workspace{11}
-    \item
-      Erklären Sie die Ausgabe des Programms,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint32_t} ersetzen.
-      \points{3}
-%      \workspace{12}
-    \item
-      Erklären Sie die Ausgabe des Programms
-      und die beim Compilieren auftretenden Warnungen,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint8_t} ersetzen.
-      Warum tritt die Warnung aus den vorherigen Aufgabenteilen nicht mehr auf?
-      \points{3}
-%      \workspace{14}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Erklären Sie die beim Compilieren auftretende Warnung.}
-
-      Die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s}
-      erwartet als Parameter einen String, d.\,h.\ einen Zeiger auf \lstinline{char}.
-      Der übergebene Parameter \lstinline{numbers} ist hingegen
-      der Name eines Arrays und somit kompatibel zu Zeigern auf Elemente des Arrays,
-      also auf \lstinline{uint16_t}, insbesondere nicht auf \lstinline{char}.
-
-    \item
-      \textbf{Erklären Sie die Ausgabe des Programms.\\
-      Welche Endianness hat der verwendete Rechner?}
-
-      Die Funktion \lstinline{printf()}
-      hat einen Zeiger auf das Array \lstinline{numbers} übergeben bekommen,
-      gibt aber den String \lstinline{"Hello, world!\n"} aus.
-      Demnach muß sich in den Speicherzellen des Arrays dieser String befinden:
-      \begin{center}
-        \begin{picture}(14,1.5)(0,-0.5)
-          \put(0,0){\line(1,0){14}}
-          \put(0,1){\line(1,0){14}}
-          \multiput(0,0)(1,0){15}{\line(0,1){1}}
-          \put(0.35,0.38){\lstinline{'H'}}
-          \put(1.35,0.38){\lstinline{'e'}}
-          \put(2.35,0.38){\lstinline{'l'}}
-          \put(3.35,0.38){\lstinline{'l'}}
-          \put(4.35,0.38){\lstinline{'o'}}
-          \put(5.35,0.38){\lstinline{','}}
-          \put(6.35,0.38){\lstinline{' '}}
-          \put(7.35,0.38){\lstinline{'w'}}
-          \put(8.35,0.38){\lstinline{'o'}}
-          \put(9.35,0.38){\lstinline{'r'}}
-          \put(10.35,0.38){\lstinline{'l'}}
-          \put(11.35,0.38){\lstinline{'d'}}
-          \put(12.35,0.38){\lstinline{'!'}}
-          \put(13.30,0.38){\lstinline{'\\n'}}
-          \put(1.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}}
-          \put(3.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}}
-          \put(5.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}}
-          \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[3]}}}$}}
-          \put(9.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[4]}}}$}}
-          \put(11.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[5]}}}$}}
-          \put(13.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[6]}}}$}}
-        \end{picture}
-      \end{center}
-
-      \goodbreak
-
-      Wenn wir die Zeichen gemäß ASCII in Hexadezimalzahlen umrechnen, erhalten wir:
-      \begin{center}
-        \begin{picture}(14,1.5)(0,-0.5)
-          \put(0,0){\line(1,0){14}}
-          \put(0,1){\line(1,0){14}}
-          \multiput(0,0)(1,0){15}{\line(0,1){1}}
-          \put(0.5,0.5){\makebox(0,0){\lstinline{0x48}}}
-          \put(1.5,0.5){\makebox(0,0){\lstinline{0x65}}}
-          \put(2.5,0.5){\makebox(0,0){\lstinline{0x6c}}}
-          \put(3.5,0.5){\makebox(0,0){\lstinline{0x6c}}}
-          \put(4.5,0.5){\makebox(0,0){\lstinline{0x6f}}}
-          \put(5.5,0.5){\makebox(0,0){\lstinline{0x2c}}}
-          \put(6.5,0.5){\makebox(0,0){\lstinline{0x20}}}
-          \put(7.5,0.5){\makebox(0,0){\lstinline{0x77}}}
-          \put(8.5,0.5){\makebox(0,0){\lstinline{0x6f}}}
-          \put(9.5,0.5){\makebox(0,0){\lstinline{0x72}}}
-          \put(10.5,0.5){\makebox(0,0){\lstinline{0x6c}}}
-          \put(11.5,0.5){\makebox(0,0){\lstinline{0x64}}}
-          \put(12.5,0.5){\makebox(0,0){\lstinline{0x21}}}
-          \put(13.5,0.5){\makebox(0,0){\lstinline{0x0a}}}
-          \put(1.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}}
-          \put(3.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}}
-          \put(5.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}}
-          \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[3]}}}$}}
-          \put(9.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[4]}}}$}}
-          \put(11.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[5]}}}$}}
-          \put(13.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[6]}}}$}}
-        \end{picture}
-      \end{center}
-
-      Auf einem Big-Endian-Rechner gälte dann:
-      \begin{lstlisting}
-        numbers[0] = 0x4865 = 18533
-        numbers[1] = 0x6c6c = 27756
-        numbers[2] = 0x6f2c = 28460
-        numbers[3] = 0x2077 = 8311
-        numbers[4] = 0x6f72 = 28530
-        numbers[5] = 0x6c64 = 27748
-        numbers[6] = 0x210a = 8458
-      \end{lstlisting}
-      Dies stimmt nicht mit dem Quelltext des Programms überein.
-
-      Auf einem Little-Endian-Rechner gälte dann:
-      \begin{lstlisting}
-        numbers[0] = 0x6548 = 25928
-        numbers[1] = 0x6c6c = 27756
-        numbers[2] = 0x2c6f = 11375
-        numbers[3] = 0x7720 = 30496
-        numbers[4] = 0x726f = 29295
-        numbers[5] = 0x646c = 25708
-        numbers[6] = 0x0a21 = 2593
-      \end{lstlisting}
-      Dies stimmt mit dem Quelltext des Programms überein.
-
-      Zusammenfassung: \lstinline{printf()} interpretiert die Speicherzellen
-      des Arrays \lstinline{numbers} als ASCII-Zeichen.
-      Wenn man die Zahlen Little-Endian im Speicher ablegt,
-      ergibt sich daraus der String \lstinline{"Hello, world!\n"}.
-      Der verwendete Rechner hat daher insbesondere die Endianness Little-Endian.
-
-      Die oben nicht dargestellte Zahl \lstinline{numbers[7]} enthält eine Null.
-      Diese dient als Ende-Markierung des Strings
-      und sieht in Big-Endian und in Little-Endian gleich aus
-      (\lstinline{0x00 0x00}).
-
-    \item
-      \textbf{Erklären Sie die Ausgabe des Programms,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint32_t} ersetzen.}
-
-      Die Ausgabe lautet dann: \lstinline[style=terminal]{He}.
-
-      Wenn wir 32-Bit-Zahlen mit 16-Bit-Werten initialisieren,
-      werden die Zahlen von links mit Nullen aufgefüllt.
-      Auf einem Little-Endian-Rechner bedeutet das,
-      daß sie rechts angehängt werden.
-      Nachfolgende Speicherzellen enthalten daher Nullen:
-      \begin{center}
-        \begin{picture}(13,1.5)(0,-0.5)
-          \put(0,0){\line(1,0){13}}
-          \put(0,1){\line(1,0){13}}
-          \multiput(0,0)(1,0){14}{\line(0,1){1}}
-          \put(0.35,0.38){\lstinline{'H'}}
-          \put(1.35,0.38){\lstinline{'e'}}
-          \put(2.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(3.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(4.35,0.38){\lstinline{'l'}}
-          \put(5.35,0.38){\lstinline{'l'}}
-          \put(6.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(8.35,0.38){\lstinline{'o'}}
-          \put(9.35,0.38){\lstinline{','}}
-          \put(10.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(11.5,0.5){\makebox(0,0){\lstinline{0x00}}}
-          \put(12.2,0.38){usw.}
-          \put(2.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}}
-          \put(6.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}}
-          \put(10.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}}
-        \end{picture}
-      \end{center}
-      Die Funktion \lstinline{printf()} interpretiert das Null-Zeichen
-      hinter \lstinline[style=terminal]{He} als String-Ende-Markierung
-      und hört entsprechend an dieser Stelle mit der Ausgabe auf.
-
-    \item
-      \textbf{Erklären Sie die Ausgabe des Programms
-      und die beim Compilieren auftretenden Warnungen,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint8_t} ersetzen.
-      Warum tritt die Warnung aus den vorherigen Aufgabenteilen nicht mehr auf?}
-
-      Die Ausgabe lautet: \lstinline[style=terminal]{Hlo ol!}. Sie enthält
-      nur jeden zweiten Buchstaben des Strings \lstinline{"Hello, world!"}.
-
-      Die Warnungen lauten:
-      \begin{lstlisting}[style=terminal]
-        aufgabe-2d.c:6:25: warning: unsigned conversion from 'int' to
-        'unsigned char' changes value from '25928' to '72' [-Woverflow]
-        aufgabe-2d.c:6:32: warning: unsigned conversion from 'int' to
-        'unsigned char' changes value from '27756' to '108' [-Woverflow]
-        ...
-      \end{lstlisting}
-      Die Warnungen kommen daher, daß \lstinline{uint8_t}-Variable
-      nur vorzeichenlose 8-Bit-Zahlen, also Zahlen von 0 bis 255, aufnehmen können.
-      Zusätzliche Bits werden abgeschnitten.
-
-      Im Falle der ersten Zahl \lstinline{25928}, die ja die Buchstaben
-      \lstinline{'H'} und \lstinline{'e'} enthält,
-      sind die unteren 8 Bit allein das \lstinline{'H'} (ASCII-Wert: 72).
-      Daher landet auch nur das \lstinline{'H'} im Array.
-
-      Die zweite Zahl \lstinline{27756}, die die nächsten beiden Buchstaben
-      (beide \lstinline{'l'}) enthält, wird als \lstinline{108} gespeichert,
-      also nur als ein einzelnes \lstinline{'l'}.
-
-      Dies setzt sich über alle 16-Bit-Zahlen fort und erklärt,
-      wieso nur jeder zweite Buchstabe in der Ausgabe erscheint.
-
-      Die Warnung aus den vorherigen Aufgabenteilen tritt hier nicht mehr auf.
-      Dies liegt daran, daß \lstinline{printf()} ein Array
-      von \lstinline{char}-Variablen erwartet
-      und ein Array von \lstinline{uint8_t}-Variablen bekommt.
-      \lstinline{char}-Variable haben typischerweise 8 Bit und sind daher kompatibel
-      mit \lstinline{uint8_t}-Variablen.
-
-  \end{enumerate}
-
-\iffalse
-
-  \exercise{Allgemeine Sortierfunktion}
-
-  Ein Zeiger auf \lstinline{void} ist ein \emph{generischer Zeiger},
-  der auch ohne explizite Typumwandlung zu allen anderen Zeigertypen
-  zuweisungskompatibel ist.
-
-  Wir betrachten das folgende Fragment (\file{aufgabe-3.c})
-  eines Sortier-Programms:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void sort (void **data, int (*compare) (void *x1, void *x2))
-    {
-      for (int i = 0; data[i]; i++)
-        for (int j = i + 1; data[j]; j++)
-          if (compare (data[i], data[j]) > 0)
-            {
-              void *tmp = data[i];
-              data[i] = data[j];
-              data[j] = tmp;
-            }
-    }
-
-    [...]
-
-    int main (void)
-    {
-      char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
-      sort (strings, compare_strings);
-      for (int i = 0; strings[i]; i++)
-        printf ("%s\n", strings[i]);
-
-      printf ("\n");
-
-      int two = 2, ten = 10, zero = 0, three = 3, one = 1;
-      int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
-      sort (numbers, compare_numbers);
-      for (int i = 0; numbers[i]; i++)
-        printf ("%d\n", *numbers[i]);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-  Dieses Programm stellt eine allgemeine Sortier-Funktion \lstinline{sort} zur Verfügung,
-  die prinzipiell beliebige Arrays sortieren kann
-  -- also z.\,B.\ sowohl Strings als auch Zahlen.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Struktur des Arrays \lstinline{numbers}.
-      Was ist in dem Array gespeichert, und wo befinden sich die Zahlen?
-      Was ist der Unterschied zwischen \lstinline{&zero} und dem Wert \lstinline{NULL}?
-      \points{3}
-%      \workspace{15}
-    \item
-      Was bedeutet \lstinline{int (*compare) (void *x1, void *x2)},
-      und für welchen Zweck wird es verwendet?\\
-      Stellen Sie einen Bezug zur objektorientierten Programmierung her.
-      \points{3}
-%      \workspace{12}
-    \item
-      Was kann passieren, wenn man in den Arrays auf das letzte Element \lstinline{NULL} verzichtet
-      und warum?\\
-      \points{1}
-%      \workspace{8}
-    \item
-      Ergänzen Sie das Fragment zu einem funktionsfähigen Programm,
-      das beide Arrays \lstinline{strings} und \lstinline{numbers}
-      sortiert ausgibt.
-      \points{5}
-
-      Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
-      aber nicht zwingend.
-      Für Notizen verwenden Sie nötigenfalls
-      die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
-  \end{enumerate}
-
-  \exercise{PBM-Grafik}
-
-  Bei einer PBM-Grafikdatei handelt es sich
-  um ein abgespeichertes C-Array von Bytes (\lstinline{uint8_t}),
-  das die Bildinformationen enthält:
-  \begin{itemize}\itemsep0pt
-    \item Die Datei beginnt mit der Kennung \lstinline{P4},
-          danach folgen Breite und Höhe in Pixel als ASCII-Zahlen,
-          danach ein Trennzeichen und die eigentlichen Bilddaten.
-    \item Jedes Bit entspricht einem Pixel.
-    \item Nullen stehen für Weiß, Einsen für Schwarz.
-    \item MSB first.
-    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
-  \end{itemize}
-  Viele Grafikprogramme können PBM-Dateien öffnen und bearbeiten.
-  Der Anfang der Datei (Kennung, Breite und Höhe)
-  ist auch in einem Texteditor lesbar.
-
-  Beispiel (\file{aufgabe-4.pbm}):\hfill
-  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
-  \begin{lstlisting}
-    P4
-    14 14
-    <Bilddaten>
-  \end{lstlisting}
-
-  In dem untenstehenden Programmfragment (\file{aufgabe-4.c})
-  wird eine Grafik aus Textzeilen zusammengesetzt,
-  so daß man mit einem Texteditor "`malen"' kann:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    [...]
-
-    int main (void)
-    {
-      pbm_open (14, 14, "test.pbm");
-      pbm_line ("              ");
-      pbm_line ("    XXXXXX    ");
-      pbm_line ("   X      X   ");
-      pbm_line ("  X        X  ");
-      pbm_line (" X          X ");
-      pbm_line (" X  XX  XX  X ");
-      pbm_line (" X   X   X  X ");
-      pbm_line (" X          X ");
-      pbm_line (" X X      X X ");
-      pbm_line (" X  X    X  X ");
-      pbm_line ("  X  XXXX  X  ");
-      pbm_line ("   X      X   ");
-      pbm_line ("    XXXXXX    ");
-      pbm_line ("              ");
-      pbm_close ();
-      return 0;
-    }
-  \end{lstlisting}
-  Ergänzen Sie das Programmfragment so,
-  daß es eine Datei \file{test.pbm} erzeugt,
-  die die Grafik enthält.
-
-  Das Programm soll typische Benutzerfehler abfangen
-  (z.\,B.\ weniger Zeilen als in \lstinline{pbm_open} angegeben),
-  keine fehlerhaften Ausgaben produzieren oder abstürzen,
-  sondern stattdessen sinnvolle Fehlermeldungen ausgeben.
-
-  Zum Vergleich liegt eine Datei \file{aufgabe-4.pbm}
-  mit dem gewünschten Ergebnis bei,\\
-  und die Datei \file{aufgabe-4.png} enthält dasselbe Bild.
-
-  \points{10}
-
-  Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
-  aber nicht zwingend.
-  Für Notizen verwenden Sie nötigenfalls
-  die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
-
-\fi
-
-\end{document}
diff --git a/exams/20170206/klausur.tex b/exams/20170206/klausur.tex
deleted file mode 100644
index a031e1aaa047639fa30657d6f15ec7c294e66a31..0000000000000000000000000000000000000000
--- a/exams/20170206/klausur.tex
+++ /dev/null
@@ -1,355 +0,0 @@
-  \thispagestyle{empty}
-  \strut\hfill
-  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
-  \section*{Hardwarenahe Programmierung / Angewandte Informatik\\
-            Klausur -- 6.\ Februar 2017}
-  Prof.~Dr.~Peter Gerwinski, Wintersemester 2016/17
-
-  \bigskip
-  \bigskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{2.0}
-    \begin{tabular}{|l|p{10cm}|} \hline
-      Name: & \\\hline
-      Matrikel-Nr.: & \\\hline
-      Benutzername: & \username \\\hline
-      Passwort: & \password \\\hline
-      \rule{0pt}{0.8cm}\raisebox{-1pt}{\shortstack[l]{Prüfsumme der hoch-\\[1pt]geladenen Datei:}} & \\\hline
-    \end{tabular}
-  \end{center}
-
-  \bigskip
-
-  Zeit: 150 Minuten
-
-  Zulässige Hilfsmittel: 
-  \begin{itemize}
-    \item Schreibgerät
-    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
-    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)
-    \item Zugang zum Klausur-WLAN
-  \end{itemize}
-
-  Nur die o.\,a.\ zulässigen Hilfsmittel
-  dürfen sich während der Klausur im Arbeitsbereich befinden.
-
-  Der einzige zulässige Zugang zu Datennetzen jeglicher Art
-  (LAN, WLAN, Bluetooth, \dots) ist der Zugang zum Klausur-WLAN,
-  das während der Klausur unter der ESSID \lstinline{klausur}
-  mit Passwort \lstinline{klausurklausur} zugänglich ist.
-  Sonstige Funkeinheiten (z.\,B.\ Bluetooth) von Notebooks o.\,ä.\
-  sind auszuschalten; ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
-  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
-  sind auszuschalten und in der Tasche zu verstauen.
-
-  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
-  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
-  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
-
-  Die Beispielprogramme werden Ihnen über das \textbf{Klausur-WLAN}
-  unter der URL \url{http://klausur} zum Herunterladen angeboten.
-  Unter derselben URL finden Sie auch ein Web-Interface
-  zum Hochladen \emph{einer einzigen Datei\/}
-  (normalerweise eine Archiv-Datei) mit Ihren Klausurergebnissen.
-  Bei mehrfachem Hochladen wird die vorherige Version überschrieben.
-  Zulässige Archiv-Dateiformate sind \file{tar.gz}, \file{tar.bz2},
-  \file{tar.xz}, \file{zip} und \file{7z}.
-  \textbf{Wichtig: Bitte tragen Sie nach dem Hochladen die Prüfsumme
-  oben auf diesem Blatt in das dafür vorgesehene Feld ein},
-  damit wir die Datei eindeutig Ihnen zuordnen können.
-  
-  Wenn Sie nicht über einen Zugang zum Klausur-WLAN verfügen,
-  stellen wir Ihnen alternativ die Beispiel-Programme auf Datenträger (USB-Stick)
-  zur Verfügung. Die Abgabe von digital gelösten Aufgaben
-  hat dann auf demselben Datenträger zu erfolgen.
-
-  \clearpage
-
-  \exercise{Strings umsortieren}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void fun (char *s)
-    {
-      int len = strlen (s);
-      for (int i = 0; i < len; i++)
-        {
-          for (int j = i - 1; j >= 0; j--)
-            {
-              if (s[i] < s[j])
-                {
-                  char sx = s[i];
-                  s[i] = s[j];
-                  s[j] = sx;
-                }
-            }
-        }
-    }
-
-    int main (void)
-    {
-      char s[] = "BAECD";
-      fun (s);
-      printf ("%s\n", s);
-      return 0;
-    }
-  \end{lstlisting}
-  Auf einem Rechner, der den ASCII-Zeichensatz verwendet, lautet die Ausgabe:
-  \lstinline[style=terminal]{ABCDE}
-
-  \begin{enumerate}[\quad(a)]
-%    \item
-%      Was bewirkt die Funktion \lstinline{fun}?
-%      \points{4}
-%      \workspace{12}
-    \item
-      Beweisen Sie (z.\,B.\ anhand eines Gegenbeispiels),
-      daß die Funktion allgemein \lstinline{fun} \emph{nicht\/} dazu geeignet ist,
-      die Buchstaben eines Strings gemäß ihrer ASCII-Reihenfolge zu sortieren.
-      \points{2}
-      \workspace{9}
-    \item
-      Was kann passieren, wenn die Zeile \lstinline{char s[] = "BAECD";}
-      durch \lstinline|char s[] = { 'B', 'A', 'E', 'C', 'D'|~\lstinline|};| ersetzt wird, und warum?
-      \points{2}
-      \workspace{10}
-    \item
-      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun} und warum?
-
-      Wir beziehen uns hierbei auf die Anzahl der Vergleiche \lstinline{s[i] < s[j]}
-      in Abhängigkeit von der Länge des Eingabe-Strings \lstinline{"BAECD"}.
-      \points{1}
-      \workspace{10}
-    \item
-      Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
-      sich die Funktion \lstinline{fun} so abwandeln läßt,
-      daß sie die Buchstaben des Strings \lstinline{s} gemäß ihrer ASCII-Reihenfolge sortiert.
-      Von welcher Ordnung (Landau-Symbol) ist Ihre Version der Funktion und warum?
-      \points{3}
-      \workspace{22}
-  \end{enumerate}
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <stdint.h>
-
-    int main (void)
-    {
-      uint16_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
-      printf ("%s", numbers);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird compiliert und ausgeführt:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function ‘main’:
-    aufgabe-2.c:7:3: warning: format ‘%s’ expects argument of type ‘char *’,
-                     but argument 2 has type ‘uint16_t *’ [-Wformat]
-    $ ¡./aufgabe-2¿
-    Hello, world!
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die beim Compilieren auftretende Warnung.
-      \points{2}
-      \workspace{8}
-    \item
-      Erklären Sie die Ausgabe des Programms.\\
-      Welche Endianness hat der verwendete Rechner?
-      \points{4}
-      \workspace{16}
-%    \item
-%      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-%      \points{2}
-%      \workspace{11}
-    \item
-      Erklären Sie die Ausgabe des Programms,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint32_t} ersetzen.
-      \points{3}
-      \workspace{12}
-    \item
-      Erklären Sie die Ausgabe des Programms
-      und die beim Compilieren auftretenden Warnungen,
-      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint8_t} ersetzen.
-      Warum tritt die Warnung aus den vorherigen Aufgabenteilen nicht mehr auf?
-      \points{3}
-      \workspace{14}
-  \end{enumerate}
-
-  \exercise{Allgemeine Sortierfunktion}
-
-  Ein Zeiger auf \lstinline{void} ist ein \emph{generischer Zeiger},
-  der auch ohne explizite Typumwandlung zu allen anderen Zeigertypen
-  zuweisungskompatibel ist.
-
-  Wir betrachten das folgende Fragment (\file{aufgabe-3.c})
-  eines Sortier-Programms:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void sort (void **data, int (*compare) (void *x1, void *x2))
-    {
-      for (int i = 0; data[i]; i++)
-        for (int j = i + 1; data[j]; j++)
-          if (compare (data[i], data[j]) > 0)
-            {
-              void *tmp = data[i];
-              data[i] = data[j];
-              data[j] = tmp;
-            }
-    }
-
-    [...]
-
-    int main (void)
-    {
-      char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
-      sort (strings, compare_strings);
-      for (int i = 0; strings[i]; i++)
-        printf ("%s\n", strings[i]);
-
-      printf ("\n");
-
-      int two = 2, ten = 10, zero = 0, three = 3, one = 1;
-      int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
-      sort (numbers, compare_numbers);
-      for (int i = 0; numbers[i]; i++)
-        printf ("%d\n", *numbers[i]);
-
-      return 0;
-    }
-  \end{lstlisting}
-
-  Dieses Programm stellt eine allgemeine Sortier-Funktion \lstinline{sort} zur Verfügung,
-  die prinzipiell beliebige Arrays sortieren kann
-  -- also z.\,B.\ sowohl Strings als auch Zahlen.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Struktur des Arrays \lstinline{numbers}.
-      Was ist in dem Array gespeichert, und wo befinden sich die Zahlen?
-      Was ist der Unterschied zwischen \lstinline{&zero} und dem Wert \lstinline{NULL}?
-      \points{3}
-      \workspace{15}
-    \item
-      Was bedeutet \lstinline{int (*compare) (void *x1, void *x2)},
-      und für welchen Zweck wird es verwendet?\\
-      Stellen Sie einen Bezug zur objektorientierten Programmierung her.
-      \points{3}
-      \workspace{12}
-    \item
-      Was kann passieren, wenn man in den Arrays auf das letzte Element \lstinline{NULL} verzichtet
-      und warum?\\
-      \points{1}
-      \workspace{8}
-    \item
-      Ergänzen Sie das Fragment zu einem funktionsfähigen Programm,
-      das beide Arrays \lstinline{strings} und \lstinline{numbers}
-      sortiert ausgibt.
-      \points{5}
-
-      Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
-      aber nicht zwingend.
-      Für Notizen verwenden Sie nötigenfalls
-      die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
-  \end{enumerate}
-
-  \exercise{PBM-Grafik}
-
-  Bei einer PBM-Grafikdatei handelt es sich
-  um ein abgespeichertes C-Array von Bytes (\lstinline{uint8_t}),
-  das die Bildinformationen enthält:
-  \begin{itemize}\itemsep0pt
-    \item Die Datei beginnt mit der Kennung \lstinline{P4},
-          danach folgen Breite und Höhe in Pixel als ASCII-Zahlen,
-          danach ein Trennzeichen und die eigentlichen Bilddaten.
-    \item Jedes Bit entspricht einem Pixel.
-    \item Nullen stehen für Weiß, Einsen für Schwarz.
-    \item MSB first.
-    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
-  \end{itemize}
-  Viele Grafikprogramme können PBM-Dateien öffnen und bearbeiten.
-  Der Anfang der Datei (Kennung, Breite und Höhe)
-  ist auch in einem Texteditor lesbar.
-
-  Beispiel (\file{aufgabe-4.pbm}):\hfill
-  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
-  \begin{lstlisting}
-    P4
-    14 14
-    <Bilddaten>
-  \end{lstlisting}
-
-  In dem untenstehenden Programmfragment (\file{aufgabe-4.c})
-  wird eine Grafik aus Textzeilen zusammengesetzt,
-  so daß man mit einem Texteditor "`malen"' kann:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    [...]
-
-    int main (void)
-    {
-      pbm_open (14, 14, "test.pbm");
-      pbm_line ("              ");
-      pbm_line ("    XXXXXX    ");
-      pbm_line ("   X      X   ");
-      pbm_line ("  X        X  ");
-      pbm_line (" X          X ");
-      pbm_line (" X  XX  XX  X ");
-      pbm_line (" X   X   X  X ");
-      pbm_line (" X          X ");
-      pbm_line (" X X      X X ");
-      pbm_line (" X  X    X  X ");
-      pbm_line ("  X  XXXX  X  ");
-      pbm_line ("   X      X   ");
-      pbm_line ("    XXXXXX    ");
-      pbm_line ("              ");
-      pbm_close ();
-      return 0;
-    }
-  \end{lstlisting}
-  Ergänzen Sie das Programmfragment so,
-  daß es eine Datei \file{test.pbm} erzeugt,
-  die die Grafik enthält.
-
-  Das Programm soll typische Benutzerfehler abfangen
-  (z.\,B.\ weniger Zeilen als in \lstinline{pbm_open} angegeben),
-  keine fehlerhaften Ausgaben produzieren oder abstürzen,
-  sondern stattdessen sinnvolle Fehlermeldungen ausgeben.
-
-  Zum Vergleich liegt eine Datei \file{aufgabe-4.pbm}
-  mit dem gewünschten Ergebnis bei,\\
-  und die Datei \file{aufgabe-4.png} enthält dasselbe Bild.
-
-  \points{10}
-
-  Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
-  aber nicht zwingend.
-  Für Notizen verwenden Sie nötigenfalls
-  die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \clearpage
-  \thispagestyle{empty}
-  Raum für Notizen
diff --git a/exams/20170206/loesung-4.c b/exams/20170206/loesung-4.c
deleted file mode 100644
index 8d41f9154e197d711212efbb20d49603ac7ba7e3..0000000000000000000000000000000000000000
--- a/exams/20170206/loesung-4.c
+++ /dev/null
@@ -1,65 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <errno.h>
-#include <error.h>
-
-/* Die Aufgabe besteht darin, die Funktionen pbm_open(),
- * pbm_line() und pbm_close() zu schreiben.
- */
-
-int pbm_width = 0;
-int pbm_height = 0;
-FILE *pbm_file;  /* globale Variable für die PBM-Datei */
-
-void pbm_open (int width, int height, char *filename)
-{
-  pbm_file = fopen (filename, "w");
-  if (!pbm_file)
-    error (errno, errno, "cannot open file %s for writing", filename);
-  pbm_width = width;
-  pbm_height = height;
-  fprintf (pbm_file, "P4\n%d %d\n", pbm_width, pbm_height);
-}
-
-void pbm_line (char *line)
-{
-  int pbm_bytes = (pbm_width + 7) / 8;   /* benötigte Bytes pro Zeile (immer aufrunden) */
-  uint8_t buffer[pbm_bytes];
-  for (int i = 0; i < pbm_bytes; i++)   /* Puffer auf 0 initialisieren */
-    buffer[i] = 0;
-  for (int x = 0; line[x]; x++)
-    {
-      int i = x / 8;  /* In welches Byte des Puffers gehört dieses Pixel? */
-      int b = x % 8;  /* Welches Bit innerhalb des Bytes ist dieses Pixel? */
-      if (line[x] != ' ')   /* Kein Leerzeichen --> Bit auf 1 setzen */
-        buffer[i] |= 0x80 >> b;  /* MSB first. LSB first wäre 1 << b. */
-    }
-  for (int i = 0; i < pbm_bytes; i++)   /* Puffer in Datei ausgeben */
-    fprintf (pbm_file, "%c", buffer[i]);
-}
-
-void pbm_close (void)
-{
-  fclose (pbm_file);
-}
-
-int main (void)
-{
-  pbm_open (14, 14, "test.pbm");
-  pbm_line ("              ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("   X      X   ");
-  pbm_line ("  X        X  ");
-  pbm_line (" X          X ");
-  pbm_line (" X  XX  XX  X ");
-  pbm_line (" X   X   X  X ");
-  pbm_line (" X          X ");
-  pbm_line (" X X      X X ");
-  pbm_line (" X  X    X  X ");
-  pbm_line ("  X  XXXX  X  ");
-  pbm_line ("   X      X   ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("              ");
-  pbm_close ();
-  return 0;
-}
diff --git a/exams/20170206/loesung-4f.c b/exams/20170206/loesung-4f.c
deleted file mode 100644
index 652a63189bacbb48e851c3f991a4c2f86dff60d8..0000000000000000000000000000000000000000
--- a/exams/20170206/loesung-4f.c
+++ /dev/null
@@ -1,65 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <errno.h>
-#include <error.h>
-
-/* Die Aufgabe besteht darin, die Funktionen pbm_open(),
- * pbm_line() und pbm_close() zu schreiben.
- */
-
-int pbm_width = 0;
-int pbm_height = 0;
-FILE *pbm_file;  /* globale Variable für die PBM-Datei */
-
-void pbm_open (int width, int height, char *filename)
-{
-  pbm_file = fopen (filename, "w");
-  if (!pbm_file)
-    error (errno, errno, "cannot open file %s for writing", filename);
-  pbm_width = width;
-  pbm_height = height;
-  fprintf (pbm_file, "P4\n%d %d\n", pbm_width, pbm_height);
-}
-
-void pbm_line (char *line)
-{
-  int pbm_bytes = (pbm_width + 7) / 8;   /* benötigte Bytes pro Zeile (immer aufrunden) */
-  uint8_t buffer[pbm_bytes];
-  for (int i = 0; i < pbm_bytes; i++)   /* Puffer auf 0 initialisieren */
-    buffer[i] = 0;
-  for (int x = 0; line[x]; x++)
-    {
-      int i = x / 8;  /* In welches Byte des Puffers gehört dieses Pixel? */
-      int b = x % 8;  /* Welches Bit innerhalb des Bytes ist dieses Pixel? */
-      if (line[x] != ' ')   /* Kein Leerzeichen --> Bit auf 1 setzen */
-        buffer[i] |= 1 << b;
-    }
-  for (int i = 0; i < pbm_bytes; i++)   /* Puffer in Datei ausgeben */
-    fprintf (pbm_file, "%c", buffer[i]);
-}
-
-void pbm_close (void)
-{
-  fclose (pbm_file);
-}
-
-int main (void)
-{
-  pbm_open (14, 14, "test.pbm");
-  pbm_line ("              ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("   X      X   ");
-  pbm_line ("  X        X  ");
-  pbm_line (" X          X ");
-  pbm_line (" X  XX  XX  X ");
-  pbm_line (" X   X   X  X ");
-  pbm_line (" X          X ");
-  pbm_line (" X X      X X ");
-  pbm_line (" X  X    X  X ");
-  pbm_line ("  X  XXXX  X  ");
-  pbm_line ("   X      X   ");
-  pbm_line ("    XXXXXX    ");
-  pbm_line ("              ");
-  pbm_close ();
-  return 0;
-}
diff --git a/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000
--- a/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20170206/logo-hochschule-bochum.pdf b/exams/20170206/logo-hochschule-bochum.pdf
deleted file mode 120000
index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000
--- a/exams/20170206/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20170206/pgscript.sty b/exams/20170206/pgscript.sty
deleted file mode 120000
index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000
--- a/exams/20170206/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../../common/pgscript.sty
\ No newline at end of file
diff --git a/exams/20180213/aufgabe-1.c b/exams/20180213/aufgabe-1.c
deleted file mode 100644
index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = pos; i < len; i++)
-    target[i+1] = target[i];
-  target[pos] = src;
-}
-
-int main (void)
-{
-  char test[100] = "Hochshule Bochum";
-  insert_into_string ('c', test, 5);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/exams/20180213/aufgabe-1b.c b/exams/20180213/aufgabe-1b.c
deleted file mode 100644
index db8744a1ff1c291a6c0c7202ba2dfa077ae856eb..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-1b.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = pos; i < len; i++)
-    target[i+1] = target[i];
-  target[pos] = src;
-}
-
-int main (void)
-{
-  char test[] = "Hochshule Bochum";
-  insert_into_string ('c', test, 5);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/exams/20180213/aufgabe-1c.c b/exams/20180213/aufgabe-1c.c
deleted file mode 100644
index ffe65caed9ed925e4ce9d59e94b906bc295de803..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-1c.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-void insert_into_string (char src, char *target, int pos)
-{
-  int len = strlen (target);
-  for (int i = pos; i < len; i++)
-    target[i+1] = target[i];
-  target[pos] = src;
-}
-
-int main (void)
-{
-  char *test = "Hochshule Bochum";
-  insert_into_string ('c', test, 5);
-  printf ("%s\n", test);
-  return 0;
-}
diff --git a/exams/20180213/aufgabe-2.c b/exams/20180213/aufgabe-2.c
deleted file mode 100644
index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-typedef struct
-{
-  uint32_t a;
-  uint64_t b;
-  uint8_t c;
-} three_numbers;
-
-int main (void)
-{
-  three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-  printf ("%s\n", &xyz);
-  return 0;
-}
diff --git a/exams/20180213/aufgabe-3.c b/exams/20180213/aufgabe-3.c
deleted file mode 100644
index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-3.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-void foreach (int *a, void (*fun) (int x))
-{
-  for (int *p = a; *p >= 0; p++)
-    fun (*p);
-}
-
-void even_or_odd (int x)
-{
-  if (x % 2)
-    printf ("%d ist ungerade.\n", x);
-  else
-    printf ("%d ist gerade.\n", x);
-}
-
-int main (void)
-{
-  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-  foreach (numbers, even_or_odd);
-  return 0;
-}
diff --git a/exams/20180213/aufgabe-4.pbm b/exams/20180213/aufgabe-4.pbm
deleted file mode 100644
index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000
Binary files a/exams/20180213/aufgabe-4.pbm and /dev/null differ
diff --git a/exams/20180213/aufgabe-4.png b/exams/20180213/aufgabe-4.png
deleted file mode 100644
index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000
Binary files a/exams/20180213/aufgabe-4.png and /dev/null differ
diff --git a/exams/20180213/aufgabe-4.xbm b/exams/20180213/aufgabe-4.xbm
deleted file mode 100644
index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000
--- a/exams/20180213/aufgabe-4.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define aufgabe_4_width 14
-#define aufgabe_4_height 14
-static unsigned char aufgabe_4_bits[] = {
-   0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
-   0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
-   0xf0, 0x03, 0x00, 0x00 };
diff --git a/exams/20180213/hp-klausur-20180213.pdf b/exams/20180213/hp-klausur-20180213.pdf
deleted file mode 100644
index 0c6c736769933848459a752fe4cce08740ed6d71..0000000000000000000000000000000000000000
Binary files a/exams/20180213/hp-klausur-20180213.pdf and /dev/null differ
diff --git a/exams/20180213/hp-klausur-20180213.tex b/exams/20180213/hp-klausur-20180213.tex
deleted file mode 100644
index 706b473d7bb8e37f74f2e0e50e08dc3f756bd912..0000000000000000000000000000000000000000
--- a/exams/20180213/hp-klausur-20180213.tex
+++ /dev/null
@@ -1,57 +0,0 @@
-% hp-klausur-20180213.pdf - Examination on Applied Computer Sciences
-% Copyright (C) 2015, 2016, 2017, 2018  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Wintersemester 2017/18
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{ifthen}
-
-\newcommand{\workspacexyt}[3]{%
-  \begin{center}
-    \setlength{\unitlength}{0.5cm}
-    \begin{picture}(#1,#2)
-      \color[rgb]{0.7,0.7,0.7}
-      \put(0,0){\line(1,0){#1}}
-      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
-      \put(0,0){\line(0,1){#2}}
-      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
-      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
-    \end{picture}
-  \end{center}}
-
-\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
-
-\newcommand{\klausur}[2]{%
-  \clearpage
-  \setcounter{page}{1}
-  \setcounter{points}{0}
-  \setcounter{exercise}{0}
-  \gdef\username{#1}
-  \gdef\password{#2}
-  \input{klausur}
-}
-
-\begin{document}
-  \klausur{12}{8Hdy2fG2Zvlk}
-\end{document}
diff --git a/exams/20180213/klausur.tex b/exams/20180213/klausur.tex
deleted file mode 100644
index 2f0b522e5fb2daf2862a4072f508ef98bd94d7dd..0000000000000000000000000000000000000000
--- a/exams/20180213/klausur.tex
+++ /dev/null
@@ -1,352 +0,0 @@
-  \thispagestyle{empty}
-  \strut\hfill
-  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
-  \section*{Hardwarenahe Programmierung / Angewandte Informatik\\
-            Klausur -- 13.\ Februar 2018}
-  Prof.~Dr.~Peter Gerwinski, Wintersemester 2017/18
-
-  \bigskip
-  \bigskip
-
-  \begin{center}
-    \renewcommand{\arraystretch}{2.0}
-    \begin{tabular}{|l|p{10cm}|} \hline
-      Name: & \\\hline
-      Matrikel-Nr.: & \\\hline
-      Benutzername: & \username \\\hline
-      Passwort: & \password \\\hline
-      \rule{0pt}{0.8cm}\raisebox{-1pt}{\shortstack[l]{Prüfsumme der hoch-\\[1pt]geladenen Datei:}} & \\\hline
-    \end{tabular}
-  \end{center}
-
-  \bigskip
-
-  Zeit: 150 Minuten
-
-  Zulässige Hilfsmittel: 
-  \begin{itemize}
-    \item Schreibgerät
-    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
-    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)
-    \item Zugang zum Klausur-WLAN
-  \end{itemize}
-
-  Nur die o.\,a.\ zulässigen Hilfsmittel
-  dürfen sich während der Klausur im Arbeitsbereich befinden.
-
-  Der einzige zulässige Zugang zu Datennetzen jeglicher Art
-  (LAN, WLAN, Bluetooth, \dots) ist der Zugang zum Klausur-WLAN,
-  das während der Klausur unter der ESSID \lstinline{klausur}
-  mit Passwort \lstinline{klausurklausur} zugänglich ist.
-  Sonstige Funkeinheiten (z.\,B.\ Bluetooth) von Notebooks o.\,ä.\
-  sind auszuschalten; ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
-  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
-  sind auszuschalten und in der Tasche zu verstauen.
-
-  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
-  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
-  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
-
-  Die Beispielprogramme werden Ihnen über das \textbf{Klausur-WLAN}
-  unter der URL \url{http://klausur} zum Herunterladen angeboten.
-  Unter derselben URL finden Sie auch ein Web-Interface
-  zum Hochladen \emph{einer einzigen Datei\/}
-  (normalerweise eine Archiv-Datei) mit Ihren Klausurergebnissen.
-  Bei mehrfachem Hochladen wird die vorherige Version überschrieben.
-  Zulässige Archiv-Dateiformate sind \file{tar.gz}, \file{tar.bz2},
-  \file{tar.xz}, \file{zip} und \file{7z}.
-  \textbf{Wichtig: Bitte tragen Sie nach dem Hochladen die Prüfsumme
-  oben auf diesem Blatt in das dafür vorgesehene Feld ein},
-  damit wir die Datei eindeutig Ihnen zuordnen können.
-  
-  Wenn Sie nicht über einen Zugang zum Klausur-WLAN verfügen,
-  stellen wir Ihnen alternativ die Beispiel-Programme auf Datenträger (USB-Stick)
-  zur Verfügung. Die Abgabe von digital gelösten Aufgaben
-  hat dann auf demselben Datenträger zu erfolgen.
-
-  \clearpage
-
-  \exercise{Einfügen in Strings}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <string.h>
-
-    void insert_into_string (char src, char *target, int pos)
-    {
-      int len = strlen (target);
-      for (int i = pos; i < len; i++)
-        target[i+1] = target[i];
-      target[pos] = src;
-    }
-
-    int main (void)
-    {
-      char test[100] = "Hochshule Bochum";
-      insert_into_string ('c', test, 5);
-      printf ("%s\n", test);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe des Programms lautet:
-  \lstinline[style=terminal]{Hochschhhhhhhhhhh}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die Ausgabe.
-      \points{3}
-      \workspace{12}
-    \item
-      Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
-      daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos}
-      in den String \lstinline{target} einfügt.\par
-      Die Ausgabe des Programms müßte dann
-      \lstinline[style=terminal]{Hochschule Bochum} lauten.
-      \points{2}
-      \workspace{13}
-    \item
-      Was kann passieren, wenn Sie die Zeile
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char test[] = "Hochshule Bochum";}
-      ersetzen und warum?
-      \points{2}
-      \workspace{10}
-    \item
-      Was passiert, wenn Sie 
-      \lstinline{char test[100] = "Hochshule Bochum";}\\
-      durch
-      \lstinline{char *test = "Hochshule Bochum";}
-      ersetzen und warum?
-      \points{2}
-      \workspace{10}
-    \item
-      Schreiben Sie eine Funktion
-      \lstinline{void insert_into_string_sorted (char src, char *target)},
-      die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist
-      und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle
-      einfügt. Diese Funktion darf die bereits vorhandene Funktion
-      \lstinline|insert_into_string()| aufrufen.\\
-      \points{4}\par
-      Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm:
-      \begin{lstlisting}[gobble=8]
-        char test[100] = "";
-        insert_into_string_sorted ('c', test);
-        insert_into_string_sorted ('a', test);
-        insert_into_string_sorted ('d', test);
-        insert_into_string_sorted ('b', test);
-      \end{lstlisting}
-      Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten.
-      \workspace{14}
-    \item
-      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
-      arbeitet Ihre Funktion
-      \lstinline{void insert_into_string_sorted (char src, char *target)}
-      und warum?
-      \points{1}
-      \workspace{10}
-    \item
-      Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\
-      \lstinline{void insert_into_string_sorted (char src, char *target)}
-      so gestalten kann,\\
-      daß sie in $\mathcal{O}(\log n)$ arbeitet.
-      \points{3}
-      \workspace{35}
-  \end{enumerate}
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-    #include <stdint.h>
-
-    typedef struct
-    {
-      uint32_t a;
-      uint64_t b;
-      uint8_t c;
-    } three_numbers;
-
-    int main (void)
-    {
-      three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
-      printf ("%s\n", &xyz);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
-  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
-  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
-    aufgabe-2.c: In function "main":
-    aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
-    argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
-       printf ("%s\n", &xyz);
-                 ^
-    $ ¡./aufgabe-2¿
-    Hallo, Welt!
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Erklären Sie die beim Compilieren auftretende Warnung.
-      \points{2}
-      \workspace{10}
-    \item
-      Erklären Sie die Ausgabe des Programms.
-      \points{4}
-      \workspace{11}
-      \workspace{7}
-    \item
-      Welche Endianness hat der verwendete Rechner?
-      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
-      \points{2}
-      \workspace{12}
-    \item
-      Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
-      (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
-      daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
-        aufgabe-2.c: In function "main":
-        aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
-        but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
-        [-Wformat=]
-           printf ("%s\n", &xyz);
-                     ^
-        $ ¡./aufgabe-2¿
-        Hall5V
-      \end{lstlisting}
-      (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
-      Erklären Sie die geänderte Ausgabe des Programms.
-      \points{3}
-      \workspace{16}
-  \end{enumerate}
-
-  \exercise{Iterationsfunktionen}
-
-  Wir betrachten das folgende Programm (\file{aufgabe-3.c}):
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-
-    void foreach (int *a, void (*fun) (int x))
-    {
-      for (int *p = a; *p >= 0; p++)
-        fun (*p);
-    }
-
-    void even_or_odd (int x)
-    {
-      if (x % 2)
-        printf ("%d ist ungerade.\n", x);
-      else
-        printf ("%d ist gerade.\n", x);
-    }
-
-    int main (void)
-    {
-      int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
-      foreach (numbers, even_or_odd);
-      return 0;
-    }
-  \end{lstlisting}
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Was bedeutet \lstinline{void (*fun) (int x)},
-      und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?
-      \points{2}
-      \workspace{8}
-    \item
-      Schreiben Sie das Hauptprogramm \lstinline{main()} so um,
-      daß es unter Verwendung der Funktion \lstinline{foreach()}
-      die Summe aller positiven Zahlen in dem Array berechnet.
-      Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.
-      \points{4}
-      \workspace{14}
-  \end{enumerate}
-
-  \exercise{XBM- und PBM-Grafik}
-
-  Bei einer XBM-Grafikdatei handelt es sich
-  um ein als C-Quelltext abgespeichertes Array,
-  das die Bildinformationen enthält:
-  \begin{itemize}\itemsep0pt
-    \item Jedes Bit entspricht einem Pixel.
-    \item Nullen stehen für Weiß, Einsen für Schwarz.
-    \item LSB first.
-    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
-    \item Breite und Höhe des Bildes sind als Konstantendefinitionen
-          (\lstinline{#define}) in der Datei enthalten.
-  \end{itemize}
-  Sie können eine XBM-Datei sowohl mit einem Texteditor
-  als auch mit vielen Grafikprogrammen öffnen und bearbeiten.
-
-  Beispiel (\file{aufgabe-4.xbm}):\hfill
-  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
-  \begin{lstlisting}
-    #define aufgabe_4_width 14
-    #define aufgabe_4_height 14
-    static unsigned char aufgabe_4_bits[] = {
-       0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
-       0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
-       0xf0, 0x03, 0x00, 0x00 };
-  \end{lstlisting} 
-  Ein C-Programm, das eine XBM-Grafik nutzen will,
-  kann die \file{.xbm}-Datei mit \lstinline{#include "..."} direkt einbinden.
-
-  Bei einer PBM-Grafikdatei handelt es sich
-  um ein binär abgespeichertes C-Array von Bytes (\lstinline{uint8_t}),
-  das die Bildinformationen enthält:
-  \begin{itemize}\itemsep0pt
-    \item Die Datei beginnt mit der Kennung \lstinline{P4},
-          danach folgen Breite und Höhe in Pixel als ASCII-Zahlen,
-          danach genau ein Trennzeichen (z.\,B.\ \lstinline{"\n"})
-          und zuletzt die eigentlichen Bilddaten.
-    \item Jedes Bit entspricht einem Pixel.
-    \item Nullen stehen für Weiß, Einsen für Schwarz.
-    \item MSB first.
-    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
-  \end{itemize}
-  Viele Grafikprogramme können PBM-Dateien öffnen und bearbeiten.
-  Der Anfang der Datei (Kennung, Breite und Höhe)
-  ist auch in einem Texteditor lesbar.
-
-  Beispiel (\file{aufgabe-4.pbm}):\hfill
-  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
-  \begin{lstlisting}
-    P4
-    14 14
-    <Bilddaten>
-  \end{lstlisting}
-
-  Schreiben Sie ein Programm,
-  das die Datei \file{aufgabe-4.xbm} mittels \lstinline{#include} liest
-  und in einer PBM-Bilddatei \file{test.pbm} abspeichert.
-  Das Programm wandelt also eine XBM-Datei in eine PBM-Datei um.
-
-  Für Ihre Ergebniskontrolle liegt eine Datei \file{aufgabe-4.pbm}
-  mit dem gewünschten Ergebnis bei,\\
-  und die Datei \file{aufgabe-4.png} enthält dasselbe Bild.
-
-  Hinweis: Verwenden Sie \lstinline{"%c"} für die Ausgabe
-  der eigentlichen Bilddaten.
-
-  \points{8}
-
-  Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-  \bigskip
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
diff --git a/exams/20180213/loesung-4-1.c b/exams/20180213/loesung-4-1.c
deleted file mode 100644
index ca3af2e751ec396c8c84f8dea568f4b9331f66b0..0000000000000000000000000000000000000000
--- a/exams/20180213/loesung-4-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  return 0;
-}
diff --git a/exams/20180213/loesung-4-2.c b/exams/20180213/loesung-4-2.c
deleted file mode 100644
index 693a71549a83dd2b55538e340693e5d9de2a342b..0000000000000000000000000000000000000000
--- a/exams/20180213/loesung-4-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8;
-  for (int y = 0; y < aufgabe_4_height; y++)
-    {
-      for (int b = 0; b < aufgabe_4_bytes; b++)
-        {
-          uint8_t buffer = aufgabe_4_bits[y * aufgabe_4_bytes + b];
-          for (int i = 0; i < 8; i++)
-            if (buffer & (1 << i))
-              printf ("*");
-            else
-              printf (" ");
-        }
-      printf ("\n");
-    }
-  return 0;
-}
diff --git a/exams/20180213/loesung-4-3.c b/exams/20180213/loesung-4-3.c
deleted file mode 100644
index dc6bf84209bc6ccda03ecca413c31ec07572854a..0000000000000000000000000000000000000000
--- a/exams/20180213/loesung-4-3.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben
-  FILE *pbm_file = fopen ("test.pbm", "w");
-  // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung!
-  fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height);
-
-  int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8;
-  for (int y = 0; y < aufgabe_4_height; y++)
-    {
-      for (int b = 0; b < aufgabe_4_bytes; b++)
-        {
-          uint8_t buffer = aufgabe_4_bits[y * aufgabe_4_bytes + b];
-          fprintf (pbm_file, "%c", buffer);
-        }
-    }
-
-  fclose (pbm_file);
-  return 0;
-}
diff --git a/exams/20180213/loesung-4-4.c b/exams/20180213/loesung-4-4.c
deleted file mode 100644
index db6bd1504e37b9e7130421c591f57be73c249164..0000000000000000000000000000000000000000
--- a/exams/20180213/loesung-4-4.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben
-  FILE *pbm_file = fopen ("test.pbm", "w");
-  // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung!
-  fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height);
-
-  int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8;
-  for (int y = 0; y < aufgabe_4_height; y++)
-    {
-      for (int b = 0; b < aufgabe_4_bytes; b++)
-        {
-          uint8_t buffer_xbm = aufgabe_4_bits[y * aufgabe_4_bytes + b];
-          uint8_t buffer_pbm = 0;
-          for (int i = 0; i < 8; i++)
-            if (buffer_xbm & (1 << i))
-              buffer_pbm |= 1 >> i;
-          fprintf (pbm_file, "%c", buffer_pbm);
-        }
-    }
-
-  fclose (pbm_file);
-  return 0;
-}
diff --git a/exams/20180213/loesung-4-5.c b/exams/20180213/loesung-4-5.c
deleted file mode 100644
index 6ba4359804bce4f8ad5d7e5ba03e6cf20bf9c520..0000000000000000000000000000000000000000
--- a/exams/20180213/loesung-4-5.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-#include "aufgabe-4.xbm"
-
-int main (void)
-{
-  // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben
-  FILE *pbm_file = fopen ("test.pbm", "w");
-  // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung!
-  fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height);
-
-  int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8;
-  for (int y = 0; y < aufgabe_4_height; y++)
-    {
-      for (int b = 0; b < aufgabe_4_bytes; b++)
-        {
-          uint8_t buffer_xbm = aufgabe_4_bits[y * aufgabe_4_bytes + b];
-          uint8_t buffer_pbm = 0;
-          for (int i = 0; i < 8; i++)
-            if (buffer_xbm & (1 << i))
-              buffer_pbm |= 0x80 >> i;
-          fprintf (pbm_file, "%c", buffer_pbm);
-        }
-    }
-
-  fclose (pbm_file);
-  return 0;
-}
diff --git a/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000
--- a/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20180213/logo-hochschule-bochum.pdf b/exams/20180213/logo-hochschule-bochum.pdf
deleted file mode 120000
index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000
--- a/exams/20180213/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20180213/pgscript.sty b/exams/20180213/pgscript.sty
deleted file mode 120000
index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000
--- a/exams/20180213/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../../common/pgscript.sty
\ No newline at end of file
diff --git a/hp-slides-2019ws.pdf b/hp-slides-2019ws.pdf
deleted file mode 100644
index c595e42272702a392ba628da579edda7245a0242..0000000000000000000000000000000000000000
Binary files a/hp-slides-2019ws.pdf and /dev/null differ
diff --git a/hp-slides-2019ws.tex b/hp-slides-2019ws.tex
deleted file mode 100644
index 8d98f8761191d0652da4f3bedc1f95891c1373a3..0000000000000000000000000000000000000000
--- a/hp-slides-2019ws.tex
+++ /dev/null
@@ -1,43 +0,0 @@
-\documentclass{article}
-
-\usepackage[final]{pdfpages}
-\usepackage[paperwidth=363pt,paperheight=272pt]{geometry}
-\usepackage{hyperref}
-
-\pagestyle{empty}
-
-\begin{document}
-  \includepdf[pages=1]{script/hp-slides-title-2019ws.pdf}
-  \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis}
-  \includepdf[pages=2-]{script/hp-slides-title-2019ws.pdf}
-  \pdfbookmark[1]{10.10.2019: Einführung, Einführung in C (bis Schleifen)}{20191010}
-  \includepdf[pages=-]{20191010/hp-20191010.pdf}
-  \pdfbookmark[1]{17.10.2019: Einführung in C: Seiteneffekte, Funktionen}{20191017}
-  \includepdf[pages=-]{20191017/hp-20191017.pdf}
-  \pdfbookmark[1]{24.10.2019: Einführung in C: Zeiger, Arrays und Strings}{20191024}
-  \includepdf[pages=-]{20191024/hp-20191024.pdf}
-  \pdfbookmark[1]{31.10.2019: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung}{20191031}
-  \includepdf[pages=-]{20191031/hp-20191031.pdf}
-  \pdfbookmark[1]{07.11.2019: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports}{20191107}
-  \includepdf[pages=-]{20191107/hp-20191107.pdf}
-  \pdfbookmark[1]{14.11.2019: Bit-Operationen, I/O-Ports}{20191114}
-  \includepdf[pages=-]{20191114/hp-20191114.pdf}
-  \pdfbookmark[1]{21.11.2019: Interrupts, volatile-Variable, Bibliotheken: Einführung}{20191121}
-  \includepdf[pages=-]{20191121/hp-20191121.pdf}
-  \pdfbookmark[1]{28.11.2019: Präprozessor, Bibliotheken}{20191128}
-  \includepdf[pages=-]{20191128/hp-20191128.pdf}
-  \pdfbookmark[1]{05.12.2019: Bibliotheken, Differentialgleichungen}{20191205}
-  \includepdf[pages=-]{20191205/hp-20191205.pdf}
-  \pdfbookmark[1]{12.12.2019: make, Byte-Reihenfolge - Endianness}{20191212}
-  \includepdf[pages=-]{20191212/hp-20191212.pdf}
-  \pdfbookmark[1]{19.12.2019: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment}{20191219}
-  \includepdf[pages=-]{20191219/hp-20191219.pdf}
-  \pdfbookmark[1]{02.01.2020: Quantencomputer, Datensicherheit und Datenschutz}{20200102}
-  \includepdf[pages=-]{20200102/hp-20200102.pdf}
-  \pdfbookmark[1]{09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung}{20200109}
-  \includepdf[pages=-]{20200109/hp-20200109.pdf}
-  \pdfbookmark[1]{16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung}{20200116}
-  \includepdf[pages=-]{20200116/hp-20200116.pdf}
-  \pdfbookmark[1]{23.01.2020: Objektorientierte Programmierung, Datenstrukturen}{20200123}
-  \includepdf[pages=-]{20200123/hp-20200123.pdf}
-\end{document}
diff --git a/script/Tower_of_Hanoi.jpeg b/script/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/script/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf
deleted file mode 100644
index 8f90a0d169c4b94a85845ccc3dad9b2877799c9b..0000000000000000000000000000000000000000
Binary files a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf and /dev/null differ
diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg
deleted file mode 100644
index d399442a10e479bbb92058b13e1aafa2fbcd3503..0000000000000000000000000000000000000000
--- a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   viewBox="0 0 847.15857 743.62268"
-   height="743.62268"
-   width="847.15857"
-   xml:space="preserve"
-   version="1.1"
-   id="svg5488"><metadata
-     id="metadata5494"><rdf:RDF><cc:Work
-         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
-     id="defs5492" /><g
-     transform="matrix(1.25,0,0,-1.25,0,743.62267)"
-     id="g5496"><g
-       id="g5498"><path
-         id="path5500"
-         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
-         d="m 338.867,594.5 c -7.512,0 -15.027,-2.867 -20.758,-8.598 -1.879,-1.879 -3.445,-3.953 -4.707,-6.152 l -15.246,-26.157 -0.07,0 L 4.984,45.554 C 4.93,45.457 4.887,45.359 4.832,45.261 3.344,42.867 2.176,40.218 1.406,37.351 -2.789,21.695 6.504,5.597 22.164,1.402 c 2.586,-0.695 5.184,-1.012 7.738,-1 l 618.067,0 c 16.215,0 29.355,13.141 29.355,29.356 0,5.304 -1.414,10.281 -3.879,14.578 -0.019,0.031 -0.035,0.062 -0.05,0.097 l -304.368,528.41 c -3.863,6.665 -5.652,9.305 -9.406,13.059 -5.73,5.731 -13.242,8.598 -20.754,8.598 z" /><path
-         id="path5502"
-         style="fill:#c1121c;fill-opacity:1;fill-rule:nonzero;stroke:none"
-         d="m 338.867,587.144 c -7.125,0.051 -14.949,-3.59 -18.781,-10.406 L 10.793,40.847 C 9.008,37.199 8.258,34.027 8.234,30.398 c 0,-6.496 2.875,-12.66 7.848,-16.84 4.383,-3.394 8.535,-5.16 14.121,-5.16 l 617.906,0 c 3.77,-0.035 7.547,0.871 10.977,3.133 6.453,3.898 10.402,10.883 10.41,18.426 -0.184,3.894 -1.144,8 -2.879,10.89 L 357.504,576.828 c -0.027,0.047 -0.059,0.094 -0.09,0.14 -0.031,0.047 -0.062,0.094 -0.094,0.145 -1.097,1.754 -2.472,3.305 -4.039,4.633 -3.59,3.109 -8.086,4.976 -12.824,5.316 -0.531,0.047 -1.062,0.078 -1.59,0.082 z M 30.203,8.398 l -1.523,0 1.554,0 -0.031,0 z M 338.547,480.933 574.25,72.398 l -471.738,0 236.035,408.535 z" /><path
-         id="path5504"
-         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
-         d="m 338.867,594.898 c -7.617,0 -15.23,-2.906 -21.039,-8.715 -1.906,-1.902 -3.492,-4.008 -4.773,-6.234 l -15.129,-25.957 -0.071,0 L 4.641,45.754 C 4.574,45.636 4.527,45.535 4.48,45.453 2.977,43.031 1.797,40.351 1.02,37.457 -3.23,21.586 6.191,5.269 22.059,1.015 24.68,0.312 27.316,-0.008 29.902,0 l 618.067,0 c 16.429,0 29.758,13.328 29.758,29.758 0,5.375 -1.438,10.417 -3.934,14.773 -0.012,0.019 -0.027,0.051 -0.051,0.098 L 369.379,573.043 c -3.871,6.668 -5.695,9.363 -9.469,13.14 -5.808,5.809 -13.426,8.715 -21.039,8.715 l -0.004,0 z m 0,-0.398 c 7.512,0 15.024,-2.867 20.754,-8.598 3.754,-3.754 5.543,-6.394 9.406,-13.059 L 673.391,44.433 c 0.019,-0.035 0.035,-0.066 0.054,-0.097 2.465,-4.297 3.879,-9.274 3.879,-14.578 0,-16.215 -13.14,-29.356 -29.355,-29.356 l -618.067,0 C 27.348,0.39 24.75,0.707 22.164,1.402 6.504,5.597 -2.789,21.695 1.406,37.351 c 0.766,2.867 1.938,5.516 3.426,7.91 0.055,0.098 0.098,0.196 0.152,0.293 l 293.102,508.039 0.07,0 15.246,26.157 c 1.262,2.199 2.828,4.273 4.707,6.152 5.731,5.731 13.243,8.598 20.758,8.598 z" /><path
-         id="path5506"
-         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
-         d="m 338.867,408.414 c -17.676,0 -32.004,-14.328 -32.004,-32 l 16,-188.016 c 0,-8.836 6.371,-16.015 16.004,-16 9.629,0.016 15.996,7.82 15.996,16.012 l 16,188.004 c 0,17.672 -14.324,32 -31.996,32 z" /><path
-         id="path5508"
-         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
-         d="m 370.863,124.398 c 0,-17.683 -14.316,-31.996 -31.996,-31.996 -17.676,0 -32.004,14.309 -32.004,31.996 0,17.672 14.328,32.004 32.004,32.004 17.68,0 31.996,-14.332 31.996,-32.004" /></g></g></svg>
\ No newline at end of file
diff --git a/script/Zeichen_123.pdf b/script/Zeichen_123.pdf
deleted file mode 120000
index fdbc897227df059cfda790a16555e6e417682116..0000000000000000000000000000000000000000
--- a/script/Zeichen_123.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/Zeichen_123.pdf
\ No newline at end of file
diff --git a/script/answer.c b/script/answer.c
deleted file mode 100644
index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000
--- a/script/answer.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "answer.h"
-
-int answer (void)
-{
-  return 23;
-}
diff --git a/script/answer.h b/script/answer.h
deleted file mode 100644
index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000
--- a/script/answer.h
+++ /dev/null
@@ -1 +0,0 @@
-extern int answer (void);
diff --git a/script/arrays-1.c b/script/arrays-1.c
deleted file mode 100644
index 2582e4953f11963bc5a71bb055829c9b95fc2f68..0000000000000000000000000000000000000000
--- a/script/arrays-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  int i;
-  for (i = 0; i < 5; i++)
-    printf ("%d\n", *(p + i));
-  return 0;
-}
diff --git a/script/arrays-2.c b/script/arrays-2.c
deleted file mode 100644
index 8affefa7b74afcbe0effbbe0ff32a577c696f21e..0000000000000000000000000000000000000000
--- a/script/arrays-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p = prime;
-  int i;
-  for (i = 0; i < 5; i++)
-    printf ("%d\n", p[i]);
-  return 0;
-}
diff --git a/script/bsort-1.c b/script/bsort-1.c
deleted file mode 100644
index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000
--- a/script/bsort-1.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i - 1, i) > 0)
-      {
-        char *temp = name[i - 1];
-        name[i - 1] = name[i];
-        name[i] = temp;
-      }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/bsort-1a.c b/script/bsort-1a.c
deleted file mode 100644
index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000
--- a/script/bsort-1a.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i - 1, i) > 0)
-      {
-        char *temp = name[i - 1];
-        name[i - 1] = name[i];
-        name[i] = temp;
-      }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/bsort-2.c b/script/bsort-2.c
deleted file mode 100644
index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000
--- a/script/bsort-2.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0)
-    {
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted--;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/bsort-3.c b/script/bsort-3.c
deleted file mode 100644
index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000
--- a/script/bsort-3.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int done = 0;
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0 && !done)
-    {
-      done = 1;
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            done = 0;
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted--;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/bsort-4.c b/script/bsort-4.c
deleted file mode 100644
index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000
--- a/script/bsort-4.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    sorted++;
-  while (sorted > 0)
-    {
-      int new_sorted = 0;
-      for (int i = 1; i < sorted; i++)
-        if (compare (name, i - 1, i) > 0)
-          {
-            new_sorted = i;
-            char *temp = name[i - 1];
-            name[i - 1] = name[i];
-            name[i] = temp;
-          }
-      sorted = new_sorted;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/cube-1.c b/script/cube-1.c
deleted file mode 100644
index 2f9328f07a9e6f35bb50535911fd0a327a5b6669..0000000000000000000000000000000000000000
--- a/script/cube-1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glutSolidCube (0.75);
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-2.c b/script/cube-2.c
deleted file mode 100644
index 0df28c7e4901f3653611c3803bc7df4d68a84121..0000000000000000000000000000000000000000
--- a/script/cube-2.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glRotatef (-30.0, 0.5, 1.0, 0.0);
-  glutSolidCube (0.75);
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-3.c b/script/cube-3.c
deleted file mode 100644
index ef326a1f58b7e5396fc2102907a3ba6a671b1bbf..0000000000000000000000000000000000000000
--- a/script/cube-3.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-float t = 0.0;
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glRotatef (t, 0.5, 1.0, 0.0);
-  glutSolidCube (0.5);
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-4.c b/script/cube-4.c
deleted file mode 100644
index 9dfb48d59fbbc5221a6f5599089aa2f1a694209a..0000000000000000000000000000000000000000
--- a/script/cube-4.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-float t = 0.0;
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glPushMatrix ();
-  glRotatef (t, 0.5, 1.0, 0.0);
-  glutSolidCube (0.5);
-  glPopMatrix ();
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-5.c b/script/cube-5.c
deleted file mode 100644
index 5cbb7d0065fa2c51fc5a268e964b418306034234..0000000000000000000000000000000000000000
--- a/script/cube-5.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-float t = 0.0;
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glPushMatrix ();
-  glRotatef (20.0 * t, 0.5, 1.0, 0.0);
-  glutSolidCube (0.5);
-  glPopMatrix ();
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-6.c b/script/cube-6.c
deleted file mode 100644
index b82eb81195fd03c68073807e800759e9a6e55e4a..0000000000000000000000000000000000000000
--- a/script/cube-6.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-float t = 0.0;
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glPushMatrix ();
-  glTranslatef (0.9, 0.0, 0.0);
-  glRotatef (20.0 * t, 0.5, 1.0, 0.0);
-  glutSolidCube (0.5);
-  glPopMatrix ();
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/cube-7.c b/script/cube-7.c
deleted file mode 100644
index b177ba0d9351d4c299503266b0f6df733ac8721d..0000000000000000000000000000000000000000
--- a/script/cube-7.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-
-float t = 0.0;
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  set_material_color (1.0, 0.7, 0.0);
-  glPushMatrix ();
-  glRotatef (20.0 * t, 0.5, 1.0, 0.0);
-  glTranslatef (0.9, 0.0, 0.0);
-  glutSolidCube (0.5);
-  glPopMatrix ();
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Cube");
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/earth-texture.png b/script/earth-texture.png
deleted file mode 120000
index c55876c24a42b6e0bb353e9e4789127e5b33e470..0000000000000000000000000000000000000000
--- a/script/earth-texture.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/earth-texture.png
\ No newline at end of file
diff --git a/script/fhello-1.c b/script/fhello-1.c
deleted file mode 100644
index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000
--- a/script/fhello-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/script/fhello-2.c b/script/fhello-2.c
deleted file mode 100644
index 6bd3fc97506fab7643dfe4d59a957cfa1a600750..0000000000000000000000000000000000000000
--- a/script/fhello-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  return 0;
-}
diff --git a/script/fhello-3.c b/script/fhello-3.c
deleted file mode 100644
index 529ddffd80d4a17c9fc89bf07f9da2368f412ea3..0000000000000000000000000000000000000000
--- a/script/fhello-3.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  else
-    fprintf (stderr, "error #%d\n", errno);
-  return 0;
-}
diff --git a/script/fhello-4.c b/script/fhello-4.c
deleted file mode 100644
index 2719776d312c79509d2863c5eabce09236db255c..0000000000000000000000000000000000000000
--- a/script/fhello-4.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  else
-    {
-      char *msg = strerror (errno);
-      fprintf (stderr, "%s\n", msg);
-    }
-  return 0;
-}
diff --git a/script/fhello-5.c b/script/fhello-5.c
deleted file mode 100644
index 038e0a3693708ca63281fce8e6d8f977d75ca8f4..0000000000000000000000000000000000000000
--- a/script/fhello-5.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  if (!f)
-     error (1, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/script/fhello-6.c b/script/fhello-6.c
deleted file mode 100644
index 8572d98de1fa9eef81ec260592bc5c2fa3399a02..0000000000000000000000000000000000000000
--- a/script/fhello-6.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "w");
-  if (!f)
-     error (errno, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/script/functions-1.c b/script/functions-1.c
deleted file mode 100644
index 10f26249461a77f1db7691b0bedd754d8ade5e0a..0000000000000000000000000000000000000000
--- a/script/functions-1.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-void foo (int a, int b)
-{
-  printf ("foo(): a = %d, b = %d\n", a, b);
-}
-
-int main (void)
-{
-  foo (3, 7);
-  return 0;
-}
diff --git a/script/functions-2.c b/script/functions-2.c
deleted file mode 100644
index 23ea1d20a629fcb69f88d44dc010da45572791ba..0000000000000000000000000000000000000000
--- a/script/functions-2.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-
-int a, b = 3;
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): a = %d, b = %d\n", a, b);
-  a++;
-  b++;
-}
-
-int main (void)
-{
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  a = b = 12;
-  printf ("main(): a = %d, b = %d\n", a, b);
-  foo ();
-  printf ("main(): a = %d, b = %d\n", a, b);
-  return 0;
-}
diff --git a/script/hello-1.c b/script/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/script/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/script/hello-2.c b/script/hello-2.c
deleted file mode 100644
index 15d0bc8e9b71c25fcd70d60b5f188d930ffa04b4..0000000000000000000000000000000000000000
--- a/script/hello-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  "\n";
-  return 0;
-}
diff --git a/script/hexe.h b/script/hexe.h
deleted file mode 100644
index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000
--- a/script/hexe.h
+++ /dev/null
@@ -1 +0,0 @@
-eine kleine Hexe.
diff --git a/script/higher-math-1.c b/script/higher-math-1.c
deleted file mode 100644
index 0d1a61a7f3f115e878707bf9ab97d8536e46e9bb..0000000000000000000000000000000000000000
--- a/script/higher-math-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4
-
-int main (void)
-{
-  printf ("2 + 2 = %d\n", VIER);
-  return 0;
-}
diff --git a/script/higher-math-2.c b/script/higher-math-2.c
deleted file mode 100644
index 4f8bfec89f2f1d3a82ee0911dadee9d3955bed50..0000000000000000000000000000000000000000
--- a/script/higher-math-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-#define wuppdich printf
-#define holla main
-#define pruzzel return
-#define VIER 4
-
-int holla (void)
-{
-  wuppdich ("2 + 2 = %d\n", VIER);
-  pruzzel 0;
-}
diff --git a/script/higher-math-3.c b/script/higher-math-3.c
deleted file mode 100644
index 0774461371a771e36ef4682648194a3161f4e1b6..0000000000000000000000000000000000000000
--- a/script/higher-math-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER 2 + 2
-
-int main (void)
-{
-  printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER);
-  return 0;
-}
diff --git a/script/higher-math-4.c b/script/higher-math-4.c
deleted file mode 100644
index 66907e2c7865f7e345f31376748ebfd62134fa43..0000000000000000000000000000000000000000
--- a/script/higher-math-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER (2 + 2)
-
-int main (void)
-{
-  printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER);
-  return 0;
-}
diff --git a/script/higher-math-5.c b/script/higher-math-5.c
deleted file mode 100644
index 77a4e4ccc520044f3be85c473f440f313ac9f0fa..0000000000000000000000000000000000000000
--- a/script/higher-math-5.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-#define VIER (2 + 2));
-
-int main (void)
-{
-  printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER
-  return 0;
-}
diff --git a/script/hp-2019ws.pdf b/script/hp-2019ws.pdf
deleted file mode 100644
index eab13eeb248cdd96d7ae143e812fffbbffde1e07..0000000000000000000000000000000000000000
Binary files a/script/hp-2019ws.pdf and /dev/null differ
diff --git a/script/hp-2019ws.tex b/script/hp-2019ws.tex
deleted file mode 100644
index 9f44ecd7250c6a89ec08983eb70536f20ac14948..0000000000000000000000000000000000000000
--- a/script/hp-2019ws.tex
+++ /dev/null
@@ -1,5876 +0,0 @@
-% hp-2018ws.pdf - Lecture Notes on Applied Computer Sciences
-% Copyright (C) 2012, 2013, 2015, 2016, 2018  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{pdftricks}
-\usepackage{rotating}
-\usepackage{amsfonts}
-\usepackage[helvet]{sfmath}
-\usepackage{tikz}
-
-\newcommand{\name}[1]{\textsc{#1}}
-\newcommand{\ccbysanp}{CC-by-sa (Version 3.0, nicht portiert)}
-\newcommand{\fdl}{GNU FDL (Version 1.2 oder höher)}
-\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
-\newcommand{\pd}{gemeinfrei -- \emph{public domain}}
-
-\newcommand{\underconstruction}{%
-  \begin{minipage}{6cm}
-    \begin{center}
-      \includegraphics[width=2cm]{Zeichen_123.pdf}
-
-      Dieser Abschnitt ist\\
-      noch nicht fertig.
-    \end{center}
-  \end{minipage}}
-
-\makeatletter
-  \newcommand{\figurecaptionraw}[2]{%
-    \def\n{\hfill\break}
-    \refstepcounter{figure}%
-    \addcontentsline{lof}{figure}%
-      {\protect\numberline{\hspace{-1.5em}Abb.~\thefigure}{\ignorespaces #1}}%
-    \begingroup
-      \def\n{\break}
-      \@makecaption{\csname fnum@figure\endcsname}{\ignorespaces #1}\par
-    \endgroup
-    \addtocontents{lof}{\begingroup\leftskip3.8em #2\par\endgroup}
-  }
-\makeatother
-\newcommand{\figurecaptionurl}[5]{%
-  \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: #4\protect\\Lizenz: #5}}
-\newcommand{\figurecaptionurlurl}[5]{%
-  \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: \protect\url{#4}\protect\\Lizenz: #5}}
-\newcommand{\figurecaptionself}[1]{\figurecaptionraw{#1}{Quelle/Autor: selbst erstellt\protect\\Lizenz: \mylicense}}
-
-\begin{psinputs}
-  \usepackage{pgscript}
-  \usepackage{pstricks,pst-grad,pst-node,pst-plot}
-  \psset{unit=1cm}
-\end{psinputs}
-
-\begin{document}
-  \thispagestyle{empty}
-  \makebox(0,0.0105)[tl]{\includegraphics[scale=1.008]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
-  \makebox(0,0)[tr]{\includegraphics[scale=0.7]{logo-hochschule-bochum.pdf}}%
-  \vfill
-  \begin{center}
-    {\Huge\textbf{Hardwarenahe Programmierung}\par}
-    \vspace{2cm}
-    {\large Wintersemester 2019/20\\[\medskipamount]
-    Prof.~Dr.~rer.~nat.~Peter Gerwinski}
-  \end{center}
-  \vfill
-
-  \clearpage
-
-  \begingroup
-
-    \setlength{\leftskip}{3cm}
-
-    \strut\vfill
-
-    Stand: 11.\ Januar 2020
-
-    Soweit nicht anders angegeben:\\
-    Text und Bilder: Copyright \copyright\ 2012, 2013, 2015, 2016, 2018, 2020\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können dieses Skript
-    einschließlich Vortragsfolien, Beispielprogramme und sonstiger Lehrmaterialien
-    unter \url{https://gitlab.cvh-server.de/pgerwinski/hp} herunterladen.
-
-  \endgroup
-
-  \clearpage
-
-  \tableofcontents
-
-  \clearpage
-
-  \section{Einführung}
-
-  \subsection{Was ist hardwarenahe Programmierung?}
-
-%  Die angewandte Informatik befaßt sich mit der Praxis der Programmierung von Computern.
-%  Sie vermittelt zwischen den Fachgebieten der Rechnertechnik
-%  ("`Wie funktioniert ein Computer?"') und der Softwaretechnik (Theorie des Programmierens).
-
-  In der Programmierung steht "`hardwarenah"'
-  für maximale Kontrolle des Programmierers über das genaue Verhalten der Hardware.
-  Im Gegensatz zur abstrakten Programmierung,
-  in der man als Programmierer in einer für Menschen möglichst komfortablen Weise
-  das gewünschte Verhalten des Computers beschreibt
-  und des den Programmierwerkzeugen überläßt,
-  auf welche Weise genau der Computer dies umsetzt,
-  geht es in der hardwarenahen Programmierung darum,
-  das Verhalten des Prozessors und jeder einzelnen Speicherzelle genau zu kennen.
-  
-  \begin{center}
-    \begin{pdfpic}
-      \begin{pspicture}(-5,0)(12,12)
-        \small
-        \psset{unit=0.5cm}
-        \psline[arrows=<->](-1,0)(-1,22)
-        \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}}
-        \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}}
-        \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}}
-        \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}}
-        \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}}
-        \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}}
-        \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}}
-        \rput(-1.3,10){\makebox(0,0)[r]{Assembler}}
-        \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}}
-        \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}}
-        \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}}
-%          \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}}
-        \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}}
-        \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}}
-        \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}}
-        \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}}
-        \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}}
-        \rput(2.1,0.5){\makebox(0,0)[l]{Physik}}
-        \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}}
-        \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}}
-        \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}}
-        \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}}
-        \rput(12.1,21){\makebox(0,0)[l]{Mathematik}}
-        \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000}
-        \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0}
-        \definecolor{RGBblue}{rgb}{0.0,0.0,1.0}
-        \definecolor{RGBred}{rgb}{1.0,0.0,0.0}
-        \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0}
-        \definecolor{RGByellow}{rgb}{1.0,1.0,0.0}
-        \definecolor{RGBorange}{rgb}{1.0,0.7,0.0}
-        \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7}
-        \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)}
-        \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)}
-        \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)}
-        \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)}
-        \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)}
-        \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)}
-        \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)}
-        \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)}
-        \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)}
-        \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)}
-        \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)}
-        \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)}
-        \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)}
-        \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)}
-        \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)}
-        \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)}
-      \end{pspicture}
-    \end{pdfpic}
-    \vspace{-\bigskipamount}
-    \figurecaptionself{Wissenschaftliche Disziplinen mit Bezug zur Informatik,\n
-                       angeordnet nach Abstraktionsgrad ihres jeweiligen Gegenstandes
-                       \label{Disziplinen}}
-  \end{center}
-
-  Im Gegensatz zu z.\,B.\ Lebewesen
-  werden Computer von Menschen entwickelt und gebaut.
-  Daher ist es grundsätzlich möglich, sie durch hardwarenahe Programmierung
-  vollständig zu verstehen und zu beherrschen.
-
-  \subsection{Programmierung in C}
-
-  Ein großer Teil dieser Vorlesung wird der Programmierung in der Programmiersprache C gewidmet sein.
-
-  Warum C?
-
-  C hat sich als Kompromiß zwischen einer Hochsprache und maximaler Nähe zur Hardware
-  sehr weit etabliert.
-  Es läuft auf nahezu jeder Plattform (= Kombination aus Hardware und Betriebssystem)
-  und stellt somit einen "`kleinsten gemeinsamen Nenner der Programmierung"' dar.
-  C orientiert sich sehr eng an der Funktionsweise der Computer-Hardware
-  und wird daher auch als "`High-Level-Assembler"' bezeichnet.
-
-  Wie die Assembler-Sprache, die Sie in \emph{Grundlagen Rechnertechnik\/} kennenlernen werden,
-  ist C ein Profi-Werkzeug und als solches "`leistungsfähig, aber gefährlich"'.
-  Programme können in C sehr kompakt geschrieben werden.
-  C kommt mit verhältnismäßig wenigen Sprach"-elementen aus,
-  die je nach Kombination etwas anderes bewirken.
-  Dies hat zur Folge, daß einfache Schreibfehler,
-  die in anderen Programmiersprachen als Fehler bemängelt würden,
-  in C häufig ein ebenfalls gültiges Programm ergeben,
-  das sich aber völlig anders als beabsichtigt verhält.
-
-  \breath
-
-  C wurde gemeinsam mit dem Betriebssystem Unix entwickelt
-  und hat mit diesem wichtige Eigenschaften gemeinsam:
-  \begin{itemize}
-    \item
-      \textbf{Kompakte Schreibweise:}
-      Häufig verwendete Konstrukte werden möglichst platzsparend notiert.
-      Wie in C, kann auch unter Unix ein falsch geschriebenes Kommando
-      ein ebenfalls gültiges Kommando mit anderer Wirkung bedeuten.
-    \item
-      \textbf{Baukastenprinzip:}
-      In C wie in Unix bemüht man sich darum, den unveränderlichen Kern möglichst klein zu halten.
-      Das meiste, was man in C tatsächlich benutzt, ist in Form von Bibliotheken modularisiert;
-      das meiste, was man unter Unix tatsächlich benutzt, ist in Form von Programmen modularisiert.
-    \item
-      \textbf{Konsequente Regeln:}
-      In C wie in Unix bemüht man sich darum,
-      feste Regeln -- mathematisch betrachtet -- möglichst einfach zu halten
-      und Ausnahmen zu vermeiden.
-      (Beispiel: Unter MS-DOS und seinen Nachfolgern wird eine ausführbare Datei gefunden,
-      wenn sie sich \emph{entweder} im aktuellen Verzeichnis \emph{oder} im Suchpfad befindet.
-      Unter Unix wird sie gefunden, wenn sie sich im Suchpfad befindet.
-      Es ist unter Unix möglich, das aktuelle Verzeichnis in den Suchpfad aufzunehmen;
-      aus Sicherheitserwägungen heraus geschieht dies jedoch üblicherweise nicht.)
-    \item
-      \textbf{Kein "`Fallschirm"':}
-      C und Unix führen Befehle ohne Nachfrage aus.
-      (Beispiel: Ein eingegebener Unix-Befehl zum Formatieren einer Festplatte
-      wird ohne Rückfrage ausgeführt.)
-  \end{itemize}
-
-  Trotz dieser Warnungen besteht bei Programmierübungen in C
-  normalerweise \emph{keine\/} Gefahr für den Rechner.
-  Moderne PC-Betriebssysteme überwachen die aufgerufenen Programme
-  und beenden sie notfalls mit einer Fehlermeldung ("`Schutzverletzung"').
-  Experimente mit Mikrocontrollern, die im Rahmen dieser Lehrveranstaltung stattfinden werden,
-  erfolgen ebenfalls in einer Testumgebung, in der kein Schaden entstehen kann.
-
-  Bitte nutzen Sie die Gelegenheit, in diesem Rahmen Ihre Programmierkenntnisse zu trainieren,
-  damit Sie später in Ihrer beruflichen Praxis,
-  wenn durch ein fehlerhaftes Programm ernsthafter Schaden entstehen kann,
-  wissen, was Sie tun.
-
-  \section{Einführung in C}
-
-  \subsection{Hello, world!}
-
-  Das folgende Beispiel-Programm (Datei: \gitfile{hp}{script}{hello-1.c})
-  gibt den Text "`Hello, world!"' auf dem Bildschirm aus:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Hello, world!\n");
-      return 0;
-    }
-  \end{lstlisting}
-  Dieses traditionell erste -- "`einfachste"' -- Beispiel enthält in C bereits viele Elemente,
-  die erst zu einem späteren Zeitpunkt zufriedenstellend erklärt werden können:
-  \begin{itemize}
-    \item
-      \lstinline{#include <stdio.h>}
-
-      Wir deuten diese Zeile im Moment so, daß uns damit gewisse Standardfunktionen
-      (darunter \lstinline{printf()} -- siehe unten) zur Verfügung gestellt werden.
-
-      Diese Betrachtungsweise ist nicht wirklich korrekt
-      und wird in Abschnitt \ref{Praeprozessor} genauer erklärt.
-
-    \item
-      \lstinline|int main (void) { ... }|
-
-      Dies ist das C-Hauptprogramm.
-      Das, was zwischen den geschweiften Klammern steht, wird ausgeführt.
-
-      Auch hier wird zu einem späteren Zeitpunkt (Abschnitt \ref{Funktionen})
-      genauer erklärt werden, was die einzelnen Elemente bedeuten und welchen Sinn sie haben.
-  \end{itemize}
-  \goodbreak
-  Im folgenden soll nun der eigentliche Inhalt des Programms erklärt werden:
-  \begin{lstlisting}
-    printf ("Hello, world!\n");
-    return 0;
-  \end{lstlisting}
-  \vspace{-\bigskipamount}
-  \begin{itemize}
-    \item
-      Bei beiden Zeilen handelt es sich um sogenannte \newterm{Anweisungen}.
-    \item
-      Jede Anweisung wird mit einem Semikolon abgeschlossen.
-    \item
-      Bei \lstinline{printf()} handelt es sich um einen \newterm{Funktionsaufruf},
-      dessen Wirkung darin besteht, daß der zwischen den Klammern angegebene \newterm{Parameter\/}
-      (oder: das \newterm{Argument\/}) der Funktion
-      auf dem Standardausgabegerät ausgegeben wird.
-      (In unserem Fall handelt es sich dabei um einen Bildschirm.)
-      Der Name "`\lstinline{printf}"' der Funktion steht für "`print formatted"' -- formatierte Ausgabe.
-    \item
-      \lstinline{"Hello, world!\n"} ist eine \newterm{Konstante\/}
-      vom Typ \newterm{String\/} (= Zeichenkette).
-    \item
-      \lstinline{\n} ist eine \newterm{Escape-Sequenz}.
-      Sie steht für ein einzelnes, normalerweise unsichtbares Zeichen
-      mit der Bedeutung "`neue Zeile"'.
-    \item
-      Die Anweisung \lstinline{return 0} bedeutet:
-      Beende die laufende Funktion (hier: \lstinline{main()}, also das Hauptprogramm)
-      mit dem Rückgabewert 0.
-      (Bedeutung: "`Programm erfolgreich ausgeführt."' --  siehe Abschnitt \ref{Funktionen}.)
-  \end{itemize}
-
-  \subsection{Programme compilieren und ausführen}
-
-  Der Programmtext wird mit Hilfe eines Eingabeprogramms, des \newterm{Texteditors},
-  in den Computer eingegeben und als Datei gespeichert.
-  Als Dateiname sei hier \gitfile{hp}{script}{hello-1.c} angenommen.
-  Die Dateiendung \file{.c} soll anzeigen,
-  daß es sich um einen Programmquelltext in der Programmiersprache C handelt.
-
-  Die \file{.c}-Datei ist für den Computer nicht direkt ausführbar.
-  Um eine ausführbare Datei zu erhalten,
-  muß das Programm zuerst in die Maschinensprache des verwendeten Computers übersetzt werden.
-  Diesen Vorgang nennt man \newterm{Compilieren}.
-
-  In einer Unix-Shell mit installierter GNU-Compiler-Collection
-  (GCC; frühere Bedeutung der Abkürzung: GNU-C-Compiler)
-  geschieht das Compilieren durch Eingabe der folgenden Zeile, der \newterm{Kommandozeile\/}:
-
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc hello-1.c -o hello-1¿
-  \end{lstlisting}
-
-  Das Zeichen \lstinline[style=terminal]{$} steht für die \newterm{Eingabeaufforderung\/}
-  (oder das \newterm{Prompt\/}) der Unix-Shell. Es kann auch anders aussehen, z.\,B.\
-  \lstinline[style=terminal]{pc42:~$} oder auch
-  \lstinline[style=terminal]{cassini/home/peter/bo/2018ws/hp/script>}.
-  Die Eingabe"-aufforderung wird vom Computer ausgegeben;
-  die Kommandozeile rechts daneben müssen wir eingeben und mit der Eingabetaste (Enter) bestätigen.
-
-  \lstinline[style=cmd]{gcc} ist ein Befehl an den Computer,
-  nämlich der Name eines Programms, das wir aufrufen wollen (hier: der Compiler).
-  Die darauf folgenden Teile der Kommandozeile heißen die \newterm{Parameter\/}
-  oder \newterm{Argumente\/} des Befehls.
-
-  Der Parameter \lstinline[style=cmd]{hello-1.c} ist der Name der Datei, die compiliert werden soll.
-
-  \lstinline[style=cmd]{-o} ist eine \newterm{Option\/} an den Compiler,
-  mit der man ihm mitteilt, daß der nächste Parameter \lstinline[style=cmd]{hello-1}
-  der Name der ausführbaren Datei ist, die erzeugt werden soll.
-
-  Unter Unix ist es üblich, ausführbaren Dateien \emph{keine\/} Endung zu geben.
-  Unter Microsoft Windows wäre es stattdessen üblich,
-  die ausführbare Datei \lstinline[style=cmd]{hello-1.exe} zu nennen.
-
-  \breath
-
-  Um von einer Unix-Shell aus ein Programm aufzurufen,
-  gibt man dessen vollständigen Namen
-  -- einschließlich Verzeichnispfad und eventueller Endung -- als Kommando ein:
-  \begin{lstlisting}[style=terminal]
-    $ ¡./hello-1¿
-  \end{lstlisting}
-  Der Punkt steht für das aktuelle Verzeichnis;
-  der Schrägstrich trennt das Verzeichnis vom eigentlichen Dateinamen.
-
-  Wenn sich ein Programm im Suchpfad befindet (z.\,B.: \lstinline[style=cmd]{gcc}),
-  darf die Angabe des Verzeichnisses entfallen.
-  (Den Suchpfad kann man sich mit dem Kommando
-  \lstinline[style=cmd]{echo $PATH} anzeigen lassen.)
-  Aus Sicherheitsgründen steht das aktuelle Verzeichnis
-  unter Unix üblicherweise \emph{nicht\/} im Suchpfad.
-
-  \breath
-
-  \begin{experts}
-    Dateiendungen dienen unter Unix nur der Übersicht,
-    haben aber keine technischen Konsequenzen:
-    \begin{itemize}
-      \item
-        Ob eine Datei als ausführbar betrachtet wird oder nicht,
-        wird nicht anhand einer Endung, sondern über ein \newterm{Dateiattribut\/} entschieden.
-        Die Dateiattribute werden beim Listen des Verzeichnisinhalts angezeigt:
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡ls -l¿
-          -rwxr-x--- 1 peter ainf 6294  4. Okt 14:34 hello-1
-          -rw-r--r-- 1 peter ainf   82  4. Okt 15:11 hello-1.c
-        \end{lstlisting}
-        Jedes \lstinline[style=terminal]{r} steht für "`read"' (Datei lesbar),
-        jedes \lstinline[style=terminal]{w} für "`write"' (Datei schreibbar)
-        und jedes \lstinline[style=terminal]{x} für "`execute"' (Datei ausführbar).
-        Von links nach rechts stehen die \lstinline[style=terminal]{rwx}-Gruppen für
-        den Besitzer der Datei (hier: \lstinline[style=terminal]{peter})
-        eine Benutzergruppe (hier: \lstinline[style=terminal]{ainf})
-        und für alle anderen Benutzer des Computers.
-        
-        Im o.\,a.\ Beispiel ist die Datei \gitfile{hp}{script}{hello-1.c}
-        für den Benutzer \lstinline[style=terminal]{peter} les- und schreibbar,
-        für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} nur lesbar
-        und für alle anderen Benutzer des Computers ebenfalls nur lesbar.
-        Die Datei \file{hello-1} (ohne Endung) ist hingegen
-        für den Benutzer \lstinline[style=terminal]{peter} les-, schreib- und ausführbar,
-        für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} les- und ausführbar,
-        aber nicht schreibbar. Alle anderen Benutzer des Computer haben für die Datei
-        \file{hello-1} überhaupt keine Zugriffsrechte.
-      \item
-        Welcher Art der Inhalt der Datei ist,
-        entnimmt Unix dem Inhalt selbst.
-        Man kann sich dies mit Hilfe des Befehls \lstinline[style=cmd]{file} anzeigen lassen:
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡file hello-1¿
-          hello-1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
-          dynamically linked (uses shared libs), for GNU/Linux 2.6.18,
-          not stripped
-          $ ¡file hello-1.c¿
-          hello-1.c: ASCII C program text
-        \end{lstlisting}
-      \item
-        Eine ausführbare Datei, die Text enthält, ist ein sogenanntes \newterm{Shell-Skript}.
-        Der Aufruf eines Shell-Skripts bewirkt i.\,w.\ dasselbe,
-        als wenn man den darin enthaltenen Text als Kommandos eingeben würde.
-      \item
-        Ein C-Quelltext enthält i.\,d.\,R.\ \emph{keine\/} gültigen Unix-Kommandos
-        und kann daher \emph{nicht\/} "`einfach so"' ausgeführt werden.
-      \item
-        Es ist zulässig, aber normalerweise nicht sinnvoll,
-        einer ausführbaren Datei die Endung \file{.c} zu geben.
-    \end{itemize}
-  \end{experts}
-
-  \subsection{Elementare Aus- und Eingabe}
-
-  Da es möglich ist, mittels der Funktion \lstinline{printf()}
-  eine String-Konstante wie z.\,B.\ \lstinline{"Hello, world!\n"} "`einfach so"' auszugeben,
-  liegt die Vermutung nahe, Integer-Konstanten auf gleiche Weise ausgeben zu können.
-
-  Datei \gitfile{hp}{script}{output-1.c}:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf (42);
-      return 0;
-    }
-  \end{lstlisting}
-  Beim Compilieren dieses Programms erhalten wir eine Warnung:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc output-1.c -o output-1¿
-    output-12.c: In function 'main':
-    output-12.c:5: warning: passing argument 1 of 'printf'
-    makes pointer from integer without a cast
-    /usr/include/stdio.h:339: note: expected
-    'const char * __restrict__' but argument is of type 'int'
-  \end{lstlisting}
-  \goodbreak
-  Es entsteht trotzdem eine ausführbare Datei \file{output-1}.
-  Wenn wir diese jedoch ausführen, erhalten wir eine Fehlermeldung:
-  \begin{lstlisting}[style=terminal]
-    $ ¡./output-12¿
-    Segmentation fault
-  \end{lstlisting}
-  Tatsächlich ist die direkte Übergabe einer Integer-Konstanten an \lstinline{printf()}
-  ein grober Fehler: \lstinline{printf()} akzeptiert als ersten Parameter nur Ausdrücke vom Typ String.
-  Der C-Compiler nimmt eine implizite Umwandlung der Integer-Konstanten in einen String vor:
-  Die Zahl wird als eine Speicheradresse interpretiert, an der sich der Text befindet.
-  Dies ist nicht besonders sinnvoll (daher die Warnung), aber in C zulässig.
-
-  Wenn nun das Programm ausgeführt wird, versucht es, auf die Speicheradresse Nr.\ 42 zuzugreifen.
-  Diese befindet sich normalerweise außerhalb des Programms.
-  Das Betriebssystem bemerkt den illegalen Zugriffsversuch
-  und bricht das Programm mit einer Fehlermeldung
-  ("`Speicherzugriffsfehler"', "`Schutzverletzung"' o.\,ä.) ab.
-
-  Auf einer Plattform ohne derartige Schutzmechanismen (z.\,B.\ einem Mikrocontroller)
-  wird das fehlerhafte Programm hingegen klaglos ausgeführt.
-  Es werden dann sinnlose Texte, die sich zufällig an Speicheradresse Nr.\ 42 befinden,
-  auf dem Standardausgabegerät ausgegeben.
-
-  \breath
-
-  Dieses fehlerhafte Programm illustriert, wie leicht es in der Programmiersprache C ist,
-  einen Absturz zu programmieren.
-  Die meisten anderen Programmiersprachen würden das fehlerhafte Programm nicht akzeptieren;
-  anstelle der o.\,a.\ Warnung bekäme man eine ähnlichlautende Fehlermeldung.
-
-  \begin{hint}
-    Nehmen Sie nicht nur die Fehlermeldungen,\\
-    sondern auch die Warnungen des Compilers ernst!
-  \end{hint}
-
-  Gerade in graphischen Entwicklungsentwicklungen
-  werden Warnungen oft in einem winzigen Fenster angezeigt
-  und gehen zwischen anderen Meldungen unter.
-  Auch sind die Compiler-Optionen,
-  mit denen Sie Warnungen ein- oder ausschalten können,
-  oft in tiefen Menü-Strukturen versteckt,
-  so daß man als Programmierer den Aufwand scheut,
-  diese sinnvoll zu setzen.
-
-  Fehlermeldungen \emph{müssen\/} Sie ernstnehmen,
-  da Sie sonst kein ausführbares Programm erhalten.
-  Warnungen \emph{sollten\/} Sie ebenfalls ernstnehmen,
-  \emph{obwohl\/} Sie ein ausführbares Programm erhalten,
-  da dieses mit hoher Wahrscheinlichkeit
-  in einer nicht-offensichtlichen Weise \emph{fehlerhaft\/} ist.
-  Ein derartiges Programm produktiv einzusetzen,
-  kann je nach Einsatzgebiet Vermögens-, Sach- oder sogar Personenschäden
-  zur Folge haben.
-
-  \breath
-
-  Wie man nun tatsächlich in C Zahlenwerte ausgibt,
-  illustriert das Beispielprogramm \gitfile{hp}{script}{output-2.c}:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Die Antwort lautet: %d\n", 42);
-      return 0;
-    }
-  \end{lstlisting}
-  Der erste Parameter von \lstinline{printf()}, der sog.\ \newterm{Format-String},
-  enthält das Symbol \lstinline{%d}.
-  Diese sog.\ \newterm{Formatspezifikation\/} wird in der Ausgabe
-  durch den Zahlenwert des zweiten Parameters von \lstinline{printf()} ersetzt.
-  Das \lstinline{d} steht hierbei für "`dezimal"'.
-
-  \breath
-
-  \begin{experts}
-%    Wenn man anstelle von \lstinline{%d} die Formatspezifikation \lstinline{%x} verwendet,
-%    wird die Zahl in hexadezimaler anstatt in dezimaler Schreibweise ausgegeben.
-    Wenn man zwischen das Prozentzeichen un das \lstinline{d} eine Zahl schreibt (z.\,B.\ \lstinline{%3d}),
-    gibt man damit die Breite eines Feldes an, in die die auszugebende Zahl rechtsbündig geschrieben wird.
-    Wenn man die Feldbreite mit einer Null beginnen läßt (z.\,B.\ \lstinline{%03d})
-    wird die auszugebende Zahl von links mit Nullen bis zur Feldbreite aufgefüllt.
-
-    Eine vollständige Liste der in \lstinline{printf()} zulässigen Formatspezifikationen
-    finden Sie in der Dokumentation des Compiler-Herstellers zu \lstinline{printf()}.
-    Von der Unix-Shell aus können Sie diese
-    mit dem Befehl \lstinline[style=cmd]{man 3 printf} abrufen.
-%
-%    Umgekehrt können Sie in C Integer-Konstanten
-%    durch Voranstellen von \lstinline{0x} in hexadezimaler anstatt dezimaler Schreibweise eingeben.
-%    Die Hexadezimalzahl \lstinline{0x2a} steht in C für genau dieselbe Konstante
-%    wie die Dezimalzahl \lstinline{42}.
-  \end{experts}
-
-  \breath
-
-  Bemerkungen:
-  \begin{itemize}
-    \item
-      Ein Text darf auch Ziffern enthalten.
-      Anhand der Ausgabe sind \lstinline{printf ("42\n");} 
-      und \lstinline{printf ("%d\n", 42);} nicht voneinander unterscheidbar.
-    \item
-      Die Position des \lstinline{\n} ist relevant,
-      z.\,B.\ geht \lstinline{printf ("\n42");} zuerst in eine neue Zeile
-      und gibt danach den Text aus.
-      Auch mehrere \lstinline{\n} in derselben String-Konstanten sind zulässig.
-    \item
-      C akzeptiert auch sehr seltsame Konstrukte.
-      Das folgende Beispiel (Datei: \gitfile{hp}{script}{hello-2.c})
-      \begin{lstlisting}[gobble=8]
-        #include <stdio.h>
-
-        int main (void)
-        {
-          printf ("Hello, world!\n");
-          "\n";
-          return 0;
-        }
-      \end{lstlisting}
-      wird vom Compiler akzeptiert.
-      (Warum das so ist, wird in Abschnitt \ref{Seiteneffekte} behandelt.)
-
-      Bei Verwendung der zusätzlichen Option \lstinline[style=cmd]{-Wall}
-      erhalten wir zumindest eine Warnung über eine "`Anweisung ohne Effekt"':
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall hello-2.c -o hello-2¿
-        hello-2.c: In function 'main':
-        hello-2.c:6: warning: statement with no effect
-      \end{lstlisting}
-      Es empfiehlt sich, die Option \lstinline[style=cmd]{-Wall} grundsätzlich zu verwenden
-      und die Warnungen ernstzunehmen.
-  \end{itemize}
-
-  \breath
-
-  Wenn mehrere Werte ausgegeben werden sollen,
-  verwendet man in \lstinline{printf()} mehrere Formatspezifikationen
-  und gibt mehrere Werte als Parameter an (Datei: \gitfile{hp}{script}{output-3.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc output-3.c -o output-3¿
-    $ ¡./output-3¿
-    Richtige Antworten wären 1 oder 2 oder sonstige.
-    $
-  \end{lstlisting}
-  Achtung: Zu viele oder zu wenige Werte in der Parameterliste
-  ergeben trotzdem ein gültiges, wenn auch fehlerhaftes C-Programm
-  (Datei: \gitfile{hp}{script}{output-4.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n");
-      return 0;
-    }
-  \end{lstlisting}
-  Wenn man dieses Programm laufen läßt,
-  wird nicht etwa das zweite \lstinline{%d} durch den Zahlenwert 2 ersetzt.
-  Vielmehr endet das, was ausgegeben wird, mit dem ersten \lstinline{%d},
-  für das der Zahlenwert 1 eingesetzt wird,
-  und alles, was nach der 1 kommt, wird schlichtweg ignoriert.
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc output-4.c -o output-4¿
-    $ ¡./output-4¿
-    Richtige Antworten wären 1
-    $
-  \end{lstlisting}
-  Bei Verwendung der Option \lstinline[style=cmd]{-Wall}
-  erhalten wir auch hier eine Warnung:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall output-4.c -o output-4¿
-    output-4.c: In function 'main':
-    output-4.c:5: warning: too many arguments for format
-  \end{lstlisting}
-
-  Das Einlesen von Werten erfolgt in C mit der Funktion \lstinline{scanf()}.
-
-  Das folgende Beispielprogramm (Datei: \gitfile{hp}{script}{input-1.c})
-  liest einen Wert vom Standardeingabegerät (hier: Tastatur) ein
-  und gibt ihn wieder aus:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a;
-      printf ("Bitte eine Zahl eingeben: ");
-      scanf ("%d", &a);
-      printf ("Sie haben eingegeben: %d\n", a);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Damit \lstinline{scanf()} in die Variable \lstinline{a} einen Wert schreiben kann,
-  ist es erforderlich, nicht den aktuellen Wert von \lstinline{a},
-  sondern die Variable selbst an \lstinline{scanf()} zu übergeben.
-  Dies geschieht durch Voranstellen eines Und-Symbols \lstinline{&}.
-  (Genaugenommen handelt es sich um die Übergabe einer Speicheradresse.
-  Dies wird in Abschnitt \ref{Zeiger} genauer behandelt.)
-
-  Wenn wir das \lstinline{&} vergessen (Beispielprogramm: \gitfile{hp}{script}{input-2.c}),
-  kann das C-Programm weiterhin compiliert werden.
-  Bei Verwendung der Option \lstinline[style=cmd]{-Wall} erhalten wir eine Warnung.
-  Wenn wir das Programm ausführen und versuchen, einen Wert einzugeben, stürzt das Programm ab.
-  (Hintergrund: Es betrachtet den aktuellen -- zufälligen -- Wert der Variablen \lstinline{a}
-  als Adresse einer Speicherzelle, an der der eingelesene Wert gespeichert werden soll.
-  Das Programm greift also schreibend auf eine Speicherzelle außerhalb des ihm zugeteilten Bereichs zu.)
-
-  \breath
-
-  \begin{experts}
-    Die Funktion \lstinline{scanf()} kann, analog zu \lstinline{printf()},
-    gleichzeitig mehrere Werte abfragen.
-    Hierzu müssen wir im Format-String mehrere Formatspezifikationen angeben
-    und die Adressen mehrerer Variabler als Parameter übergeben.
-
-    Genau wie bei \lstinline{printf()} werden überzählige Parameter ignoriert,
-    und fehlende Parameter führen zu einem Absturz des Programms.
-
-    Zeichen zwischen den Formatspezifikationen fungieren als Trennzeichen.
-    Damit die Zahlen angenommen werden, muß die Eingabe die Trennzeichen enthalten.
-
-    Für doppelt genaue Fließkommazahlen (\lstinline{double})
-    lautet die Formatspezifikation \lstinline{%lf};
-    für einfach genaue Fließkommazahlen (\lstinline{float})
-    lautet sie \lstinline{%f}.
-
-    Weitere Informationen zu den Formatspezifikationen von \lstinline{scanf()}
-    finden Sie in der Dokumentation zu \lstinline{scanf()}.
-    (In der Unix-Shell können Sie diese mit dem Befehl \lstinline[style=cmd]{man 3 scanf} abrufen.)
-
-    Für das Einlesen von Strings ist \lstinline{scanf()} eher ungeeignet.
-    Hier empfiehlt es sich, stattdessen \lstinline{fgets()} zu benutzen
-    (siehe \lstinline[style=cmd]{man 3 fgets}).
-  \end{experts}
-
-  \subsection{Elementares Rechnen}
-
-  Der \newterm{binäre Operator} \lstinline{+} kann in C (und den meisten Programmiersprachen)
-  dazu verwendet werden, zwei Integer-Ausdrücke, die sogenannten \newterm{Operanden},
-  durch Addition zu einem neuen Integer-Ausdruck zu verknüpfen.
-
-  Beispiel: \gitfile{hp}{script}{mathe-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("%d\n", 23 + 19);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{experts}
-    (Tatsächlich führt bereits die erste Stufe des Compilers eine Optimierung durch,
-    die bewirkt, daß die ausführbare Datei keine Additionsbefehle,
-    sondern direkt das Ergebnis der Addition enthält.)
-  \end{experts}
-
-  Die Operatoren für die Grundrechenarten lauten in C:
-  \begin{center}
-    \begin{tabular}{cl}
-      \lstinline|+| & Addition \\
-      \lstinline|-| & Subtraktion \\
-      \lstinline|*| & Multiplikation \\
-      \lstinline|/| & Division: Bei ganzen Zahlen wird grundsätzlich abgerundet. \\
-      \lstinline|%| & Modulo-Operation: Rest bei Division (\lstinline|39 % 4| ergibt \lstinline|3|.)
-    \end{tabular}
-  \end{center}
-
-  Die Verwendung von \newterm{Variablen} erfordert in C eine vorherige Deklaration.
-  \begin{lstlisting}[belowskip=0pt]
-    int a;
-  \end{lstlisting}
-  deklariert eine Variable vom Typ Integer,
-  \begin{lstlisting}[belowskip=0pt]
-    int a, b;
-  \end{lstlisting}
-  deklariert zwei Variable vom Typ Integer, und
-  \begin{lstlisting}[belowskip=0pt]
-    int a, b = 3;
-  \end{lstlisting}
-  deklariert zwei Variable vom Typ Integer und initialisiert \emph{die zweite\/} mit dem Wert 3.
-  (Im letzten Beispiel wird insbesondere die erste Variable \lstinline{a} \emph{nicht\/} initialisiert.)
-  
-  Nicht initialisierte Variable erhalten einen \emph{zufälligen\/} Wert.
-  Wenn beim Compilieren mit \lstinline[style=cmd]{gcc}
-  zusätzlich zu den Warnungen (Option \lstinline[style=cmd]{-Wall})
-  auch die Optimierung (Option \lstinline[style=cmd]{-O}, \lstinline[style=cmd]{-O2} oder \lstinline[style=cmd]{O3})
-  aktiviert ist, erkennt \lstinline[style=cmd]{gcc}
-  die Verwendung derartiger zufälliger Werte und gibt eine Warnung aus.
-
-  \begin{experts}
-    Nicht explizit initialisierte \newterm{globale Variable},
-    also solche, die außerhalb einer Funktion deklariert werden,
-    werden implizit auf Null initialisiert
-    (\lstinline{0} für Zahlen, \lstinline{NULL} für Zeiger usw.).
-    Es ist trotzdem in Hinblick auf selbstdokumentierenden Quelltext sinnvoll,
-    diese ggf.\ explizit auf \lstinline{0} zu initialisieren.
-  \end{experts}
-
-  \breath
-
-  Für Fließkommazahlen verwendet man meistens den Datentyp \lstinline{double}:
-  \begin{lstlisting}[belowskip=0pt]
-    double x = 3.141592653589793;
-  \end{lstlisting}
-
-  \bigskip
-
-  \begin{experts}
-    Die Bezeichnung \lstinline{double} steht für "`doppelt genau"'.
-    Daneben gibt es noch einen Datentyp \lstinline{float} für "`einfach genaue"' Fließkommazahlen
-    sowie einen Datentyp \lstinline{long double} für noch höhere Genauigkeit.
-    Typischerweise folgen Fließkommazahlen in C dem Standard IEEE 754.
-    In diesem Fall hat \lstinline{float} eine Genauigkeit von ca.\ 6
-    und \lstinline{double} eine Genauigkeit von ca.\ 15 Nachkommastellen.
-  \end{experts}
-
-  \breath
-
-  Zuweisungen an Variable erfolgen in C mit Hilfe des binären Operators \lstinline{=}.
-  Es ist ausdrücklich erlaubt, den "`alten"' Wert einer Variablen in Berechnungen zu verwenden,
-  deren Ergebnis man dann derselben Variablen zuweist.
-
-  Eine Anweisung wie z.\,B.\ \lstinline{a = 2 * a}
-  ist insbesondere keine mathematische Gleichung
-  (mit der Lösung 0 für die Unbekannte \lstinline{a}),
-  sondern die Berechnung des Doppelten des aktuellen Wertes der Variablen \lstinline{a},
-  welches dann wiederum in der Variablen \lstinline{a} gespeichert wird.
-
-  \subsection{Verzweigungen}
-
-  Das Beispielprogramm \gitfile{hp}{script}{if-0.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a, b;
-      printf ("Bitte a eingeben: ");
-      scanf ("%d", &a);
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      printf ("a geteilt durch b ist: %d\n", a / b);
-      return 0;
-    }
-  \end{lstlisting}
-  hat den Nachteil, daß bei Eingabe von 0 für die zweite Zahl das Programm abstürzt:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall if-0.c -o if-0¿
-    $ ¡./if-0¿
-    Bitte a eingeben: ¡13¿
-    Bitte b eingeben: ¡0¿
-    Floating point exception
-  \end{lstlisting}
-  Die Fehlermeldung stammt nicht vom Programm selbst, sondern vom Betriebssystem,
-  das auf einen vom Prozessor signalisierten Fehlerzustand reagiert.
-  ("`Floating point exception"' ist die Bezeichnung dieses Fehlerzustands.
-  In diesem Fall ist die Bezeichnung leicht irreführend,
-  da konkret dieser Fehler durch eine Division ganzer Zahlen,
-  also insbesondere nicht durch eine Fließkommaoperation, ausgelöst wird.)
-
-  Für Programme wie dieses ist es notwendig,
-  in Abhängigkeit von den Benutzereingaben unterschiedliche Anweisungen auszuführen.
-  Diese sog.\ \newterm{Verzweigung\/} geschieht mittels einer \lstinline{if}-Anweisung.
-
-  \goodbreak
-  Beispielprogramm: \gitfile{hp}{script}{if-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a, b;
-      printf ("Bitte a eingeben: ");
-      scanf ("%d", &a);
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      if (b != 0)
-        printf ("a geteilt durch b ist: %d\n", a / b);
-      return 0;
-    }
-  \end{lstlisting}
-
-  In den Klammern hinter dem \lstinline{if} steht ein Ausdruck, die sog.\ \newterm{Bedingung}.
-  Die auf das \lstinline{if} folgende Anweisung wird nur dann ausgeführt,
-  wenn die Bedingung \emph{ungleich Null\/} ist.
-  (C kennt keinen eigenen "`Booleschen"' Datentyp.
-  Stattdessen steht \lstinline{0} für den Wahrheitswert "`falsch"'
-  und alles andere für den Wahrheitswert "`wahr"'.)
-
-  Der binäre Operator \lstinline{!=} prüft zwei Ausdrücke auf Ungleichheit.
-  Er liefert \lstinline{0} zurück, wenn beide Operanden gleich sind,
-  und \lstinline{1}, wenn sie ungleich sind.
-
-  \breath
-
-  Die \lstinline{if}-Anweisung kennt einen optionalen \lstinline{else}-Zweig.
-  Dieser wird dann ausgeführt, wenn die Bedingung \emph{nicht\/} erfüllt ist.
-
-  Beispielprogramm: \gitfile{hp}{script}{if-2.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a, b;
-      printf ("Bitte a eingeben: ");
-      scanf ("%d", &a);
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      if (b != 0)
-        printf ("a geteilt durch b ist: %d\n", a / b);
-      else
-        printf ("Bitte nicht durch 0 teilen!\n");
-      return 0;
-    }
-  \end{lstlisting}
-
-  \breath
-
-  Sowohl auf das \lstinline{if} als auch auf das \lstinline{else}
-  folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt.
-
-  In dem folgenden Beispielprogramm (Datei: \gitfile{hp}{script}{if-3.c})
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a, b;
-      printf ("Bitte a eingeben: ");
-      scanf ("%d", &a);
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      if (b != 0)
-        printf ("a geteilt durch b ist: %d\n", a / b);
-      else
-        printf ("Bitte nicht durch 0 teilen!\n");
-        printf ("Das tut man nicht.\n");
-      return 0;
-    }
-  \end{lstlisting}
-  wird die Zeile \lstinline{printf ("Das tut man nicht.\n");} auch dann ausgeführt,
-  wenn die Variable \lstinline{b} ungleich 0 ist.
-
-  \breath
-
-  In C ist die Einrückung der Zeilen im Programmquelltext "`nur"' eine optische Hilfe für Programmierer.
-  Welche Anweisung von welcher Bedingung abhängt,
-  entscheidet der Compiler allein anhand der Regeln der Programmiersprache,
-  und diese besagen eindeutig:
-  "`Sowohl auf das \lstinline{if} als auch auf das \lstinline{else}
-  folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt."'
-
-  Wenn wir möchten, daß mehrere Anweisungen von der Bedingung abhängen,
-  müssen wir diese mittels geschweifter Klammern
-  zu einem sog.\ \newterm{Anweisungsblock\/} zusammenfassen.
-
-  \goodbreak
-  Beispielprogramm: \gitfile{hp}{script}{if-4.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int a, b;
-      printf ("Bitte a eingeben: ");
-      scanf ("%d", &a);
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      if (b != 0)
-        printf ("a geteilt durch b ist: %d\n", a / b);
-      else
-        {
-          printf ("Bitte nicht durch 0 teilen!\n");
-          printf ("Das tut man nicht.\n");
-        }
-      return 0;
-    }
-  \end{lstlisting}
-
-  Aus Sicht des Computers ist die Einrückung
-  -- und überhaupt die Anordnung von Leerzeichen und Zeilenschaltungen -- belanglos.
-  Die folgende Schreibweise (Datei: \gitfile{hp}{script}{if-5.c}) ist für ihn
-  vollkommen gleichwertig zu \gitfile{hp}{script}{if-4.c}:
-  \begin{lstlisting}
-    #include<stdio.h>
-    int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a);
-    printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf(
-    "a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n");
-    printf("Das tut man nicht.\n");}return 0;}
-  \end{lstlisting}
-  Aus Sicht eines Menschen hingegen kann eine \emph{korrekte\/} Einrückung des Quelltextes
-  \emph{sehr\/} hilfreich dabei sein, in einem Programm die Übersicht zu behalten.
-
-  \goodbreak
-  Daher hier der dringende Rat:
-  \begin{hint}
-    Achten Sie in Ihren Programmen auf korrekte und übersichtliche Einrückung!
-  \end{hint}
-
-  \breath
-
-  Um zwei Ausdrücke auf Gleichheit zu prüfen,
-  verwendet man in C den binären Operator \lstinline{==}.
-
-  Die Anweisungen
-  \begin{lstlisting}[belowskip=0pt]
-    if (b != 0)
-      {
-        printf ("Die erste Zahl geteilt durch die zweite ergibt: ");
-        printf ("%d, Rest %d \n", a / b, a % b);
-      }
-    else
-      printf ("Bitte nicht durch 0 teilen!\n");
-  \end{lstlisting}
-  sind also äquivalent zu:
-  \begin{lstlisting}
-    if (b == 0)
-      printf ("Bitte nicht durch 0 teilen!\n");
-    else
-      {
-        printf ("Die erste Zahl geteilt durch die zweite ergibt: ");
-        printf ("%d, Rest %d \n", a / b, a % b);
-      }
-  \end{lstlisting}
-
-  Achtung: Die Anweisungen
-  \begin{lstlisting}[belowskip=0pt]
-    if (b = 0)
-      printf ("Bitte nicht durch 0 teilen!\n");
-    else
-      {
-        printf ("Die erste Zahl geteilt durch die zweite ergibt: ");
-        printf ("%d, Rest %d \n", a / b, a % b);
-      }
-  \end{lstlisting}
-  (mit \lstinline{=} anstelle von \lstinline{==}) sind ebenfalls gültiges C,
-  haben jedoch eine andere Bedeutung!
-  \goodbreak
-
-  Der Hintergrund ist der folgende:
-  Alle binären Operatoren, sei es \lstinline{+} oder \lstinline{=} oder \lstinline{==},
-  sind in C vom Prinzip her gleichwertig.
-  Alle nehmen zwei numerische Operanden entgegen und liefern einen numerischen Wert zurück.
-  Wenn wir nun beispielsweise annehmen, daß die Variable \lstinline{a} den Wert 3 hat, dann gilt:
-  \begin{center}
-    \begin{tabular}{cl}
-      \lstinline|a + 7| & ergibt \lstinline|10|. \\
-      \lstinline|a = 7| & ergibt \lstinline|7| (und weist \lstinline|a| den Wert 7 zu). \\
-      \lstinline|a == 7| & ergibt \lstinline|0|.
-    \end{tabular}
-  \end{center}
-  Das o.\,a.\ Programmfragment bedeutet demnach:
-  Weise der Variablen \lstinline{b} den Wert \lstinline{0} zu,
-  und führe anschließend \emph{immer\/} eine Division durch \lstinline{b} aus.
-  (Die \lstinline{if}-Bedingung bekommt den Wert \lstinline{0}, ist also niemals erfüllt.)
-
-  \breath
-
-  Daß es sich bei Wahrheitswerten in C tatsächlich um Integer-Werte handelt, wird auch deutlich,
-  wenn man sich diese mittels \lstinline{printf()} ausgeben läßt.
-
-  Wenn man beispielsweise in dem folgenden Programm \gitfile{hp}{script}{if-6.c}
-  den Wert \lstinline{7} für die Variable \lstinline{b} eingibt,
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int b;
-      printf ("Bitte b eingeben: ");
-      scanf ("%d", &b);
-      printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0);
-      printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0);
-      printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23);
-      return 0;
-    }
-  \end{lstlisting}
-  \goodbreak
-  lautet die Ausgabe:
-  \goodbreak
-  \begin{lstlisting}[style=terminal]
-    $ ¡./if-6¿
-    Bitte b eingeben: ¡7¿
-    Der Ausdruck b != 0 hat den Wert 1
-    Der Ausdruck b == 0 hat den Wert 0
-    Der Ausdruck b = 23 hat den Wert 23
-  \end{lstlisting}
-  In der ersten und zweiten Zeile wird geprüft, ob \lstinline{b} den Wert 0 hat,
-  und \lstinline{1} für "`ja"' bzw.\ \lstinline{0} für "`nein"' ausgegeben.
-  In der dritten Zeile wird \lstinline{b} der Wert \lstinline{23} zugewiesen
-  und anschließend der neue Wert von \lstinline{b} ausgegeben.
-
-  \subsection{Schleifen}
-
-  Mit Hilfe der \lstinline{while}-Anweisung ist es möglich,
-  Anweisungen in Abhängigkeit von einer Bedingung mehrfach auszuführen.
-
-  Das folgende Beispielprogramm \gitfile{hp}{script}{loop-1.c}
-  schreibt die Zahlen von 1 bis einschließlich 10 auf den Bildschirm:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int i = 1;
-      while (i <= 10)
-        {
-          printf ("%d\n", i);
-          i = i + 1;
-        }
-      return 0;
-    }
-  \end{lstlisting}
-  Die Auswertung der Bedingung erfolgt analog zur \lstinline{if}-Anweisung.
-  Ebenso folgt auf \lstinline{while} nur eine eine einzige Anweisung, die wiederholt ausgeführt wird;
-  mehrere Anweisungen müssen mit geschweiften Klammern zu einem Anweisungsblock zusammengefaßt werden.
-
-  Der binäre Operator \lstinline{<=} liefert 1 zurück,
-  wenn der linke Operand kleiner oder gleich dem rechten ist, ansonsten 0.
-  Entsprechend sind die Operatoren \lstinline{>=}, \lstinline{<} und \lstinline{>} definiert.
-
-\if 0
-
-  \breath
-
-  Wenn man eine Bedingung angibt, die niemals 0 wird,
-  erzeugt man eine Endlosschleife (\gitfile{hp}{script}{while-2.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int i;
-      i = 1;
-      while (1)
-        {
-          i = i + i;
-          printf ("%d\n", i);
-        }
-      return 0;
-    }
-  \end{lstlisting}
-  Das endlos laufende Programm kann nur noch über das Betriebssystem beendet werden.
-  Von der Unix-Shell aus geschieht dies durch Eingabe von \lstinline[style=cmd]{Strg+C}.
-
-  In der Ausgabe des oben dargestellten Beispielprogramms fällt auf,
-  daß die Zweierpotenzen zunächst wie erwartet anwachsen,
-  später aber nur noch der Zahlenwert 0 ausgegeben wird:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall while-2.c -o while-2¿
-    $ ¡./while-2¿
-    2
-    4
-    8
-    16
-    32
-    64
-    128
-    256
-    512
-    1024
-    2048
-    4096
-    8192
-    16384
-    32768
-    65536
-    131072
-    262144
-    524288
-    1048576
-    2097152
-    4194304
-    8388608
-    16777216
-    33554432
-    67108864
-    134217728
-    268435456
-    536870912
-    1073741824
-    -2147483648
-    0
-    0
-    0
-    ...
-  \end{lstlisting}
-  \goodbreak
-  Dies hängt mit der Art und Weise zusammen,
-  wie Zahlen in einem Computer gespeichert werden.
-  Im Detail ist dies Gegenstand der Vorlesung "`Rechnertechnik"';
-  ein paar für uns wichtige Eckdaten seien an dieser Stelle erwähnt:
-  \begin{itemize}
-    \item
-      Computer speichern Zahlen im Binärformat, das nur die Ziffern 0 und 1 kennt.\\
-      Beispielsweise lautet die Dezimalzahl 9 in Binärdarstellung 1001.
-    \item
-      Zweierpotenzen entsprechen jeweils einer 1 mit folgenden Nullen.\\
-      Die Dezimalzahlen 2, 4, 8 und 16 haben die Binärdarstellungen 10, 100, 1000 und 10000.
-    \item
-      Auf einem 32-Bit-Prozessor zeigt die zweiundreißigste Ziffer von rechts das Vorzeichen an.
-      Steht hier eine 1, ist die Zahl negativ.
-      Dies erklärt, weshalb die Verdopplung von 1073741824 (binär: eine 1 mit 30 Nullen)
-      $-$2147483648 ergibt (binär: eine 1 mit 31 Nullen).
-    \item
-      Bei einer weiteren Verdopplung würde binär eine 1 mit 32 Nullen entstehen,
-      die aber von einem 32-Bit-Prozessor nicht mehr dargestellt werden kann.
-      Ohne weitere Maßnahmen ist daher das Doppelte von $-$2147483648 auf einem 32-Bit-Prozessor
-      die Zahl 0.
-  \end{itemize}
-
-\fi
-
-  \breath
-
-  Ein wichtiger Spezialfall einer \lstinline{while}-Schleife ist die folgende Situation:
-  \begin{itemize}
-    \item
-      Vor dem Betreten der Schleife findet eine Initialisierung statt, z.\,B.\ \lstinline{i = 1}.
-    \item
-      Am Ende jedes Schleifendurchlaufs wird eine "`Schritt-Anweisung"' durchgeführt,
-      z.\,B.\ \lstinline{i = i + 1}.
-  \end{itemize}
-  Für dieses spezielle \lstinline{while} kennt C die Abkürzung \lstinline{for}:
-  \begin{center}
-    \begin{minipage}{4cm}
-      \begin{lstlisting}[gobble=8]
-        int i = 1;
-        while (i <= 10)
-          {
-            printf ("%d\n", i);
-            i = i + 1;
-          }
-      \end{lstlisting}
-    \end{minipage}%
-    \quad
-    ist genau dasselbe wie
-    \quad
-    \begin{minipage}{4.9cm}
-      \begin{lstlisting}[gobble=8]
-        int i;
-        for (i = 1; i <= 10; i = i + 1)
-          printf ("%d\n", i);
-      \end{lstlisting}
-      \quad oder
-      \begin{lstlisting}[gobble=8]
-        for (int i = 1; i <= 10; i = i + 1)
-          printf ("%d\n", i);
-      \end{lstlisting}
-      \bigskip
-      \quad(Datei: \gitfile{hp}{script}{loop-2.c})
-    \end{minipage}
-  \end{center}
-
-  Achtung: Zwischen den Klammern nach \lstinline{for} stehen zwei Semikolons, keine Kommata.
-
-  \begin{hint}
-    Die Schreibweise mit der Deklaration \lstinline{int i = 1}
-    \emph{innerhalb\/} der \lstinline{for}-Schleife
-    ist erst ab dem C-Standard C99 zulässig.
-    Beim Compilieren mit älteren Versionen des \lstinline[style=cmd]{gcc}
-    muß daher zusätzlich die Option \lstinline[style=cmd]{-std=c99} angegeben werden.
-  \end{hint}
-
-  \breath
-
-  Als eine weitere Schleife kennt C die \lstinline{do}-\lstinline{while}-Schleife:
-  \begin{lstlisting}
-    i = 1;
-    do
-      {
-        printf ("%d\n", i);
-        i = i + 1;
-      }
-    while (i <= 10)
-  \end{lstlisting}
-  Der Unterschied zur "`normalen"' \lstinline{while}-Schleife besteht darin,
-  daß eine \lstinline{do}-\lstinline{while}-Schleife mindestens einmal ausgeführt wird,
-  weil die Bedingung nicht bereits am Anfang, sondern erst am Ende des Schleifendurchlaufs geprüft wird.
-
-  \bigbreak
-
-  Zwischen einer "`normalen"' \lstinline{while}-Schleife
-  und einer \lstinline{for}-Schleife besteht hingegen \emph{kein\/} Unterschied.
-  Insbesondere ist eine Schreibweise wie
-  \begin{lstlisting}
-    for (i = 1; 10; i + 1)
-      printf ("%d\n", i);
-  \end{lstlisting}
-  \vspace{-\smallskipamount}
-  zwar zulässiges C, aber nicht sinnvoll (Datei: \gitfile{hp}{script}{loop-3.c}).
-  Dies kann man sofort erkennen, indem man die \lstinline{for}-Schleife
-  in eine \lstinline{while}-Schleife übersetzt:
-  \begin{lstlisting}
-    i = 1; 
-    while (10)
-      {
-        printf ("%d\n", i);
-        i + 1;
-      }
-  \end{lstlisting}
-  Dieses Programmfragment setzt einmalig \lstinline{i} auf den Wert 1
-  und springt danach in eine Endlosschleife zur Ausgabe von \lstinline{i}.
-  (Die \lstinline{while}-Bedingung \lstinline{10} ist ungleich Null, hat also stets den Wahrheitswert "`wahr"'.)
-  Am Ende jedes Schleifendurchlaufs wird \lstinline{i + 1} berechnet;
-  der berechnete Wert wird jedoch nirgendwo verwendet, sondern schlichtweg verworfen.
-  Insbesondere ändert \lstinline{i} seinen Wert nicht.
-
-  \subsection{Seiteneffekte\label{Seiteneffekte}}
-
-  Das Verwerfen berechneter Werte verdient eine nähere Betrachtung
-  -- insbesondere in der Programmiersprache C.
-  Wie das Beispielprogramm \gitfile{hp}{script}{statements-1.c} illustriert,
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      2 + 2;
-      return 0;
-    }
-  \end{lstlisting}
-  ist es anscheinend zulässig, Werte als Anweisung zu verwenden.
-
-  Grundsätzlich gilt in C:
-  Man kann jeden gültigen Ausdruck als Anweisung verwenden.
-  Der Wert des Ausdrucks wird dabei ignoriert.
-
-  Die Bedeutung der (gültigen!) C-Anweisung \lstinline{2 + 2;} lautet somit:
-  "`Berechne den Wert \lstinline{2 + 2} und vergiß ihn wieder."'
-
-  Tatsächlich gilt dasselbe auch für \lstinline{printf()}:
-  Die Funktion \lstinline{printf()} liefert eine ganze Zahl zurück.
-  Der \lstinline{printf()}-Aufruf ist somit ein Ausdruck,
-  dessen Wert ignoriert wird.
-
-  "`Nebenbei"' hat \lstinline{printf()} aber noch eine weitere Bedeutung,
-  nämlich die Ausgabe des Textes auf dem Standardausgabegerät (Bildschirm).
-  Diese weitere Bedeutung heißt \newterm{Seiteneffekt\/} des Ausdrucks.
-
-  Das Beispielprogramm \gitfile{hp}{script}{statements-2.c}
-  gibt den vom ersten \lstinline{printf()} zurückgegebenen Wert
-  mit Hilfe eines zweiten \lstinline{printf()} aus:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int x;
-      x = printf ("%d\n", 2 + 2);
-      printf ("%d\n", x);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe lautet:
-  \begin{lstlisting}[style=terminal]
-    4
-    2
-  \end{lstlisting}
-  Bei dem von \lstinline{printf()} zurückgegebenen Wert handelt es sich um die Anzahl der geschriebenen Zeichen.
-  In diesem Fall ist sind es zwei Zeichen, nämlich die Ziffer \lstinline{4}
-  sowie das Zeilenendesymbol, im Programm als \lstinline{\n} notiert.
-
-  \breath
-
-  Auch Operatoren können in C Seiteneffekte haben.
-
-  \begin{itemize}
-    \item
-      Der binäre Operator \lstinline{=} (Zuweisung)
-      hat als Seiteneffekt die Zuweisung des zweiten Operanden an den ersten Operanden
-      und als Rückgabewert den zugewiesenen Wert.
-    \item
-      Ähnlich funktionieren die binären Operatoren \lstinline{+= -= *= /* %=}.
-      Sie wenden die vor dem \lstinline{=} stehende Rechenoperation auf die beiden Operatoren an,
-      weisen als Seiteneffekt das Ergebnis dem ersten Operanden zu
-      und geben das Rechenergebnis als Wert zurück.
-    \item
-      Die binären Rechnoperatoren \lstinline{+ - * / %}
-      und Vergleichsoperatoren \lstinline{== != < > <= >=}
-      haben \emph{keinen\/} Seiteneffekt.
-    \item
-      Der unäre Rechenoperator \lstinline{-} (arithmetische Negation, Vorzeichen)
-      hat ebenfalls \emph{keinen\/} Seiteneffekt.
-    \item
-      Ein weiterer unärer Operator \emph{ohne\/} Seiteneffekt ist die logische Negation,\\
-      in C ausgedrückt durch ein Ausrufezeichen: \lstinline{!}\\
-      \lstinline{!a} ist 1, wenn \lstinline{a} den Wert 0 hat; ansonsten ist es 0.\\
-      \lstinline{!(a < b)} ist demzufolge dasselbe wie \lstinline{a >= b}.
-    \item
-      Der Funktionsaufruf \lstinline{()} (Klammerpaar) ist in C ebenfalls ein unärer Operator.
-      Er liefert einen Wert zurück (Rückgabewert der Funktion)
-      und hat einen Seiteneffekt (Aufruf der Funktion).
-    \item
-      Die unären Operatoren \lstinline{++} und \lstinline{--} haben den Seiteneffekt,
-      daß sie die Variable, vor oder hinter der sie stehen, um 1 erhöhen (\lstinline{++})
-      bzw.\ vermindern (\lstinline{--}).
-      Wenn der Operator \emph{vor\/} der Variablen steht (\lstinline{++a}),
-      ist der Rückgabewert der um 1 erhöhte/verminderte Wert der Variablen.
-      Wenn er hingegen \emph{hinter\/} der Variablen steht (\lstinline{a++}),
-      ist der Rückgabewert der ursprüngliche Wert der Variablen;
-      das Erhöhen/Vermindern findet in diesem Fall erst danach statt.
-      
-      \begin{experts}
-        Da die Reihenfolge, in der ein Ausdruck ausgewertet wird, nicht immer festliegt,
-        sollte man darauf achten, daß die Seiteneffekte eines Ausdruck dessen Wert nicht beeinflussen.
-        (\lstinline[style=cmd]{gcc} warnt in derartigen Fällen.)
-      \end{experts}
-
-    \begin{experts}
-      \item
-        Ein weiterer binärer Operator \emph{ohne\/} Seiteneffekt ist das Komma.
-        Der Ausdruck \lstinline{a, b} bedeutet:
-        "`Berechne \lstinline{a}, vergiß es wieder, und gib stattdessen \lstinline{b} zurück."'
-        Dies ist nur dann sinnvoll, wenn der Ausdruck \lstinline{a} einen Seiteneffekt hat.
-    \end{experts}
-  \end{itemize}
-
-  Die folgenden vier Programmfragmente sind verschiedene Schreibweisen für genau denselben Code.
-  \begin{lstlisting}
-    int i;
-
-    i = 0;
-    while (i < 10)
-      {
-        printf ("%d\n", i);
-        i += 1;
-      }
-
-    for (i = 0; i < 10; i++)
-      printf ("%d\n", i);
-
-    i = 0;
-    while (i < 10)
-      printf ("%d\n", i++);
-
-    for (i = 0; i < 10; printf ("%d\n", i++));
-  \end{lstlisting}
-  Sie bewirken nicht nur dasselbe (Ausgabe der Zahlen von 0 bis 9),
-  sondern stehen tatsächlich für \emph{genau dasselbe Programm}.
-  Sie laufen genau gleich schnell und unterscheiden sich nur hinsichtlich ihrer Lesbarkeit,
-  wobei es vom persönlichen Geschmack abhängt, welche Variante man jeweils als lesbarer empfindet.
-  \begin{hint}
-    Schreiben Sie Ihre Programme stets so lesbar wie möglich.\\
-    Platzsparende Schreibweise macht ein Programm nicht schneller.
-  \end{hint}
-
-  \subsection{Strukturierte Programmierung}
-
-  Bei den bisher vorgestellten Verzweigungen und Schleifen
-  ist die Reihenfolge, in der die Befehle abgearbeitet werden, klar erkennbar.
-  Darüberhinaus kennt C auch Anweisungen,
-  die einen Sprung des Programms bewirken, der diese Struktur durchbricht:
-  \begin{itemize}
-    \item
-      Mit der \lstinline{break}-Anweisung kann das Programm
-      die nächst"-äußere \lstinline{while}- oder \lstinline{for}-Schleife
-      unmittelbar verlassen.
-
-      Das folgende Beispielprogramm zählt von 0 bis 9,
-      indem es eine Endlosschleife beim Erreichen von 10
-      mittels \lstinline{break} unterbricht.
-      Der Schleifenzäher \lstinline{i} wird innerhalb des \lstinline{printf()}
-      "`nebenbei"' inkrementiert.
-      \begin{lstlisting}[gobble=8]
-        int i = 0;
-        while (1)
-          {
-            if (i >= 10)
-              break;
-            printf ("%d\n", i++);
-          }
-      \end{lstlisting}
-      Eine übersichtlichere Schreibweise derselben Schleife lautet:
-      \begin{lstlisting}[gobble=8]
-        for (int i = 0; i < 10; i++)
-          printf ("%d\n", i++);
-      \end{lstlisting}
-      (Der erzeugte Code ist in beiden Fällen genau derselbe.)
-    \item
-      Mit der \lstinline{continue}-Anweisung springt ein Programm
-      unmittelbar in den nächsten Durchlauf der nächst"-äußeren Schleife.
-    \item
-      Mit der \lstinline{return}-Anweisung kann man eine Funktion
-      (siehe Abschnitt~\ref{Funktionen}) ohne Umweg direkt verlassen.
-    \item
-      Mit der \lstinline{goto}-Anweisung springt ein Programm
-      direkt an einen \newterm{Label}.
-      Dieser besteht aus einem Namen, gefolgt von einem Doppelpunkt.
-      \begin{lstlisting}[gobble=8]
-          int i = 0;
-        loop:
-          if (i >= 10)
-            goto endloop;
-          printf ("%d\n", i++);
-          goto loop;
-        endloop:
-      \end{lstlisting}
-  \end{itemize}
-
-  Ein Programmquelltext sollte immer so gestaltet werden,
-  daß er den Ablauf des Programms unmittelbar ersichtlich macht.
-  Ein vorzeitiges \lstinline{return} stellt einen "`Hinterausgang"'
-  einer Funktion dar und sollte mit Bedacht eingesetzt werden.
-
-  Ähnliches gilt in noch stärkerem Maße für \lstinline{break} und \lstinline{continue}
-  als "`Hinterausgänge"' von Schleifen.
-  Diese sind sicherlich bequeme Möglichkeiten, zusätzliche \lstinline{if}s
-  und zusätzliche Wahrheitswert-Variable zu vermeiden,
-  verschleiern aber langfristig den Ablauf der Befehle.
-  Statt eine Schleife mit \lstinline{break} zu verlassen
-  oder Teile des Schleifeninneren mit \lstinline{continue} zu überspringen,
-  ist es besser, die Schleifenbedingung
-  und \lstinline{if}-Anweisungen innerhalb der Schleife so zu formulieren,
-  daß Sie kein \lstinline{break} oder \lstinline{continue} mehr benötigen.
-  Dadurch versteht man auch selbst besser, was das Programm eigentlich tut.
-  Das Programm wird übersichtlicher und oft sogar kürzer.
-
-  In besonderem Maße gilt dies für die \lstinline{goto}-Anweisung.
-  Hier ist nicht erkennbar, ob der Sprung nach oben geht (Schleife) oder nach unten (Verzweigung).
-  Verschachtelungen von Blöcken und \lstinline{goto}-Sprüngen
-  bereiten dem Compiler zusätzliche Arbeit und stehen somit der Optimierung entgegen.
-  (Es stimmt insbesondere nicht, daß Konstruktionen mit \lstinline{goto}
-  schneller abgearbeitet würden als Konstruktionen mit \lstinline{if} und \lstinline{while}.)
-  Es ist daher besser, \lstinline{goto} nicht zu verwenden
-  und stattdessen den Programmablauf mit Hilfe von Verzweigungen und Schleifen
-  zu strukturieren.
-  (Siehe auch: \url{http://xkcd.com/292/})
-
-  Zusammengefaßt:
-  \begin{hint}
-    Verwenden Sie vorzeitiges \lstinline{return} mit Bedacht.
-
-    Vermeiden Sie die Verwendung von \lstinline{break} und \lstinline{continue}.
-    
-    Verwenden Sie kein \lstinline{goto}.
-  \end{hint}
-
-  \subsection{Funktionen\label{Funktionen}}
-
-  Eine Funktionsdeklaration hat in C die Gestalt:
-  \begin{quote}
-    Typ Name ( Parameterliste )\\
-    \{\\
-    \strut\quad Anweisungen\\
-    \}
-  \end{quote}
-
-  Beispielprogramm: \gitfile{hp}{script}{functions-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void foo (int a, int b)
-    {
-      printf ("foo(): a = %d, b = %d\n", a, b);
-    }
-
-    int main (void)
-    {
-      foo (3, 7);
-      return 0;
-    }
-  \end{lstlisting}
-  (Das Wort "`foo"' ist eine sog.\ \newterm{metasyntaktische Variable} --
-  ein Wort, das absichtlich nichts bedeutet und für einen beliebig austauschbaren Namen steht.)
-
-  Mit dem Funktionsaufruf \lstinline{foo (3, 7)} stellt das Hauptprogramm der Funktion \lstinline{foo()}
-  die Parameterwerte 3 für \lstinline{a} und 7 für \lstinline{b} zur Verfügung.
-
-  Der Rückgabewert der Funktion \lstinline{foo()} ist vom Typ \lstinline{void}.
-  Im Gegensatz zu Datentypen wie z.\,B.\ \lstinline{int}, das für ganze Zahlen steht,
-  steht \lstinline{void} für "`nichts"'.
-
-  Von Ausdrücken zurückgegebene \lstinline{void}-Werte \emph{müssen\/} ignoriert werden.
-  (Von Ausdrücken zurückgegebene Werte anderer Typen \emph{dürfen\/} ignoriert werden.)
-  
-  \breath
-
-  Das Hauptprogramm ist in C eine ganz normale Funktion.
-  Dadurch, daß sie den Namen \lstinline{main} hat,
-  weiß das Betriebssystem, daß es sie bei Programmbeginn aufrufen soll.
-  \lstinline{main()} kann dann seinerseits weitere Funktionen aufrufen.
-
-  Über seinen Rückgabewert (vom Typ \lstinline{int}) teilt \lstinline{main()} dem Betriebssystem mit,
-  ob das Programm erfolgreich beendet werden konnte.
-  Der Rückgabewert 0 steht für "`Erfolg"'; andere Werte stehen für verschiedenartige Fehler.
-  
-  \breath
-
-  Je nachdem, wo und wie Variable deklariert werden,
-  sind sie von verschiedenen Stellen im Programm aus zugänglich
-  und/oder verhalten sich unterschiedlich.
-
-  Beispielprogramm: \gitfile{hp}{script}{functions-2.c}
-  \begin{lstlisting}[style=numbered]
-    #include <stdio.h>
-
-    int a, b = 3;
-
-    void foo (void)
-    {
-      b++;
-      static int a = 5;
-      int b = 7;
-      printf ("foo(): a = %d, b = %d\n", a, b);
-      a++;
-      b++;
-    }
-
-    int main (void)
-    {
-      printf ("main(): a = %d, b = %d\n", a, b);
-      foo ();
-      printf ("main(): a = %d, b = %d\n", a, b);
-      a = b = 12;
-      printf ("main(): a = %d, b = %d\n", a, b);
-      foo ();
-      printf ("main(): a = %d, b = %d\n", a, b);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Ausgabe dieses Programms lautet:
-  \begin{lstlisting}[style=terminal]
-    main(): a = 0, b = 3
-    foo(): a = 5, b = 7
-    main(): a = 0, b = 4
-    main(): a = 12, b = 12
-    foo(): a = 6, b = 7
-    main(): a = 12, b = 13
-  \end{lstlisting}
-  Erklärung:
-  \begin{itemize}
-    \item
-      Der erste Aufruf der Funktion \lstinline{printf()} in Zeile 17 des Programms
-      gibt die Werte der in Zeile 3 deklarierten Variablen aus.
-      Diese lauten 0 für \lstinline{a} und 3 für \lstinline{b}.
-
-      Weil es sich um sog.\ \newterm{globale Variable\/} handelt
-      (Die Deklaration steht außerhalb jeder Funktion.),
-      werden diese Variablen \emph{bei Programmbeginn\/} initialisiert.
-      Für \lstinline{b} steht der Wert 3 für die Initialisierung innerhalb der Deklaration;
-      für \lstinline{a} gilt der implizite Wert 0.
-    \item
-      Der zweite Aufruf von \lstinline{printf()} erfolgt indirekt über die Funktion \lstinline{foo()},
-      die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 18).
-
-      Oberhalb des \lstinline{printf()} (Zeile 10) befinden sich neue Deklarationen für Variable,
-      die ebenfalls \lstinline{a} (Zeile 8) und \lstinline{b} heißen (Zeile 9).
-      Diese sog.\ \newterm{lokalen Variablen\/} werden auf neue Werte initialisiert,
-      die korrekt ausgegeben werden.
-
-      Ab den Zeilen 8 und 9 bis zum Ende der Funktion \lstinline{foo()}
-      sind die in Zeile 3 deklarierten globalen Variablen \lstinline{a} und \lstinline{b}
-      nicht mehr zugreifbar.
-    \item
-      Der dritte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 19).
-
-      \lstinline{a} hat immer noch den Wert 0,
-      weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde,
-      die ebenfalls \lstinline{a} heißt, nämlich die lokale Variable, die in Zeile 8 deklariert wurde.
-
-      Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12.
-      In Zeile 7 jedoch greift die Funktion \lstinline{foo()}
-      auf die in Zeile 3 deklarierte globale Variable \lstinline{b} zu,
-      die dadurch den Wert 4 (statt vorher: 3) erhält.
-    \item
-      In Zeile 20 weist das Hauptprogramm beiden in Zeile 3 deklarierten Variablen den Wert 12 zu.
-
-      Genauer: Es weist der Variablen \lstinline{a} den Wert \lstinline{b = 12} zu.
-      Bei \lstinline{b = 12} handelt es sich um einen Ausdruck mit Seiteneffekt,
-      nämlich die Zuweisung des Wertes 12 an die Variable \lstinline{b}.
-      Der Wert des Zuweisungsausdrucks ist ebenfalls 12.
-    \item
-      Der vierte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 21)
-      und gibt erwartungsgemäß zweimal den Wert 12 aus.
-    \item
-      Der fünfte Aufruf von \lstinline{printf()} erfolgt wieder indirekt über die Funktion \lstinline{foo()},
-      die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 22).
-
-      Die Funktion \lstinline{foo()} gibt wiederum die Werte
-      der in den Zeilen 8 und 9 deklarierten Variablen aus.
-
-      Bei \lstinline{b} (Zeile 9) handelt es sich um eine \newterm{automatische Variable}.
-      Diese ist nur innerhalb des umgebenden Blockes -- hier der Funktion \lstinline{foo()} -- bekannt.
-      Sie wird beim Aufruf der Funktion initialisiert und hat daher in Zeile 10 stets den Wert 7,
-      den sie in Zeile 9 bekommen hat.
-
-      Die Variable \lstinline{a} (Zeile 8) ist hingegen als \newterm{statisch\/}
-      (engl.\ \lstinline{static}) deklariert.
-      Sie behält ihren Wert zwischen zwei Aufrufen von \lstinline{foo()},
-      wird nur zu Programmbeginn initialisiert
-      und ist von außerhalb der Funktion nicht veränderbar.
-
-      \begin{experts}
-        Ausnahme: Wenn einer anderen Funktion die Adresse der \lstinline{static}-Variablen bekannt ist,
-        kann diese die Variable über einen Zeiger verändern -- Siehe Abschnitt~\ref{Zeiger}.
-      \end{experts}
-
-      Da der Anfangswert 5 der Variablen \lstinline{a} bereits einmal erhöht wurde (Zeile 11),
-      wird der Wert 6 ausgegeben.
-      (Die Zuweisung des Wertes 12 im Hauptprogramm bezog sich auf ein anderes \lstinline{a},
-      nämlich das in Zeile 3 deklarierte.)
-    \item
-      Der letzte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 23).
-
-      \lstinline{a} hat immer noch den Wert 12,
-      weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde,
-      die ebenfalls \lstinline{a} heißt, nämlich die, die in Zeile 8 deklariert wurde.
-
-      Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12.
-      In Zeile 7 jedoch greift die Funktion \lstinline{foo()}
-      auf die in Zeile 3 deklarierte Variable \lstinline{b} zu,
-      die dadurch den Wert 13 (statt vorher: 12) erhält.
-  \end{itemize}
-
-  \subsection{Zeiger\label{Zeiger}}
-
-  In C können an Funktionen grundsätzlich nur Werte übergeben werden.
-  Vom Funktionsrückgabewert abgesehen, hat eine C-Funktion keine Möglichkeit,
-  dem Aufrufer Werte zurückzugeben.
-
-  Es ist dennoch möglich, eine C-Funktion aufzurufen,
-  um eine Variable (oder mehrere) auf einen Wert zu setzen.
-  Hierfür übergibt man der Funktion die \newterm{Speicheradresse\/} der Variablen als Wert.
-  Der Wert ist ein \newterm{Zeiger\/} auf die Variable.
-
-  Wenn einem Zeiger der unäre Operator \lstinline{*} vorangestellt wird,
-  ist der resultierende Ausdruck diejenige Variable, auf die der Zeiger zeigt.
-  In Deklarationen wird dasselbe Symbol dem Namen vorangestellt,
-  um anstelle einer Variablen des genannten Typs
-  eine Variable vom Typ "`Zeiger auf Variable des genannten Typs"' zu deklarieren.
-  (Das \lstinline{*}-Symbol wirkt jeweils nur auf den unmittelbar folgenden Bezeichner.)
-
-  Umgekehrt wird der unäre Operator \lstinline{&} einer Variablen vorangestellt,
-  um einen Ausdruck vom Typ "`Zeiger auf Variable dieses Typs"'
-  mit dem Wert "`Speicheradresse dieser Variablen"' zu erhalten.
-
-  \goodbreak
-  Beispielprogramm: \gitfile{hp}{script}{pointers-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    void calc_answer (int *a)
-    {
-      *a = 42;
-    }
-
-    int main (void)
-    {
-      int answer;
-      calc_answer (&answer);
-      printf ("The answer is %d.\n", answer);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Funktion \lstinline{calc_answer()} läßt sich vom Hauptprogramm einen Zeiger \lstinline{a}
-  auf die lokale Variable \lstinline{answer} des Hauptprogramms übergeben.
-  (Aus Sicht des Hauptprogramms ist dieser Zeiger die Adresse \lstinline{&answer}
-  der lokalen Variablen \lstinline{answer}.)
-  Sie schreibt einen Wert in die Variable \lstinline{*a}, auf die der Zeiger \lstinline{a} zeigt.
-  Das Hauptprogramm kann diesen Wert anschließend seiner Variablen \lstinline{answer} entnehmen
-  und mit \lstinline{printf()} ausgeben.
-
-  Vergißt man beim Aufruf den Adreßoperator \lstinline{&},
-  übergibt man den aktuellen Wert der Variablen (hier: eine Zahl)
-  anstelle eines Zeigers (und erhält eine Warnung durch den Compiler).
-  Dieser Wert wird als eine Speicheradresse interpretiert.
-  Diese befindet sich in der Regel außerhalb des Bereichs,
-  den das Betriebssystem dem Programm zugewiesen hat.
-  Ein Versuch der Funktion, auf diese Speicheradresse zuzugreifen,
-  führt dann zum Absturz des Programms (Speicherschutzverletzung).
-
-  \subsection{Arrays und Strings\label{Strings}}
-
-  \subsubsection{Arrays}
-
-  In C ist es möglich, mit einem Zeiger Arithmetik zu betreiben,
-  so daß er nicht mehr auf die ursprüngliche Variable zeigt,
-  sondern auf ihren Nachbarn im Speicher.
-
-  Solche Nachbarn gibt es dann,
-  wenn mehrere Variable gleichen Typs gemeinsam angelegt werden.
-  Eine derartige Ansammlung von Variablen gleichen Typs heißt \newterm{Array\/} (Feldvariable, Vektor).
-
-  Beispielprogramm: \gitfile{hp}{script}{arrays-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int prime[5] = { 2, 3, 5, 7, 11 };
-      int *p = prime;
-      int i;
-      for (i = 0; i < 5; i++)
-        printf ("%d\n", *(p + i));
-      return 0;
-    }
-  \end{lstlisting}
-
-  Die initialisierte Variable \lstinline{prime} ist ein Array von fünf ganzen Zahlen.
-  Der Bezeichner \lstinline{prime} des Arrays wird als Zeiger auf eine \lstinline{int}-Variable verwendet.
-  In diesem Sinne sind Arrays und Zeiger in C dasselbe.
-
-  \lstinline{p + i} ist ein Zeiger auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}.
-  Durch Dereferenzieren \lstinline{*(p + i)} erhalten wir
-  den \lstinline{i}-ten Nachbarn von \lstinline{*p} selbst.
-
-  Da diese Kombination -- Zeigerarithmetik mit anschließendem Dereferenzieren --
-  sehr häufig auftritt, stellt C für die Konstruktion \lstinline{*(p + i)}
-  die Abkürzung \lstinline{p[i]} zur Verfügung.
-
-  Die von anderen Sprachen her bekannte Schreibweise \lstinline{p[i]}
-  für das \lstinline{i}-te Element eines Arrays \lstinline{p}
-  ist also in C lediglich eine Abkürzung für \lstinline{*(p + i)},
-  wobei man \lstinline{p} gleichermaßen als Array wie als Zeiger auffassen kann.
-  
-  Wenn wir uns dieser Schreibweise bedienen
-  und anstelle des Zeigers \lstinline{p}, der durchgehend den Wert \lstinline{prime} hat,
-  direkt \lstinline{prime} verwenden,
-  erhalten wir das Beispielprogramm \gitfile{hp}{script}{arrays-2.c}:
-  \goodbreak
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      int prime[5] = { 2, 3, 5, 7, 11 };
-      int *p = prime;
-      int i;
-      for (i = 0; i < 5; i++)
-        printf ("%d\n", p[i]);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Achtung: C prüft \emph{nicht}, ob der Array-Index
-  innerhalb des zulässigen Bereichs liegt,
-  ob also der durch Addition des Index auf die Array-Adresse erhaltene Zeiger
-  noch auf eine Adresse innerhalb des Arrays zeigt.
-
-  Übergelaufene Indizes führen nicht immer sofort zum Absturz des Programms,
-  sondern können z.\,B.\ andere Variablen des Programms überschreiben.
-  Da derartige Fehler äußerst schwer zu entdecken sind,
-  lohnt es sich, Array-Indices vor ihrer Verwendung
-  mit Hilfe von \lstinline{if}-Anweisungen "`von Hand"' zu prüfen.
-
-  \subsubsection{Strings}
-
-  Ein wichtiger Spezialfall ist ein Array, dessen Komponenten den Datentyp \lstinline{char} haben.
-  In C ist \lstinline{char} wie \lstinline{int} eine ganze Zahl;
-  der einzige Unterschied besteht darin, daß der Wertebereich von \lstinline{char} daran angepaßt ist,
-  ein Zeichen (Buchstabe, Ziffer, Satz- oder Sonderzeichen, engl.\ character) aufzunehmen.
-  Ein typischer Wertebereich für den Datentyp \lstinline{char} ist von $-$128 bis 127.
-
-  Ein Initialisierer für ein Array von \lstinline{char}-Variablen kann direkt als Folge von Zeichen
-  (Zeichenkette, engl.\ \newterm{String\/}) mit doppelten Anführungszeichen geschrieben werden.
-  Jedes Zeichen initialisiert eine ganzzahlige Variable mit seinem ASCII-Wert.
-  An das Ende eines in dieser Weise notierten Array-Initialisierers
-  fügt der Compiler implizit einen Ganzzahl-Initialisierer für den Zahlenwert 0 an.
-  Der Array-Initialisierer \lstinline{"Hello"} ist also gleichbedeutend mit
-  \lstinline|{ 72, 101, 108, 108, 111, 0 }|.
-  (Die 72 steht für ein großes H, die 111 für ein kleines o. Man beachte die abschließende 0 am Ende!)
-
-  Ein String in C ist also ein Array von \lstinline{char}s,
-  also ein Zeiger auf \lstinline{char}s,
-  also ein Zeiger auf ganze Zahlen, deren Wertebereich daran angepaßt ist, Zeichen aufzunehmen.
-
-  Wenn bei der Deklaration eines Arrays die Länge aus dem Initialisierer hervorgeht,
-  braucht diese nicht ausdrücklich angegeben zu werden.
-  In diesem Fall folgt auf den Bezeichner nur das Paar eckiger Klammern und der Initialisierer.
-
-  Das Beispielprogramm \gitfile{hp}{script}{strings-1.c} zeigt,
-  wie das Array durchlaufen werden kann, bis die Zahl 0 gefunden wird:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char hello_world[] = "Hello, world!\n";
-      int i = 0;
-      while (hello_world[i] != 0)
-        printf ("%d", hello_world[i++]);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Durch die Formatangabe \lstinline{%d} wird jedes Zeichen -- korrektermaßen -- als Dezimalzahl ausgegeben.
-  Wenn wir stattdessen die Formatangabe \lstinline{%c} verwenden (für \emph{character\/}),
-  wird für jedes Zeichen -- ebenso korrektermaßen -- sein Zeichenwert (Buchstabe, Ziffer, \dots) ausgegeben
-  (Datei: \gitfile{hp}{script}{strings-2.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char hello_world[] = "Hello, world!\n";
-      int i = 0;
-      while (hello_world[i] != 0)
-        printf ("%c", hello_world[i++]);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Durch Verwendung von Pointer-Arithmetik
-  und Weglassen der überflüssigen Abfrage \lstinline{!= 0}
-  erhalten wir das äquivalente Beispielprogramm \gitfile{hp}{script}{strings-3.c}:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char hello_world[] = "Hello, world!\n";
-      char *p = hello_world;
-      while (*p)
-        printf ("%c", *p++);
-      return 0;
-    }
-  \end{lstlisting}
-  Dieses ist die in C übliche Art, eine Schleife zu schreiben,
-  die nacheinander alle Zeichen in einem String bearbeitet.
-
-  \breath
-
-  Eine weitere Formatangabe \lstinline{%s} dient in \lstinline{printf()} dazu,
-  direkt einen kompletten String bis ausschließlich der abschließenden 0 auszugeben.
-
-  Beispielprogramm: \gitfile{hp}{script}{strings-4.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      char *p = "Hello, world!";
-      printf ("%s\n", p);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Anstatt als Array, das dann einem Zeiger zugewiesen wird,
-  deklarieren wir die Variable \lstinline{hello_world} direkt als Zeiger.
-  Dies ist die in C übliche Art, mit String-Konstanten umzugehen.
-
-  Allein die Formatspezifikation entscheidet darüber,
-  wie die Parameter von \lstinline{printf()} bei der Ausgabe dargestellt werden:
-  \begin{quote}
-    \begin{tabular}{cl}
-      \lstinline|%d| & Der Parameter wird als Zahlenwert interpretiert und dezimal ausgegeben. \\
-      \lstinline|%x| & Der Parameter wird als Zahlenwert interpretiert und hexadezimal ausgegegeben.\\
-      \lstinline|%c| & Der Parameter wird als Zahlenwert interpretiert und als Zeichen ausgegeben.\\
-      \lstinline|%s| & Der Parameter wird als Zeiger interpretiert und als Zeichenfolge ausgegeben.
-    \end{tabular}
-  \end{quote}
-
-  \subsection{String-Operationen}
-
-  Mit \lstinline{#include <string.h>} steht uns eine Sammlung von Funktionen
-  zur Bearbeitung von Strings (= Array von \lstinline{char}-Variablen
-  $\approx$ Zeiger auf \lstinline{char}-Variable) zur Verfügung:
-
-  \begin{itemize}
-    \item[\textbf{;\,)}]
-      \lstinline{+}-Operationen
-
-      Durch Addieren einer ganzen Zahl auf die Startadresse des Strings
-      entsteht ein Zeiger auf einen neuen String,
-      der erst ein paar Zeichen später beginnt.
-      Auf diese Weise kann man in C ganz ohne Benutzung einer Bibliothek
-      den Anfang eines Strings abschneiden.
-
-      \begin{lstlisting}[gobble=8]
-        char hello[] = "Hello, world!\n";
-        printf ("%s\n", hello + 7);
-      \end{lstlisting}
-
-      \textbf{Achtung:} Es findet keinerlei Prüfung statt,
-      ob der Zeiger nach der Addition
-      noch auf einen Bereich innerhalb des Strings zeigt.
-      Wenn man auf diese Weise über den String hinausliest,
-      führt dies zu unsinnigen Ergebnissen
-      bis hin zu einem Absturz (Speicherzugriffsfehler).
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c}
-
-    \item[\textbf{;\,)}]
-      Null-Zeichen in den String schreiben
-
-      Durch das Schreiben eines Null-Symbols (Zahlenwert 0) in den String
-      kann man diesen ganz ohne Benutzung einer Bibliothek
-      an dieser Stelle abschneiden.
-
-      \begin{lstlisting}[gobble=8]
-        char hello[] = "Hello, world!\n";
-        hello[5] = 0;
-        printf ("%s\n", hello);
-      \end{lstlisting}
-
-      \textbf{Achtung:} Es findet keinerlei Prüfung statt,
-      ob der Schreibvorgang noch innerhalb des Strings stattfindet.
-      Wenn man auf diese Weise über den String hinauschreibt,
-      werden andere Variable überschrieben,
-      was in der Regel zu einem Absturz führt (Speicherzugriffsfehler).
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c}
-
-    \item
-      \lstinline{strlen()} -- Ermitteln der Länge eines Strings
-
-      Das abschließende Null-Symbol wird für die Länge \emph{nicht\/} mitgezählt,
-      es verbraucht aber natürlich dennoch Speicherplatz.
-
-      \begin{lstlisting}[gobble=8]
-        char hello[] = "Hello, world!\n";
-        printf ("%s\n", strlen (hello));
-      \end{lstlisting}
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c}
-
-    \item
-      \lstinline{strcmp()} -- Strings vergleichen
-
-      Wenn der erste String-Parameter alphabetisch vor dem zweiten liegt,
-      gibt \lstinline{strcmp()} den Wert \lstinline{-1} zurück,
-      wenn es umgekehrt ist, den Wert \lstinline{1},
-      wenn die Strings gleich sind, den Wert \lstinline{0}.
-
-      \begin{lstlisting}[gobble=8]
-        char *anton = "Anton";
-        char *zacharias = "Zacharias";
-
-        printf ("%d\n", strcmp (anton, zacharias));
-        printf ("%d\n", strcmp (zacharias, anton));
-        printf ("%d\n", strcmp (anton, anton));
-      \end{lstlisting}
-      
-      Der Vergleich erfolgt im Sinne des verwendeten Zeichensatzes,
-      normalerweise ASCII. Dabei kommen z.\,B.\ Großbuchstaben grundsätzlich
-      \emph{vor\/} den Kleinbuchstaben.
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-15.c}
-
-    \item
-      \lstinline{strcat()} -- String an anderen String anhängen
-
-      Die Funktion \lstinline{strcat()} hängt den zweiten String
-      an den ersten an.
-
-      \begin{lstlisting}[gobble=8]
-        char *anton = "Anton";
-        char buffer[100] = "Huber ";
-        strcat (buffer, anton);
-        printf ("%s\n", buffer);
-      \end{lstlisting}
-
-      \textbf{Achtung:} Es findet keinerlei Prüfung statt,
-      ob der resultierende String noch in den für den ersten Strng reservierten
-      Speicherbereich (Puffer) hineinpaßt.
-      Wenn man auf diese Weise über den String hinauschreibt,
-      werden andere Variable überschrieben,
-      was in der Regel zu einem Absturz führt (Speicherzugriffsfehler).
-      
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-15.c}
-
-    \item
-      \lstinline{sprintf()} -- in String schreiben
-
-      \lstinline{sprintf()} funktioniert ähnlich wie \lstinline{printf()},
-      schreibt aber nicht zur Standardausgabe (Bildschirm),
-      sondern in einen String hinein, den man als ersten Parameter übergibt.
-
-      \begin{lstlisting}[gobble=8]
-        char buffer[100] = "";
-        sprintf (buffer, "Die Antwort lautet: %d", 42);
-        printf ("%s\n", buffer);
-      \end{lstlisting}
-
-      \textbf{Achtung:} Es findet keinerlei Prüfung statt, ob der Ziel-String
-      (Puffer -- \newterm{Buffer\/}) groß genug ist, um die Ausgabe aufzunehmen.
-      Wenn dies nicht der Fall ist un man über das Ende des Strings hinausschreibt,
-      werden andere Variable des Programms überschrieben (\newterm{Buffer Overflow}),
-      was in der Regel zu einem Absturz führt (Speicherzugriffsfehler).
-      Derartige Fehler sind schwer zu finden und befinden sich zum Teil bis heute
-      in Programmen, die im Internet zum Einsatz kommen
-      und Angreifern ermöglichen, Rechner von außen zu übernehmen.
-
-      Um dieses Problem zu vermeiden, empfiehlt es sich,
-      anstelle von \lstinline{sprintf()} die Funktion \lstinline{snprintf()}
-      zu verwenden. Diese erwartet als zweiten Parameter die Länge des Ziel-Strings
-      und sorgt dafür, daß nicht über dessen Ende hinausgeschrieben wird.
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-16.c}
-
-    \item
-      \lstinline{strstr()} -- in String suchen
-
-      Die Funktion \lstinline{strstr()}
-      such im ersten String-Parameter nach dem zweiten
-      und gibt als Ergebnis einen Zeiger auf diejenige Stelle zurück,
-      an der der zweite String gefunden wurde.
-
-      \begin{lstlisting}[gobble=8]
-        char *answer = strstr (buffer, "Antwort");
-        printf ("%s\n", answer);
-        printf ("found at: %zd\n", answer - buffer);
-      \end{lstlisting}
-
-      Wenn man dies in einen Array-Index umrechnen will,
-      geschieht dies durch Subtrahieren des Zeigers auf den ersten String.
-      Das Ergebnis ist eine Integer vom Typ \lstinline{ssize_t}
-      (\emph{signed size type\/}). Um diese mit \lstinline{printf()} auszugeben,
-      verwendet man \lstinline{%zd} anstelle von \lstinline{%d}.
-
-      Beispielprogramm: \gitfile{hp}{20161024}{strings-16.c}
-      
-  \end{itemize}
-
-  \subsection{Parameter des Hauptprogramms}
-
-  Bisher haben wir das Hauptprogramm \lstinline{main()} immer in der Form
-  \begin{lstlisting}
-    int main (void)
-    {
-      ...
-      return 0;
-    }
-  \end{lstlisting}
-  geschrieben.
-  
-  Tatsächlich kann das Hauptprogramm vom Betriebssystem Parameter entgegennehmen
-  (Datei: \gitfile{hp}{script}{params-1.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; i < argc; i++)
-        printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-      return 0;
-    }
-  \end{lstlisting}
-  Bei der ganzen Zahl \lstinline{int argc} handelt es sich um die Anzahl der übergebenen Parameter.
-
-  \lstinline{char **argv} ist ein Zeiger auf einen Zeiger auf \lstinline{char}s,
-  also ein Array von Arrays von \lstinline{char}s,
-  also ein Array von Strings.
-  Wenn wir es mit einem Index \lstinline{i} versehen,
-  greifen wir auf auf den \lstinline{i}-ten Parameter zu.
-  Der Index \lstinline{i} läuft, wie in C üblich, von \lstinline{0} bis \lstinline{argc - 1}.
-  Das o.\,a.\ Beispielprogramm gibt alle übergebenen Parameter auf dem Standardausgabegerät aus:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O params-1.c -o params-1¿
-    $ ¡./params-1 foo bar baz¿
-    argc = 4
-    argv[0] = "./params-1"
-    argv[1] = "foo"
-    argv[2] = "bar"
-    argv[3] = "baz"
-  \end{lstlisting}
-  Genaugenommen übergibt das Betriebssystem dem Programm die gesamte Kommandozeile:
-  Der nullte Parameter ist der Aufruf der ausführbaren Datei selbst
-  -- in genau der Weise, in der er eingegeben wurde.
-
-  Neben \lstinline{argc} gibt es noch einen weiteren Mechanismus,
-  mit dem das Betriebssystem dem Programm die Anzahl der übergebenen Parameter mitteilt:
-  Als Markierung für das Ende der Liste wird ein zusätzlicher Zeiger übergeben, der auf "`nichts"' zeigt,
-  dargestellt durch die Speicheradresse mit dem Zahlenwert 0,
-  in C mit \lstinline{NULL} bezeichnet.
-
-  Um die Parameter des Programms in einer Schleife durchzugehen,
-  können wir also entweder von \lstinline{0} bis \lstinline{argc - 1} zählen
-  (Schleifenbedingung \lstinline{i < argc}, Datei: \gitfile{hp}{script}{params-1.c} -- siehe oben)
-  oder die Schleife mit dem Erreichen der Endmarkierung abbrechen
-  (Schleifenbedingung \lstinline{argv[i] != NULL}, Datei: \gitfile{hp}{script}{params-2.c}).
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (int i = 0; argv[i] != NULL; i++)
-        printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-      return 0;
-    }
-  \end{lstlisting}
-  Auch für Zeiger gilt: \lstinline{NULL} entspricht dem Wahrheitswert "`falsch"';
-  alles andere dem Wahrheitswert "`wahr"'.
-  Wir dürfen die Schleifenbedingung also wie folgt abkürzen (Datei: \gitfile{hp}{script}{params-3.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (int argc, char **argv)
-    {
-      printf ("argc = %d\n", argc);
-      for (char **p = argv; *p; p++)
-        printf ("argv[p] = \"%s\"\n", *p);
-      return 0;
-    }
-  \end{lstlisting}
-
-  \subsection{Strukturen\label{Strukturen}}
-
-  In vielen Situationen ist es sinnvoll,
-  mehrere Variable zu einer Einheit zusammenzufassen.
-
-  Das folgende Beispielprogramm \gitfile{hp}{script}{structs-1.c}
-  faßt drei Variable \lstinline{day}, \lstinline{month} und \lstinline{year}
-  zu einem einzigen -- neuen -- Datentyp \lstinline{date} zusammen:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    int main (void)
-    {
-      date today = { 1, 11, 2016 };
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-  \begin{picture}(0,0)
-    \color{red}
-    \put(4,4.95){\makebox(0,0)[l]{$\left.\rule{0pt}{1.4cm}\right\}$ neuer Datentyp: date}}
-    \put(4.9,3){\vector(-1,-1){0.5}}
-    \put(5,3){\makebox(0,0)[l]{Variable deklarieren und initialisieren}}
-    \put(5.55,1.1){\vector(-1,1){0.5}}
-    \put(5.65,1.1){\makebox(0,0)[l]{Zugriff auf die Komponente day
-                                    der strukturierten Variablen today}}
-  \end{picture}%
-  (Zur Erinnerung: Der Datentyp \lstinline{char} steht für Zahlen,
-  die mindestens die Werte von $-$128 bis 127 annehmen können.
-  C unterscheidet nicht zwischen Zahlen und darstellbaren Zeichen.)
-
-  Eine wichtige Anwendung derartiger \newterm{strukturierter Datentypen\/} besteht darin,
-  zusammengehörige Daten als Einheit an Funktionen übergeben zu können
-  (Beispielprogramm: \gitfile{hp}{script}{structs-2.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    void set_date (date *d)
-    {
-      (*d).day = 1;
-      (*d).month = 11;
-      (*d).year = 2016;
-    }
-
-    int main (void)
-    {
-      date today;
-      set_date (&today);
-      printf ("%d.%d.%d\n", today.day,
-              today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-  Die Funktion \lstinline{set_date()} hat die Aufgabe,
-  eine \lstinline{date}-Variable mit Werten zu füllen (sog.\ \newterm{Setter\/}-Funktion).
-  Damit dies funktionieren kann, übergibt das Hauptprogramm an die Funktion
-  einen Zeiger auf die strukturierte Variable.
-  Über diesen Zeiger kann die Funktion dann auf alle Komponenten der Struktur zugreifen.
-  (Die Alternative wäre gewesen, für jede Komponente einen separaten Zeiger zu übergeben.)
-
-  Da die Zeigerdereferenzierung \lstinline{*foo}
-  mit anschließendem Komponentenzugriff \lstinline{(*foo).bar}
-  eine sehr häufige Kombination ist, kennt C hierfür eine Abkürzung:
-  \lstinline{foo->bar}
-
-  \goodbreak
-  Beispielprogramm: \gitfile{hp}{script}{structs-3.c}
-  \goodbreak
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-
-    void set_date (date *d)
-    {
-      d->day = 1;
-      d->month = 11;
-      d->year = 2016;
-    }
-
-    int main (void)
-    {
-      date today;
-      set_date (&today);
-      printf ("%d.%d.%d\n", today.day,
-              today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-
-  \goodbreak
-  \subsubsection*{Aufgabe}
-
-  Schreiben Sie eine Funktion \lstinline{inc_date (date *d)}
-  die ein gegebenes Datum \lstinline{d}
-  unter Beachtung von Schaltjahren auf den nächsten Tag setzt.
-
-  \goodbreak
-  \subsubsection*{Lösung}
-
-  Wir lösen die Aufgabe über den sog.\ \newterm{Top-Down-Ansatz} ("`vom Allgemeinen zum Konkreten"').
-  Als besonderen Trick approximieren wir unfertige Programmteile zunächst durch einfachere, fehlerbehaftete.
-  Diese fehlerhaften Programmteile sind in den untenstehenden Beispielen rot markiert.
-  (In der Praxis würde man diese Zeilen unmittelbar durch die richtigen ersetzen;
-  die fehlerhaften "`Platzhalter"' sollten also jeweils nur für Sekundenbruchteile im Programm stehen.
-  Falls man einmal tatsächlich einen Platzhalter für mehrere Sekunden oder länger stehen lassen sollte
-  -- z.\,B., weil an mehreren Stellen Änderungen notwendig sind --,
-  sollte man ihn durch etwas Uncompilierbares (z.\,B.\ \lstinline{@@@}) markieren,
-  damit man auf jeden Fall vermeidet, ein fehlerhaftes Programm auszuliefern.)
-
-  Zunächst kopieren wir das Beispielprogramm \gitfile{hp}{script}{structs-3.c}
-  und ergänzen den Aufruf der -- noch nicht existierenden -- Funktion \lstinline{inc_date()}
-  (Datei: \gitfile{{hp}script}{incdate-0.c}):
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-  \end{lstlisting}
-  \begin{lstlisting}
-    void set_date (date *d)
-    {
-      d->day = 31;
-      d->month = 1;
-      d->year = 2012;
-    }
-  \end{lstlisting}
-  \begin{lstlisting}
-    int main (void)
-    {
-      date today;
-      set_date (&today);
-      ¡inc_date (&today);¿
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Als nächstes kopieren wir innerhalb des Programms die Funktion \lstinline{get_date()}
-  als "`Schablone"' für \lstinline{inc_date()}:
-  \begin{lstlisting}
-    void get_date (date *d)
-    {
-      d->day = 31;
-      d->month = 1;
-      d->year = 2012;
-    }
-
-    ¡void inc_date (date *d)
-    {
-      d->day = 31;
-      d->month = 1;
-      d->year = 2012;
-    }¿
-  \end{lstlisting}
-  Da die Funktion jetzt existiert, ist der Aufruf nicht mehr fehlerhaft.
-  Stattdessen haben wir jetzt eine fehlerhafte Funktion \lstinline{inc_date()}.
-
-  Im nächsten Schritt ersetzen wir die fehlerhafte Funktion
-  durch ein simples Hochzählen der \lstinline{day}-Kom\-po\-nen\-te (Datei: \gitfile{hp}{script}{incdate-1.c})
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      ¡d->day += 1;  /* FIXME */¿
-    }
-  \end{lstlisting}
-  Diese naive Vorgehensweise versagt, sobald wir den Tag über das Ende des Monats hinauszählen.
-  Dies reparieren wir im nächsten Schritt,
-  wobei wir für den Moment inkorrekterweise annehmen, daß alle Monate 30 Tage hätten
-  und das Jahr beliebig viele Monate.
-  (Datei: \gitfile{hp}{script}{incdate-2.c}):
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      ¡if (d->day > 31)  /* FIXME */
-        {
-          d->month++;  /* FIXME */
-          d->day = 1;
-        }¿
-    }
-  \end{lstlisting}
-  Zunächst reparieren wir den Fehler, der am Ende des Jahres entsteht
-  (Datei: \gitfile{hp}{script}{incdate-3.c}).
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      if (d->day > 31)  /* FIXME */
-        {
-          d->month++;
-          d->day = 1;
-          ¡if (d->month > 12)
-            {
-              d->year++;
-              d->month = 1;
-            }¿
-        }
-    }
-  \end{lstlisting}
-  Das Problem der unterschiedlich langen Monate gehen wir wieder stufenweise an.
-  Zunächst ersetzen wir die Konstante \lstinline{31}
-  durch eine Variable \lstinline{days_in_month}.
-  (Datei: \gitfile{hp}{script}{incdate-4.c})
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      ¡int days_in_month = 31;  /* FIXME */
-      if (d->day > days_in_month)¿
-        {
-          d->month++;
-          d->day = 1;
-          if (d->month > 12)
-            {
-              d->year++;
-              d->month = 1;
-            }
-        }
-    }
-  \end{lstlisting}
-  Anschließend reparieren wir den fehlerhaften (konstanten) Wert der Variablen,
-  wobei wir zunächst das Problem der Schaltjahre aussparen (Datei: \gitfile{hp}{script}{incdate-5.c}):
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      int days_in_month = 31;
-      ¡if (d->month == 2)
-        days_in_month = 28;  /* FIXME */
-      else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-        days_in_month = 30;¿
-      if (d->day > days_in_month)
-        {
-          d->month++;
-          d->day = 1;
-          if (d->month > 12)
-            {
-              d->year++;
-              d->month = 1;
-            }
-        }
-    }
-  \end{lstlisting}
-  Auf dieselbe Weise lagern wir das Problem "`Schaltjahr oder nicht?"'
-  in eine Variable aus. Diese ist wieder zunächst konstant
-  (Datei: \gitfile{hp}{script}{incdate-6.c}):
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      int days_in_month = 31;
-      if (d->month == 2)
-        {
-          ¡int is_leap_year = 1;  /* FIXME */
-          if (is_leap_year)
-            days_in_month = 29;
-          else
-            days_in_month = 28;¿
-        }
-      else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-        days_in_month = 30;
-      if (d->day > days_in_month)
-        {
-          d->month++;
-          d->day = 1;
-          if (d->month > 12)
-            {
-              d->year++;
-              d->month = 1;
-            }
-        }
-    }
-  \end{lstlisting}
-  Als nächstes ergänzen wir die Vier-Jahres-Regel für Schaltjahre
-  (Datei \gitfile{hp}{script}{incdate-7.c}):
-  \begin{lstlisting}
-          ¡int is_leap_year = 0;
-          if (d->year % 4 == 0)
-            is_leap_year = 1;  /* FIXME */¿
-          if (is_leap_year)
-            days_in_month = 29;
-          else
-            days_in_month = 28;
-  \end{lstlisting}
-  Das nun vorliegende Programm arbeitet bereits für den julianischen Kalender
-  sowie für alle Jahre von 1901 bis 2099 korrekt,
-  nicht jedoch für z.\,B.\ das Jahr 2100 (Datei: \gitfile{hp}{script}{incdate-8.c}).
-  Damit das Programm für den aktuell verwendeten gregorianischen Kalender korrekt arbeitet,
-  ergänzen wir noch die Ausnahme, daß durch 100 teilbare Jahre keine Schaltjahre sind,
-  sowie die Ausnahme von der Ausnahme, daß durch 400 teilbare Jahre
-  (z.\,B.\ das Jahr 2000) eben doch Schaltjahre sind (Datei: \gitfile{hp}{script}{incdate-9.c}):
-  \begin{lstlisting}
-          int is_leap_year = 0;
-          if (d->year % 4 == 0)
-            ¡{
-              is_leap_year = 1;
-              if (d->year % 100 == 0)
-                {
-                  is_leap_year = 0;
-                  if (d->year % 400 == 0)
-                    is_leap_year = 1;
-                }
-            }¿
-          if (is_leap_year)
-            days_in_month = 29;
-          else
-            days_in_month = 28;
-  \end{lstlisting}
-  Damit ist die Aufgabe gelöst.
-  Der vollständige Quelltext der Lösung (Datei: \gitfile{hp}{script}{incdate-9.c}) lautet:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    typedef struct
-    {
-      char day, month;
-      int year;
-    }
-    date;
-  \end{lstlisting}
-  \begin{lstlisting}
-    void set_date (date *d)
-    {
-      d->day = 28;
-      d->month = 2;
-      d->year = 2000;
-    }
-  \end{lstlisting}
-  \begin{lstlisting}
-    void inc_date (date *d)
-    {
-      d->day++;
-      int days_in_month = 31;
-      if (d->month == 2)
-        {
-          int is_leap_year = 0;
-          if (d->year % 4 == 0)
-            {
-              is_leap_year = 1;
-              if (d->year % 100 == 0)
-                {
-                  is_leap_year = 0;
-                  if (d->year % 400 == 0)
-                    is_leap_year = 1;
-                }
-            }
-          if (is_leap_year)
-            days_in_month = 29;
-          else
-            days_in_month = 28;
-        }
-      else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-        days_in_month = 30;
-      if (d->day > days_in_month)
-        {
-          d->month++;
-          d->day = 1;
-          if (d->month > 12)
-            {
-              d->year++;
-              d->month = 1;
-            }
-        }
-    }
-  \end{lstlisting}
-  \begin{lstlisting}
-    int main (void)
-    {
-      date today;
-      set_date (&today);
-      inc_date (&today);
-      printf ("%d.%d.%d\n", today.day, today.month, today.year);
-      return 0;
-    }
-  \end{lstlisting}
-  Bemerkungen:
-  \begin{itemize}
-    \item
-      Anstatt die Anzahl der Tage in einem Monat
-      innerhalb der Funktion \lstinline{set_date()} zu berechnen,
-      ist es sinnvoll, hierfür eine eigene Funktion zu schreiben.
-      Dasselbe gilt für die Berechnung,
-      ob es sich bei einem gegebenem Jahr um ein Schaltjahr handelt.
-    \item
-      Der Top-Down-Ansatz ist eine bewährte Methode,
-      um eine zunächst komplexe Aufgabe in handhabbare Teilaufgaben zu zerlegen.
-      Dies hilft ungemein, in längeren Programmen (mehrere Zehntausend bis Millionen Zeilen)
-      die Übersicht zu behalten.
-    \item
-      Der Trick mit dem zunächst fehlerhaften Code hat den Vorteil,
-      daß man jeden Zwischenstand des Programms compilieren und somit austesten kann.
-      Er birgt andererseits die Gefahr in sich,
-      die Übersicht über den fehlerhaften Code zu verlieren,
-      so daß es dieser bis in die Endfassung schafft.
-      Neben dem bereits erwähnten Trick uncompilierbarer Symbole
-      haben sich hier Kommentare wie \lstinline{/* FIXME */} bewährt,
-      auf die man seinen Code vor der Auslieferung der Endfassung
-      noch einmal automatisch durchsuchen läßt.
-%    \item
-%      Allen an der Berechnung beteiligten Funktionen
-%      wurde hier ein Zeiger \lstinline{d} auf die vollständige \lstinline{date}-Struktur übergeben.
-%      Dies ist ein \newterm{objektorientierter Ansatz},
-%      bei dem man die Funktionen als \newterm{Methoden\/} der \newterm{Klasse\/} \lstinline{date} auffaßt.
-%      (Von sich aus unterstützt die Sprache C -- im Gegensatz zu z.\,B.\ C++ -- keine Klassen und Methoden,
-%      sondern man muß diese bei Bedarf in der oben beschrieben Weise selbst basteln.
-%      Für eine fertige Lösung siehe z.\,B.\ die \file{GObject}-Bibliothek -- \url{http://gtk.org}.)
-%
-%      Alternativ könnte man sich mit den zu übergebenden Parametern auf diejenigen beschränken,
-%      die in der Funktion tatsächlich benötigt werden,
-%      also z.\,B.\ \lstinline{int days_in_month (int month, int year)}
-%      und \lstinline{int is_leap_year (int year)}.
-%      Damit wären die Funktionen allgemeiner verwendbar.
-%
-%      Welcher dieser beiden Ansätze der bessere ist, hängt von der Situation
-%      und von persönlichen Vorlieben ab.
-  \end{itemize}
-
-  \subsection{Dateien und Fehlerbehandlung}
-
-  Die einfachste Weise, in C mit Dateien umzugehen,
-  ist über sog.\ \newterm{Streams}.
-
-  Die Funktion \lstinline{fopen()}
-  erwartet als Parameter einen Dateinamen und einen Modus
-  und gibt als Rückgabewert einen Zeiger auf einen Stream
-  -- eine Struktur vom Typ \lstinline{FILE} -- zurück:
-  \begin{lstlisting}
-    FILE *f = fopen ("fhello.txt", "w");
-  \end{lstlisting}
-  Als Modus übergibt man eine String-Konstante.
-  Diese kann die Buchstaben \lstinline{r} für Lesezugriff (\emph{read\/}),
-  \lstinline{w} für Schreibzugriff mit Überschreiben (\emph{write\/})
-  sowie \lstinline{a} für Schreibzugriff mit Anhängen (\emph{append\/}) enthalten
-  und zusätzlich den Buchstaben \lstinline{b} für Binärdaten (im Gegensatz zu Text).
-
-  Die in C üblichen Ein-/Ausgabefunktionen wie z.\,B.\ \lstinline{printf()}
-  haben Varianten mit vorangestelltem "`f-"', z.\,B.\ \lstinline{fprintf()}.
-  Wenn man diesen Funktionen als ersten Parameter einen Zeiger auf ein
-  \lstinline{FILE} übergibt, verhalten sie sich in der üblichen Weise,
-  nur daß sie nicht zur Standardausgabe schreiben (Bildschirm),
-  sondern in die Datei, deren Name beim Öffnen des \lstinline{FILE}
-  angegeben wurde (Datei \gitfile{hp}{script}{fhello-1.c}):
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      FILE *f = fopen ("fhello.txt", "w");
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Der von \lstinline{fopen()} zurückgegebene Wert ist ein Zeiger.
-  Ein Aufruf von \lstinline{fprintf()} oder \lstinline{fclose()}
-  stellt eine Verwendung dieses Zeigers dar.
-  Wenn die Datei -- aus welchen Gründen auch immer -- nicht geöffnet werden konnte,
-  ist dieser Zeiger \lstinline{NULL}, und seine Verwendung führt
-  zum Absturz des Programms.
-  Es ist daher dringend empfohlen, diesen Fall zu prüfen
-  (Datei: \gitfile{hp}{script}{fhello-2.c}):
-
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      FILE *f = fopen ("fhello.txt", "w");
-      if (f)
-        {
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-        }
-      return 0;
-    }
-  \end{lstlisting}
-
-  Anstatt einfach nur "`nichts"' zu machen,
-  ist es besser, eine sinnvolle Fehlermeldung auszugeben.
-  Dabei sind wir nicht allein auf "`Fehler beim Öffnen der Datei"' angewiesen:
-  Das Betriebssystem teilt uns über die globale Variable \lstinline{errno} mit,
-  was genau beim Öffnen der Datei fehlgeschlagen ist.
-  Mit \lstinline{#include <errno.h>} erhält unser Programm
-  Zugriff auf diese Variable
-  und kann den Fehler-Code in seiner Fehlermeldung mit ausgeben
-  (Datei: \gitfile{hp}{script}{fhello-3.c}):
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <errno.h>
-
-    int main (void)
-    {
-      FILE *f = fopen ("fhello.txt", "w");
-      if (f)
-        {
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-        }
-      else
-        fprintf (stderr, "error #%d\n", errno);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Die Ausgabe von Fehler erfolgt üblicherweise nicht mit einem "`normalen"'
-  \lstinline{printf()}, sondern mit einem \lstinline{fprintf()} in die
-  bereits standardmäßig geöffnete Datei \lstinline{stderr}, die
-  \newterm{Fehlerausgabe}-Datei.
-  Diese landet -- genau wie die Standardausgabe -- zunächst auf dem Bildschirm,
-  kann aber separat von der Standardausgabe umgeleitet werden,
-  z.\,B.\ in eine separate Datei.
-
-  Die Bedeutung der Fehler-Codes ist
-  nicht nur in der Dokumentation des Betriebssystems,
-  sondern auch in einer C-Bibliothek hinterlegt.
-  Mit \lstinline{#include <string.h>} erhalten wir
-  eine Funktion \lstinline{strerror()},
-  die den Fehler-Code in eine für Menschen lesbare Fehlermeldung umwandelt
-  (Datei: \gitfile{hp}{script}{fhello-4.c}):
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <errno.h>
-    #include <string.h>
-
-    int main (void)
-    {
-      FILE *f = fopen ("fhello.txt", "w");
-      if (f)
-        {
-          fprintf (f, "Hello, world!\n");
-          fclose (f);
-        }
-      else
-        {
-          char *msg = strerror (errno);
-          fprintf (stderr, "%s\n", msg);
-        }
-      return 0;
-    }
-  \end{lstlisting}
-
-  Ein häufiger Fall ist, daß das Programm nach Ausgabe der Fehlermeldung
-  direkt beendet werden soll.
-  Hierbei wird nicht das sonst übliche \lstinline{return 0}
-  des Hauptprogramms aufgerufen, sondern \lstinline{return}
-  mit einer anderen Zahl als 0, z.\,B.\ \lstinline{return 1}
-  für "`allgemeiner Fehler"'.
-  Üblich ist es, den Fehler-Code zurückgegeben
-  -- \lstinline{return errno} --, um diesen auch an denjenigen,
-  der das Programm aufgerufen hat, weiterzureichen.
-
-  Für diese standardisierte Reaktion auf Fehler
-  steht mit \lstinline{#include <error.h>}
-  eine Funktion \lstinline{error()} zur Verfügung,
-  die eine zum übergebenen Fehler-Code gehörende Fehlermeldung ausgibt
-  und anschließend das Programm mit einem übergebenen Fehler-Code beendet
-  (Datei: \gitfile{hp}{script}{fhello-5.c}):
-
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include <errno.h>
-    #include <error.h>
-
-    int main (void)
-    {
-      FILE *f = fopen ("fhello.txt", "w");
-      if (!f)
-         error (1, errno, "cannot open file");
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-      return 0;
-    }
-  \end{lstlisting}
-
-  In diesem Fall ist \lstinline{1} der Code,
-  den das Programm im Fehlerfall zurückgeben soll,
-  und \lstinline{errno} ist die Nummer des Fehlers,
-  dessen Fehlermeldung auf dem Bildschirm (\lstinline{stderr})
-  ausgegeben werden soll.
-  (Üblich wäre wie gesagt auch, hier zweimal \lstinline{errno} zu übergeben.)
-
-  \textbf{Bitte niemals Fehler einfach ignorieren!}
-  Ein Programm, das bereits auf eine nicht gefundene Datei
-  mit einem Absturz reagiert, ist der Alptraum jedes Benutzers
-  und eines jeden, der versucht, in dem Programm Fehler zu beheben.
-  Ein korrekt geschriebenes Programm stürzt \emph{niemals\/} ab,
-  sondern beendet sich schlimmstensfalls mit einer aussagekräftigen Fehlermeldung,
-  die uns in die Lage versetzt, die Fehlerursache zu beheben.
-
-  \section{Bibliotheken}
-
-  \subsection{Der Präprozessor\label{Praeprozessor}}
-
-  Der erste Schritt beim Compilieren eines C-Programms ist das
-  Auflösen der sogenannten Präprozessor-Direktiven und -Macros.
-  \begin{lstlisting}
-    #include <stdio.h>
-  \end{lstlisting}
-  \vspace{-\medskipamount}
-  bewirkt, daß aus Sicht des Compilers anstelle der Zeile
-  der Inhalt der Datei \file{stdio.h} im C-Quelltext erscheint.
-  Dies ist zunächst unabhängig von Bibliotheken und auch nicht auf die Programmiersprache C beschränkt.
-
-  Beispiel:
-  Die Datei \gitfile{hp}{script}{maerchen.c} enthält:
-  \begin{lstlisting}[language={}]
-    Vor langer, langer Zeit
-    gab es einmal
-    #include "hexe.h"
-    Die lebte in einem Wald.
-  \end{lstlisting}
-  Die Datei \gitfile{hp}{script}{hexe.h} enthält:
-  \begin{lstlisting}[language={}]
-    eine kleine Hexe.
-  \end{lstlisting}
-  Der Aufruf
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -E -P maerchen.c¿
-  \end{lstlisting}
-  produziert die Ausgabe
-  \begin{lstlisting}[style=terminal]
-    Vor langer, langer Zeit
-    gab es einmal
-    eine kleine Hexe.
-    Die lebte in einem Wald.
-  \end{lstlisting}
-  Mit der Option \lstinline[style=cmd]{-E} weisen wir \lstinline[style=cmd]{gcc} an,
-  nicht zu compilieren, sondern nur den Präprozessor aufzurufen.
-  Die Option \lstinline[style=cmd]{-P} unterdrückt Herkunftsangaben,
-  die normalerweise vom Compiler verwendet werden,
-  um Fehlermeldungen den richtigen Zeilen in den richtigen Dateien
-  zuordnen zu können. Ohne das \lstinline[style=cmd]{-P} lautet die Ausgabe:
-  \begin{lstlisting}[style=terminal]
-    # 1 "maerchen.c"
-    # 1 "<built-in>"
-    # 1 "<command-line>"
-    # 1 "maerchen.c"
-    Vor langer, langer Zeit
-    gab es einmal
-    # 1 "hexe.h" 1
-    eine kleine Hexe.
-    # 3 "maerchen.c" 2
-    Die lebte in einem Wald.
-  \end{lstlisting}
-
-  Nichts anderes geschieht, wenn man das klassische \file{hello.c}
-  (Datei: \gitfile{hp}{script}{hello-1.c} compiliert:
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    int main (void)
-    {
-      printf ("Hello, world!\n");
-      return 0;
-    }
-  \end{lstlisting}
-  Die Datei \file{stdio.h} ist wesentlich länger als \gitfile{hp}{script}{hexe.txt} in dem o.\,a.\
-  Beispiel, und sie ruft weitere Include-Dateien auf,
-  so daß wir insgesamt auf über 800 Zeilen Quelltext kommen.
-
-  Die spitzen Klammern anstelle der Anführungszeichen bedeuten,
-  daß es sich um eine \newterm{Standard-Include-Datei\/} handelt,
-  die nur in den Standard-Include-Verzeichnissen gesucht werden soll,
-  nicht jedoch im aktuellen Verzeichnis.
-
-  \subsection{Bibliotheken einbinden}
-
-  Tatsächlich ist von den über 800 Zeilen aus \file{stdio.h} nur eine
-  einzige relevant, nämlich:
-  \begin{lstlisting}
-    extern int printf (__const char *__restrict __format, ...);
-  \end{lstlisting}
-  Dies ist die Deklaration einer Funktion, die sich von einer
-  "`normalen"' Funktionsdefinition nur wie folgt unterscheidet:
-  \begin{itemize}
-    \item
-      Die Parameter \lstinline{__const char *__restrict __format, ...}
-      heißen etwas ungewöhnlich.
-    \item
-      Der Funktionskörper \lstinline|{ ... }| fehlt. Stattdessen folgt auf die
-      Kopfzeile direkt ein Semikolon \lstinline{;}.
-    \item
-      Der Deklaration ist das Schlüsselwort \lstinline{extern} vorangestellt.
-  \end{itemize}
-  Dies bedeutet für den Compiler:
-  "`Es gibt diese Funktion und sie sieht aus, wie beschrieben.
-  Benutze sie einfach, und kümmere dich nicht darum, wer die Funktion schreibt."'
-
-  \begin{experts}
-    Wenn wir tatsächlich nur \lstinline{printf()} benötigen,
-    können wir also die Standard-Datei \file{stdio.h} durch eine eigene ersetzen,
-    die nur die o.\,a.\ Zeile \lstinline{extern int printf (...)} enthält.
-    (Dies ist in der Praxis natürlich keine gute Idee, weil nur derjenige, der die
-    Funktion \lstinline{printf()} geschrieben hat, den korrekten Aufruf kennt.
-    In der Praxis sollten wir immer diejenige Include-Datei benutzen,
-    die gemeinsam mit der tatsächlichen Funktion ausgeliefert wurde.)
-  \end{experts}
-
-  \breath
-
-  Der Präprozessor kann nicht nur \lstinline{#include}-Direktiven auflösen.
-  Mit \lstinline{#define} kann man sog.\ \newterm{Makros\/} definieren,
-  die bei Benutzung durch einen Text ersetzt werden.
-  Auf diese Weise kann man \newterm{Konstante\/} definieren.
-
-  Beispiel: \gitfile{hp}{script}{higher-math-1.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    #define VIER 4
-
-    int main (void)
-    {
-      printf ("2 + 2 = %d\n", VIER);
-      return 0;
-    }
-  \end{lstlisting}
-
-  Genau wie bei \lstinline{#include} nimmt der Präprozessor auch bei \lstinline{#define}
-  eine rein textuelle Ersetzung vor, ohne sich um den Sinn des Ersetzten zu kümmern.
-
-  Beispiel: \gitfile{hp}{script}{higher-math-2.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    #define wuppdich printf
-    #define holla main
-    #define pruzzel return
-    #define VIER 4
-
-    int holla (void)
-    {
-      wuppdich ("2 + 2 = %d\n", VIER);
-      pruzzel 0;
-    }
-  \end{lstlisting}
-
-  Dies kann zu Problemen führen, sobald Berechnungen ins Spiel kommen.
-
-  Beispiel: \gitfile{hp}{script}{higher-math-3.c}
-  \begin{lstlisting}
-    #include <stdio.h>
-
-    #define VIER 2 + 2
-
-    int main (void)
-    {
-      printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER);
-      return 0;
-    }
-  \end{lstlisting}
-  Hier z.\,B.\ sieht man mit \lstinline[style=cmd]{gcc -E rechnen.c},
-  daß die Ersetzung des Makros \lstinline{VIER} wie folgt lautet:
-  \begin{lstlisting}
-      printf ("2 + 3 * 4 = %d\n", 2 + 3 * 2 + 2);
-  \end{lstlisting}
-  Der C-Compiler wendet die Regel "`Punktrechnung geht vor Strichrechnung"' an
-  und erfährt überhaupt nicht, daß das \lstinline{2 + 2} aus einem Makro enstanden ist.
-
-  Um derartige Effekte zu vermeiden, setzt man arithmetische
-  Operationen innerhalb von Makros in Klammern.
-
-  Beispiel: \gitfile{hp}{script}{higher-math-4.c}
-  \begin{lstlisting}
-    #define VIER (2 + 2)
-  \end{lstlisting}
-
-  (Es ist in den meisten Situationen üblich, Makros in \lstinline{GROSSBUCHSTABEN} zu benennen,
-  um darauf hinzuweisen, daß es sich eben um einen Makro handelt.)
-
-  Achtung: Hinter Makro-Deklaration kommt üblicherweise \emph{kein\/} Semikolon.
-
-  \begin{experts}
-    Wenn man ein Semikolon setzt, gehört dies mit zum Ersetzungstext des Makros.
-    Dies ist grundsätzlich zulässig, führt aber zu sehr seltsamen C-Quelltexten.
-    -- siehe z.\,B.\ \gitfile{hp}{script}{higher-math-5.c}.
-  \end{experts}
-
-  \breath
-
-  Das nächste Beispiel illustriert, wie man Bibliotheken schreibt und verwendet.
-  
-  Es besteht aus drei Quelltexten:
-
-  \gitfile{hp}{script}{philosophy.c}:
-  \begin{lstlisting}
-    #include <stdio.h>
-    #include "answer.h"
-
-    int main (void)
-    {
-      printf ("The answer is %d.\n", answer ());
-      return 0;
-    }
-  \end{lstlisting}
- 
-  \goodbreak
-  \gitfile{hp}{script}{answer.c}:
-  \begin{lstlisting}
-    int answer (void)
-    {
-      return 42;
-    }
-  \end{lstlisting}
- 
-  \goodbreak
-  \gitfile{hp}{script}{answer.h}:
-  \begin{lstlisting}
-    extern int answer (void);
-  \end{lstlisting}
-
-  Das Programm \gitfile{hp}{script}{philosophy.c} verwendet eine Funktion \lstinline{answer()}, die
-  in der Datei \gitfile{hp}{script}{answer.h} extern deklariert ist.
-
-  Der "`normale"' Aufruf
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O philosophy.c -o philosophy¿
-  \end{lstlisting}
-  liefert die Fehlermeldung:
-  \begin{lstlisting}[style=terminal]
-    /tmp/ccr4Njg7.o: In function `main':
-    philosophy.c:(.text+0xa): undefined reference to `answer'
-    collect2: ld returned 1 exit status
-  \end{lstlisting}
-  Diese stammt nicht vom Compiler, sondern vom \newterm{Linker}.
-  Das Programm ist syntaktisch korrekt und wird auch korrekt in eine Binärdatei umgewandelt
-  (hier: \file{/tmp/ccr4Njg7.o}).
-  Erst beim Zusammenbau ("`Linken"') der ausführbaren Datei (\file{philosophy})
-  tritt ein Fehler auf.
-
-  Tatsächlich wird die Funktion \lstinline{answer()}
-  nicht innerhalb von \gitfile{hp}{script}{philosophy.c}, sondern in einer separaten Datei \gitfile{hp}{script}{answer.c},
-  einer sog.\ \newterm{Bibliothek\/} definiert.
-  Es ist möglich (und üblich), Bibliotheken separat vom Hauptprogramm zu compilieren.
-  Dadurch spart man sich das Neucompilieren,
-  wenn im Hauptprogramm etwas geändert wurde, nicht jedoch in der Bibliothek.
-
-  Mit der Option \lstinline[style=cmd]{-c} weisen wir \lstinline[style=cmd]{gcc} an,
-  nur zu compilieren, jedoch nicht zu linken. Die Aufrufe
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O -c philosophy.c¿
-    $ ¡gcc -Wall -O -c answer.c¿
-  \end{lstlisting}
-  produzieren die Binärdateien \file{philosophy.o} und \file{answer.o},
-  die sogenannten \newterm{Objekt-Dateien} (daher die Endung \file{.o} oder \file{.obj}).
-
-  Mit dem Aufruf
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc philosophy.o answer.o -o philosophy¿
-  \end{lstlisting}
-  bauen wir die beiden bereits compilierten Objekt-Dateien zu einer
-  ausführbaren Datei \file{philosophy} (hier ohne Endung) zusammen.
-
-  Es ist auch möglich, im Compiler-Aufruf gleich beide C-Quelltexte zu
-  übergeben:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O philosophy.c answer.c -o philosophy¿
-  \end{lstlisting}
-  In diesem Fall ruft \lstinline[style=cmd]{gcc} zweimal den Compiler auf
-  (für jede C-Datei einmal) und anschließend den Linker.
-
-  \subsection{Bibliotheken verwenden (Beispiel: OpenGL)}
-
-  Die \newterm{OpenGL\/}-Bibilothek dient dazu,
-  unter Verwendung von Hardware-Unterstützung dreidimensionale Grafik auszugeben.
-
-  Die einfachste Art und Weise, OpenGL in seinen Programmen einzusetzen,
-  erfolgt über eine weitere Bibliothek, das \newterm{OpenGL Utility Toolkit (GLUT)}.
-
-  Die Verwendung von OpenGL und GLUT erfolgt durch Einbinden der Include-Dateien
-  \begin{lstlisting}
-    #include <GL/gl.h>
-    #include <GL/glu.h>
-    #include <GL/glut.h>
-  \end{lstlisting}
-  und die Übergabe der Bibliotheken \lstinline[style=cmd]{-lGL -lGLU -lglut} im Compiler-Aufruf: 
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut -o cube¿
-  \end{lstlisting}
-  (Dies ist der Aufruf unter Unix.
-  Unter Microsoft Windows ist der Aufruf etwas anders
-  und hängt von der verwendeten Version der GLUT-Bibliothek ab.
-  Für Details siehe die Dokumentation der GLUT-Bibliothek
-  sowie die Datei \gitfile{hp}{20161031}{egal.txt}.)
-
-  Die Bibliothek stellt uns fertig geschriebene Programmfragmente zur Verfügung, insbesondere:
-  \begin{itemize}
-    \item
-      Funktionen: z.\,B.\ \lstinline{glutInit (&argc, argv);}
-    \item
-      Konstante: z.\,B.\ \lstinline{GLUT_RGBA}
-    \item
-      Datentypen: z.\,B.\ \lstinline{GLfloat}
-  \end{itemize}
-
-  Manche OpenGL-Funktionen erwarten als Parameter ein Array.
-  Dies gilt z.\,B.\ beim Setzen von Farben oder beim Positionieren einer Lichtquelle:
-  \begin{lstlisting}
-    GLfloat light0_position[] = {1.0, 2.0, -2.0, 1.0};
-    glLightfv (GL_LIGHT0, GL_POSITION, light0_position);
-  \end{lstlisting}
-
-  Ein weiteres wichtiges allgemeines Konzept,
-  das in OpenGL eine Rolle spielt, ist die Übergabe einer Funktion an die Bibliothek.
-  Man nennt dies das \newterm{Installieren einer Callback-Funktion}.
-  \begin{lstlisting}
-    void draw (void)
-    { ... }
-
-    glutDisplayFunc (draw);
-  \end{lstlisting}
-  Wir übergeben die -- von uns geschriebene -- Funktion \lstinline{draw()}
-  an die OpenGL-Funktion \lstinline{glutDisplayFunc()}.
-  Dies bewirkt, daß OpenGL immer dann, wenn etwas gezeichnet werden soll, \lstinline{draw()} aufruft.
-  Innerhalb von \lstinline{draw()} können wir also unsere Zeichenbefehle unterbringen.
-
-  \breath
-
-  Die OpenGL-Bibliothek ist sehr umfangreich
-  und kann im Rahmen dieser Vorlesung nicht im Detail behandelt werden.
-  Um trotzdem damit arbeiten zu können,
-  lagern wir bestimmte Teile -- Initialisierung und das Setzen von Farben --
-  in eine eigene Bibliothek \file{opengl-magic} aus, die wir als "`Black Box"' verwenden.
-  Der Compiler-Aufruf lautet dann:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic.c -o cube¿
-  \end{lstlisting}
-  (Wer in eigenen Projekten mehr mit OpenGL machen möchte,
-  ist herzlich eingeladen, die Funktionsweise von \file{opengl-magic} zu studieren.)
-
-  \begin{itemize}
-    \item
-      Das Beispielprogramm \gitfile{hp}{script}{cube-1.c} illustriert,
-      wie man grundsätzlich überhaupt ein geometrisches Objekt zeichnet.
-      In diesem Fall handelt es sich um einen Würfel der Kantenlänge \lstinline{0.5},
-      von dem wir nur die Vorderfläche sehen, also ein Quadrat.
-      \begin{lstlisting}[gobble=8]
-        #include <GL/gl.h>
-        #include <GL/glu.h>
-        #include <GL/glut.h>
-        #include "opengl-magic.h"
-
-        void draw (void)
-        {
-          glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
-          set_material_color (1.0, 0.7, 0.0);
-          glutSolidCube (0.75);
-          glFlush ();
-          glutSwapBuffers ();
-        }
-
-        int main (int argc, char **argv)
-        {
-          init_opengl (&argc, argv, "Cube");
-          glutDisplayFunc (draw);
-          glutMainLoop ();
-          return 0;
-        }
-      \end{lstlisting}
-      \begin{picture}(0,0)
-        \color{red}
-        \put(12.5,6.4){\vector(-1,0){1}}
-        \put(12.6,6.4){\makebox(0,0)[l]{Bildschirm löschen}}
-        \put(7.5,5.95){\vector(-1,0){1}}
-        \put(7.6,5.95){\makebox(0,0)[l]{Rotanteil 100\,\%, Grünanteil 70\,\%, Blauanteil 0\,\%}}
-        \put(5.5,5.5){\vector(-1,0){1}}
-        \put(5.6,5.5){\makebox(0,0)[l]{Würfel zeichnen}}
-        \put(4.0,5.05){\vector(-1,0){1}}
-        \put(4.1,5.05){\makebox(0,0)[l]{Zeichnung "`abschicken"'}}
-        \put(5.2,4.6){\vector(-1,0){1}}
-        \put(5.3,4.6){\makebox(0,0)[l]{fertige Zeichnung zeigen; neues "`Zeichenpapier"' bereitlegen}}
-        \put(6.0,2.15){\vector(-1,0){1}}
-        \put(6.1,2.15){\makebox(0,0)[l]{Callback-Funktion installieren (s.\,o.)}}
-        \put(5.0,1.7){\vector(-1,0){1}}
-        \put(5.1,1.7){\makebox(0,0)[l]{Endlosschleife: Ab jetzt werden nur noch Callbacks aufgerufen.}}
-      \end{picture}
-    \item
-      In \gitfile{hp}{script}{cube-2.c} kommt eine Drehung um \lstinline{-30} Grad
-      um eine schräge Achse \lstinline{(0.5, 1.0, 0.0)} hinzu.
-      Der Würfel ist jetzt als solcher zu erkennen.
-
-      Jeder Aufruf von \lstinline{glRotatef()} bewirkt,
-      daß alle nachfolgenden Zeichenoperationen gedreht ausgeführt werden.
-
-    \item
-      In \gitfile{hp}{script}{cube-3.c} kommt als zusätzliches Konzept eine weitere Callback-Funktion hinzu,
-      nämlich ein \newterm{Timer-Handler}.
-      Durch den \lstinline{glutTimerFunc()}-Aufruf veranlassen wir OpenGL,
-      die von uns geschriebene Funktion \lstinline{timer_handler()} aufzurufen,
-      sobald \lstinline{50} Millisekunden vergangen sind.
-
-      Innerhalb von \lstinline{timer_handler()} rufen wir \lstinline{glutTimerFunc()} erneut auf,
-      was insgesamt zur Folge hat, daß \lstinline{timer_handler()} periodisch alle 50 Millisekunden
-      aufgerufen wird.
-
-      Die "`Nutzlast"' der Funktion \lstinline{timer_handler()} besteht darin,
-      eine Variable \lstinline{t} um den Wert \lstinline{0.05} zu erhöhen
-      und anschließend mittels \lstinline{glutPostRedisplay()} ein Neuzeichnen anzufordern.
-      Dies alles bewirkt, daß die Variable \lstinline{t} die aktuelle Zeit seit Programmbeginn
-      in Sekunden enthält und daß \lstinline{draw()} zwanzigmal pro Sekunde aufgerufen wird.
-
-%    \item
-%      Weil das Bild während des Neuzeichnens die ganze Zeit zu sehen ist,
-%      flackert in \gitfile{hp}{script}{cube-3.c} der Bildschirm.
-%      Dies wird in \gitfile{hp}{script}{cube-3a.c} dadurch behoben,
-%      daß die Zeichnung zunächst in einem unsichtbaren Pufferspeicher aufgebaut wird.
-%      Erst die fertige Zeichnung wird mit dem Funktionsaufruf \lstinline{swapBuffers()} sichtbar gemacht.
-%
-%      Damit dies möglich ist, muß beim Initialisieren ein doppelter Puffer angefordert werden.
-%      Zu diesem Zweck ersetzen wir die Bibliothek \gitfile{hp}{script}{opengl-magic.c}
-%      durch \gitfile{hp}{script}{opengl-magic-double.c}.
-%
-%      Der Compiler-Aufruf lautet dann:
-%      \begin{lstlisting}[style=terminal,gobble=8]
-%        $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic-double.c -o cube¿
-%      \end{lstlisting}
-%
-%      Unabhängig davon heißt die Include-Datei weiterhin \gitfile{hp}{script}{opengl-magic.h}.
-%      Dies illustriert, daß der Include-Mechanismus des Präprozessors
-%      und der Zusammenbau-Mecha"-nismus des Linkers tatsächlich voneinander unabhängig sind.
-%
-%      \begin{experts}
-%        (Durch das Austauschen von Bibliotheken, insbesondere bei dynamischen Bibliotheken
-%        (Endung \file{.so} unter Unix bzw.\ \file{.dll} unter Microsoft Windows)
-%        ist es möglich, das Verhalten bereits fertiger Programme zu beeinflussen,
-%        ohne das Programm neu compilieren zu müssen.
-%        Dies kann zu Testzwecken geschehen, zur Erweiterung des Funktionsumfangs
-%        oder auch zum Einschleusen von Schadfunktionen.)
-%      \end{experts}
-
-    \item
-      In \gitfile{hp}{script}{cube-3.c} dreht sich der Würfel zunächst langsam, dann immer schneller.
-      Dies liegt daran, daß sich jedes \lstinline{glRotatef()}
-      auf alle nachfolgenden Zeichenbefehle auswirkt,
-      so daß sich sämtliche \lstinline{glRotatef()} aufaddieren.
-
-      Eine Möglichkeit, stattdessen eine gleichmäßige Drehung zu erreichen,
-      besteht darin, den Wirkungsbereich des \lstinline{glRotatef()} zu begrenzen.
-      Dies geschieht durch Einschließen der Rotation in das Befehlspaar \lstinline{glPushMatrix()}
-      und \lstinline{glPopMatrix()}:
-      Durch \lstinline{glPopMatrix()} wird das System wieder in denjenigen Zustand versetzt,
-      in dem es sich vor dem Aufruf von \lstinline{glPushMatrix()} befand.
-
-      Dies ist in \gitfile{hp}{script}{cube-4.c} (langsame Drehung) und \gitfile{hp}{script}{cube-5.c} (schnelle Drehung) umgesetzt.
-
-  \end{itemize}
-
-  \subsubsection*{Aufgabe}
-
-  Für welche elementaren geometrischen Körper
-  stellt die GLUT-Bibliothek Zeichenroutinen zur Verfügung?
-
-  \subsubsection*{Lösung}
-
-  Ein Blick in die Include-Datei \file{glut.h}
-  verweist uns auf eine andere Include-Datei:
-  \begin{lstlisting}
-    #include "freeglut_std.h"
-  \end{lstlisting}
-  Wenn wir darin nach dem Wort \lstinline{glutSolidCube} suchen,
-  finden wir die Funktionen:
-  \begin{lstlisting}
-    glutSolidCube (GLdouble size);
-    glutSolidSphere (GLdouble radius, GLint slices, GLint stacks);
-    glutSolidCone (GLdouble base, GLdouble height, GLint slices, GLint stacks);
-    glutSolidTorus (GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
-    glutSolidDodecahedron (void);
-    glutSolidOctahedron (void);
-    glutSolidTetrahedron (void);
-    glutSolidIcosahedron (void);
-    glutSolidTeapot (GLdouble size);
-  \end{lstlisting}
-  Zu jeder \lstinline{glutSolid}-Funktion gibt es auch eine \lstinline{glutWire}-Funktion,
-  beispielsweise \lstinline{glutWireCube()} als Gegenstück zu \lstinline{glutSolidCube()}.
-
-  In demselben Verzeichnis finden wir auch eine Datei \file{freeglut\_ext.h}
-  mit weiteren Funktionen dieses Typs:
-  \begin{lstlisting}
-    glutSolidRhombicDodecahedron (void);
-    glutSolidSierpinskiSponge (int num_levels, GLdouble offset[3], GLdouble scale);
-    glutSolidCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks);
-  \end{lstlisting}
-
-  Die GLUT-Bibliothek kennt insbesondere standardmäßig eine Funktion zum Zeichnen einer Teekanne
-  und als Erweiterung eine Funktion zum Zeichnen eines Sierpinski-Schwamms.
-
-  \breath
-
-  Die weiteren OpenGL-Beispielprogramme illustrieren den Umgang mit Transformationen.
-  \begin{itemize}
-    \item
-      Die Beispielprogramme \gitfile{hp}{script}{cube-5.c} und \gitfile{hp}{script}{cube-6.c}
-      illustrieren eine weitere Transformation der gezeichneten Objekte,
-      nämlich die Translation (Verschiebung).
-
-      Jeder Transformationsbefehl wirkt sich jeweils
-      auf die \emph{danach\/} erfolgenden Zeichenbefehle aus.
-      Um sich zu veranschaulichen, welche Transformationen auf ein gezeichnetes Objekt wirken
-      (hier z.\,B.\ auf \lstinline{glutSolidCube()}),
-      muß man die Transformationen in der Reihenfolge \emph{von unten nach oben\/} ausführen.
-
-    \item
-      Das Beispielprogramm \gitfile{hp}{script}{orbit-1.c} 
-      verwendet weitere Transformationen und geometrische Objekte,
-      um die Umlaufbahn des Mondes um die Erde zu illustrieren.
-
-      Darüberhinaus versieht es die gezeichneten Objekte "`Mond"' und "`Erde"' mit realistischen Texturen (NASA-Fotos).
-      Die hierfür notwendigen doch eher komplizierten Funktionsaufrufe
-      wurden wiederum in eine Bibliothek (\file{textured-spheres}) ausgelagert.
-      
-  \end{itemize}
-
-\iffalse
-
-  \subsection{Standard-Pfade}
-
-  Wenn eine Bibliothek regelmäßig von vielen Programmierern benutzt
-  wird, wird sie üblicherweise an einem Standard-Ort abgelegt, z.\,B.\ in
-  dem Verzeichnis \file{/usr/lib}.
-
-  \lstinline[style=cmd]{gcc} erwartet, daß die Namen von Bibliotheksdateien mit \file{lib}
-  beginnen und die Endung \file{.a} oder \file{.so} haben. (\file{.a} steht für
-  "`Archiv"', da eine \file{.a}-Datei mehrere \file{.o}-Dateien enthält.
-  \file{.so} steht für "`shared object"' und bezeichnet eine Bibliothek, die
-  erst zur Laufzeit eingebunden wird und von mehreren Programmen
-  gleichzeitig benutzt werden kann. Andere übliche Bezeichnungen
-  sind \file{.lib} anstelle von \file{.a} und \file{.dll} anstelle von \file{.so}.)
-
-  Mit der Option \lstinline[style=cmd]{-lfoo} teilen wir \lstinline[style=cmd]{gcc} mit, daß wir eine Datei
-  \file{libfoo.a} aus einem der Standardverzeichnisse verwenden möchten.
-  ("`foo"' ist eine metasyntaktische Variable und steht für ein
-  beliebiges Wort.) Auch der Aufruf \lstinline[style=cmd]{-lm} zum Einbinden der
-  Mathematik-Bibliothek ist nichts anderes. Tatsächlich gibt es
-  eine Datei \file{libm.a} im Verzeichnis \file{/usr/lib}.
-  \begin{verbatim}
-    gcc test.c -lm -o test\end{verbatim}
-  ist somit dasselbe wie
-  \begin{verbatim}
-    gcc test.c /usr/lib/libm.a -o test\end{verbatim}
-
-  Mit der Option \lstinline[style=cmd]{-L /foo/bar} können wir ein Verzeichnis \file{/foo/bar}
-  dem Suchpfad hinzufügen. ("`bar"' ist eine weitere metasyntaktische
-  Variable.)
-  \begin{verbatim}
-    gcc test.c -L /home/joe/my_libs -lmy -o test\end{verbatim}
-  compiliert \file{test.c} und linkt es mit einer Bibliothek \file{libmy.a},
-  nach der nicht nur in den Standardverzeichnissen (\file{/usr/lib},
-  \file{/usr/local/lib} u.\,a.), sondern zusätzlich im Verzeichnis
-  \file{/home/joe/my\_libs} gesucht wird.
-
-  Auf gleiche Weise kann man mit \lstinline[style=cmd]{-I /foo/bar} Verzeichnisse für
-  Include-Dateien (s.\,o.)\ dem Standardsuchpfad hinzufügen.
-
-\fi
-
-  \subsection{Projekt organisieren: make}
-
-  In größeren Projekten ruft man den Compiler (und Präprozessor und
-  Linker) nicht "`von Hand"' auf, sondern überläßt dies einem weiteren
-  Programm namens \lstinline[style=cmd]{make}.
-
-  \lstinline[style=cmd]{make} sucht im aktuellen Verzeichnis nach einer Datei \file{Makefile}
-  (ohne Dateiendung). (Normalerweise gibt es nur ein Makefile pro
-  Verzeichnis. Falls es doch mehrere gibt, kann man die Datei, z.\,B.\
-  \file{Makefile.1}, mit \lstinline[style=cmd]{-f}
-  auch explizit angeben: \lstinline[style=cmd]{make -f Makefile.1}.)
-
-  \subsubsection{make-Regeln}
-
-  Ein Makefile enthält sog.\ Regeln, um Ziele zu erzeugen.
-  Eine Regel beginnt mit der Angabe des Ziels, gefolgt von einem
-  Doppelpunkt und den Dateien (oder anderen Zielen), von denen es
-  abhängt. Darunter steht, mit einem Tabulator-Zeichen eingerückt, der
-  Programmaufruf, der nötig ist, um das Ziel zu bauen.
-  \begin{lstlisting}[language=make]
-    philosophy.o: philosophy.c answer.h
-            gcc -c philosophy.c -o philosophy.o
-  \end{lstlisting}
-  Achtung: Ein Tabulator-Zeichen läßt sich optisch häufig nicht von
-  mehreren Leerzeichen unterscheiden. \lstinline[style=cmd]{make}
-  akzeptiert jedoch nur das Tabulator-Zeichen.
-
-  Die o.\,a.\ Regel bedeutet, daß jedesmal, wenn sich \gitfile{hp}{script}{philosophy.c} oder
-  \gitfile{hp}{script}{answer.h} geändert hat, \lstinline[style=cmd]{make}
-  das Programm \lstinline[style=cmd]{gcc} in der beschriebenen Weise aufrufen soll.
-
-  Durch die Kombination mehrerer Regeln lernt \lstinline[style=cmd]{make},
-  welche Befehle in welcher Reihenfolge aufgerufen werden müssen,
-  je nachdem, welche Dateien geändert wurden.
-
-  \breath
-
-  Beispiel: \file{Makefile.orbit-x1}
-
-  Der Aufruf
-  \begin{lstlisting}[style=terminal]
-    $ ¡make -f Makefile.orbit-x1¿
-  \end{lstlisting}
-  bewirkt beim ersten Mal:
-  \begin{lstlisting}[style=terminal]
-    gcc -Wall -O orbit-x1.c opengl-magic-double.c textured-spheres.c \
-              -lGL -lGLU -lglut -o orbit-x1
-  \end{lstlisting}
-  Beim zweiten Aufruf stellt \lstinline[style=cmd]{make} fest, daß sich keine der Dateien
-  auf der rechten Seite der Regeln (rechts vom Doppelpunkt) geändert
-  hat und ruft keine Programme auf:
-  \begin{lstlisting}[style=terminal]
-    make: »orbit-x1« ist bereits aktualisiert.
-  \end{lstlisting}
-
-  \subsubsection{make-Macros}
-
-  Um wiederkehrende Dinge (typischerweise: Listen von Dateinamen oder
-  Compiler-Optionen) nicht mehrfach eingeben zu müssen, kennt \lstinline[style=cmd]{make}
-  sog.\ Macros:
-  \begin{lstlisting}[language=make]
-    PHILOSOPHY_SOURCES = philosophy.c answer.h
-  \end{lstlisting}
-  Um den Macro zu expandieren, setzt man ihn in runde Klammern mit
-  einem vorangestellten Dollarzeichen. Die Regel
-  \begin{lstlisting}[language=make]
-    philosophy.o: $(PHILOSOPHY_SOURCES)
-            gcc -c philosophy.c -o philosophy.o
-  \end{lstlisting}
-  ist also nur eine andere Schreibweise für:
-  \begin{lstlisting}[language=make]
-    philosophy.o: philosophy.c answer.h
-            gcc -c philosophy.c -o philosophy.o
-  \end{lstlisting}
-
-  \breath
-
-  Beispiel: \file{Makefile.blink}
-
-  Die Beispielprogramme \file{blink-\lstinline{*}.c} sind dafür gedacht,
-  auf einem Mikrocontroller zu laufen.
-  Der Compiler-Aufruf erfordert zusätzliche Optionen
-  (z.\,B.\ \lstinline[style=cmd]{-Os -mmcu=atmega32}),
-  und es müssen zusätzliche Entwicklungswerkzeuge
-  (z.\,B.\ \lstinline[style=cmd]{avr-objcopy}) aufgerufen werden --
-  ebenfalls mit den richtigen Optionen.
-  Der Prozeß des Zusammenbauens wird durch ein Makefile \file{Makefile.blink} verwaltet.
-
-  \file{Makefile.blink} speichert den Namen des Quelltextes
-  (ohne die Endung \file{.c}) in einem Macro.
-  Durch Ändern allein dieses Macros ist es daher möglich,
-  das Makefile für ein anderes Projekt einzusetzen.
-  
-  Zusätzlich führt \file{Makefile.blink} eine neue Regel \lstinline{clean} ein.
-  Diese bewirkt üblicherweise, daß alle automatisch erzeugten Dateien
-  gelöscht werden:
-  \begin{lstlisting}[language=make]
-    clean:
-            rm -f $(TARGET).elf $(TARGET).hex
-  \end{lstlisting}
-  Rechts vom Doppelpunkt nach \lstinline[language=make]{clean} befinden sich keine
-  Abhängigkeitsdateien. Dies hat zur Folge, daß die Aktion
-  (\lstinline{rm -f ...}) bei \lstinline[style=cmd]{make clean}
-  grundsätzlich immer ausgeführt wird, also nicht nur, wenn sich irgendeine Datei geändert hat.
-
-  \begin{experts}
-    Ebenfalls üblich ist eine weitere Regel \lstinline[language=make]{install},
-    die bewirkt, daß die Zieldateien
-    (bei einem Programm typischerweise eine ausführbare Datei,
-    bei einer Bibliothek typischerweise \file{.a}-, \file{.so}- sowie \file{.h}-Dateien)
-    an ihren endgültigen Bestimmungsort kopiert werden.
-  \end{experts}
-
-  \subsubsection{Fazit: 3 Sprachen}
-
-  Um in C programmieren zu können, muß man also tatsächlich drei
-  Sprachen lernen:
-  \begin{itemize}
-    \item C selbst,
-    \item die Präprozessor-Sprache
-    \item und die \lstinline[style=cmd]{make}-Sprache.
-  \end{itemize}
-  Durch Entwicklungsumgebungen wie z.\,B.\ \file{Eclipse} läßt sich der
-  \lstinline[style=cmd]{make}-Anteil teilweise automatisieren. (\file{Eclipse} z.\,B.\ schreibt ein
-  Makefile; andere Umgebungen übernehmen die Funktionalität von \lstinline[style=cmd]{make}
-  selbst.) Auch dort muß man jedoch die zu einem Projekt gehörenden
-  Dateien verwalten.
-
-  Wenn sich dann eine Datei nicht an dem Ort befindet,
-  erhält man u.\,U.\ wenig aussagekräftige Fehlermeldungen, z.\,B.: 
-  \begin{lstlisting}[style=terminal]
-    make: *** No rule to make target `MeinProgramm.elf', needed by `elf'.  Stop.
-  \end{lstlisting}
-  Wenn man dann um die Zusammenhänge weiß ("`Welche Bibliotheken verwendet mein
-  Programm? Wo befinden sich diese? Und wie erfährt der Linker davon?"'),
-  kann man das Problem systematisch angehen und ist nicht auf Herumraten
-  angewiesen.
-
-  \section{Hardwarenahe Programmierung}
-
-  \subsection{Bit-Operationen}
-
-  \setlength{\unitlength}{12pt}
-
-  \subsubsection{Zahlensysteme}
-
-  \subsubsection*{Dezimalsystem}
-  \begin{itemize}
-    \item
-      Basis: 10
-    \item
-      Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
-  \end{itemize}
-  \begin{verbatim}
-    137                               137
-                                    +  42
-                                     ----
-                                      179
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(5.0,4.25){\vector(-1,1){1.41}}
-    \put(5.5,4){\mbox{Einer: $7 \cdot 10^0$}}
-    \put(5.5,3.25){\vector(-1,1){2.41}}
-    \put(6.0,3){\mbox{Zehner: $3 \cdot 10^1$}}
-    \put(6.0,2.25){\vector(-1,1){3.41}}
-    \put(6.5,2){\mbox{Hunderter: $1 \cdot 10^2$}}
-    \put(2.5,0.5){\mbox{$137_{10} = 1 \cdot 10^2 + 3 \cdot 10^1 + 7 \cdot 10^0
-                                  = 100 + 30 + 7 = 137$}}
-  \end{picture}
-
-  \goodbreak
-  \subsubsection*{Hexadezimalsystem}
-  \begin{itemize}
-    \item
-      Basis: 16
-    \item
-      Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
-  \end{itemize}
-  \begin{verbatim}
-    137                               A380
-                                    + B747
-                                     -----
-                                     15AC7
-  \end{verbatim}
-  \begin{picture}(0,0)(-0,-0.25)
-    \put(18.6,4.2){\mbox{\scriptsize\texttt{1}}}
-    \color{red}
-    \put(5.0,4.25){\vector(-1,1){1.41}}
-    \put(5.5,4){\mbox{$7 \cdot 16^0$}}
-    \put(5.5,3.25){\vector(-1,1){2.41}}
-    \put(6.0,3){\mbox{$3 \cdot 16^1$}}
-    \put(6.0,2.25){\vector(-1,1){3.41}}
-    \put(6.5,2){\mbox{$1 \cdot 16^2$}}
-    \put(2.5,0.5){\mbox{$137_{16} = 1 \cdot 16^2 + 3 \cdot 16^1 + 7 \cdot 16^0
-                                  = 256 + 48 + 7 = 311$}}
-  \end{picture}
-  \begin{itemize}
-    \item
-      Schreibweise in C: \quad \texttt{0x137}
-  \end{itemize}
-
-  \goodbreak
-  \subsubsection*{Oktalsystem}
-  \begin{itemize}
-    \item
-      Basis: 8
-    \item
-      Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7
-  \end{itemize}
-  \begin{verbatim}
-    137                               137
-                                    +  42
-                                     ----
-                                      201
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \put(19.6,3.7){\mbox{\scriptsize\texttt{1}}}
-    \put(19.1,3.7){\mbox{\scriptsize\texttt{1}}}
-    \color{red}
-    \put(5.0,4.25){\vector(-1,1){1.41}}
-    \put(5.5,4){\mbox{$7 \cdot 8^0$}}
-    \put(5.5,3.25){\vector(-1,1){2.41}}
-    \put(6.0,3){\mbox{$3 \cdot 8^1$}}
-    \put(6.0,2.25){\vector(-1,1){3.41}}
-    \put(6.5,2){\mbox{$1 \cdot 8^2$}}
-    \put(2.5,0.5){\mbox{$137_8 = 1 \cdot 8^2 + 3 \cdot 8^1 + 7 \cdot 8^0
-                               = 64 + 24 + 7 = 95$}}
-    \put(2.5,-0.6){\mbox{$42_8 = 4 \cdot 8^1 + 2 \cdot 8^0
-                               = 32 + 2 = 34$}}
-    \put(2.5,-1.7){\mbox{$201_8 = 2 \cdot 8^2 + 0 \cdot 8^1 + 1 \cdot 8^0
-                               = 128 + 1 = 129$}}
-  \end{picture}
-  \vspace{0.75cm}
-  \begin{itemize}
-    \item
-      Schreibweise in C: \quad \texttt{0137}
-  \end{itemize}
-
-  \subsubsection*{Rechner für beliebige Zahlensysteme: GNU bc}
-  \begin{lstlisting}[style=terminal]
-    $ ¡bc
-    ibase=8
-    137¿
-    95
-    ¡obase=10
-    137 + 42¿
-    201
-  \end{lstlisting}
-  \begin{picture}(0,0)(0.5,1.2)
-    \color{red}
-    \put(8.0,7.25){\vector(-1,0){3}}
-    \put(8.5,7){\mbox{Eingabe zur Basis 8}}
-    \put(8.0,6.25){\vector(-1,0){4}}
-    \put(8.5,6){\mbox{Ausgabe zur Basis 10}}
-    \put(9.0,5.25){\vector(-1,0){2}}
-    \put(9.5,5){\mbox{Eingabe zur Basis 8 ($10_8 = 8$)}}
-    \put(8.0,3.25){\vector(-1,0){4}}
-    \put(8.5,3){\mbox{Ausgabe zur Basis 8}}
-  \end{picture}\vspace{-2ex}
-
-  \goodbreak
-  \subsubsection*{Binärsystem}
-  \begin{itemize}
-    \item
-      Basis: 2
-    \item
-      Gültige Ziffern: 0, 1
-  \end{itemize}
-  \begin{verbatim}
-    110                                110
-                                    + 1100
-                                     -----
-                                     10010
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \put(19.1,3.8){\mbox{\scriptsize\texttt{1}}}
-    \put(18.6,3.8){\mbox{\scriptsize\texttt{1}}}
-    \color{red}
-    \put(5.0,4.25){\vector(-1,1){1.41}}
-    \put(5.5,4){\mbox{$0 \cdot 2^0$}}
-    \put(5.5,3.25){\vector(-1,1){2.41}}
-    \put(6.0,3){\mbox{$1 \cdot 2^1$}}
-    \put(6.0,2.25){\vector(-1,1){3.41}}
-    \put(6.5,2){\mbox{$1 \cdot 2^2$}}
-    \put(2.5,0.5){\mbox{$110_2 = 1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0
-                                  = 4 + 2 + 0 = 6$}}
-  \end{picture}
-  \begin{itemize}
-    \item
-      Binär-Zahlen ermöglichen es, elektronisch zu rechnen \dots
-    \item
-      und mehrere "`Ja/Nein"' (Bits) zu einer einzigen Zahl zusammenzufassen.
-    \goodbreak
-    \item
-      \textbf{Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise
-      in Binär-Zahlen umrechnen:}
-  \end{itemize}
-  \vspace*{-6mm}
-  \begin{verbatim}
-     000 0        0000 0  1000 8
-     001 1        0001 1  1001 9
-     010 2        0010 2  1010 A
-     011 3        0011 3  1011 B
-     100 4        0100 4  1100 C
-     101 5        0101 5  1101 D
-     110 6        0110 6  1110 E
-     111 7        0111 7  1111 F
-  \end{verbatim}
-  \vspace*{-1cm}
-  \begin{itemize}
-    \item[]
-      Beispiel: $1101011_2 = 153_8 = 6{\rm B}_{16}$
-    \item[]
-      Anwendungsbeispiel: Oktal-Schreibweise für Unix-Zugriffsrechte\\
-      \lstinline[style=terminal]|-rw-r-----| $= 0\,110\,100\,000_2 = 640_8$ \qquad \lstinline[style=terminal]|$ chmod 640 file.c|\\
-      \lstinline[style=terminal]|-rwxr-x---| $= 0\,111\,101\,000_2 = 750_8$ \qquad \lstinline[style=terminal]|$ chmod 750 subdir|
-  \end{itemize}
-
-  \goodbreak
-  \subsubsection*{IP-Adressen (IPv4)}
-  \begin{itemize}
-    \item
-      Basis: 256
-    \item
-      Gültige Ziffern: 0 bis 255, getrennt durch Punkte
-    \item
-      Kompakte Schreibweise für Binärzahlen mit 32 Ziffern (Bits)
-  \end{itemize}
-  \begin{verbatim}
-    192.168.0.1
-
-
-
-
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(8.75,5.25){\vector(-1,1){1.41}}
-    \put(9.25,5){\mbox{$1 \cdot 256^0$}}
-    \put(8.75,4.25){\vector(-1,1){2.41}}
-    \put(9.25,4){\mbox{$0 \cdot 256^1$}}
-    \put(8.25,3.25){\vector(-1,1){3.41}}
-    \put(8.75,3){\mbox{$168 \cdot 256^2$}}
-    \put(7.5,2.25){\vector(-1,1){4.41}}
-    \put(8.0,2){\mbox{$192 \cdot 256^3$}}
-    \put(2.5,0.5){\mbox{$192.168.0.1_{256} = 11000000\,10101000\,00000000\,00000001_2$}}
-  \end{picture}
-  \vspace*{-0.5cm}
-
-  \goodbreak
-  \subsubsection{Bit-Operationen in C}
-  \begin{verbatim}
-      0110       0110       0110       0110                  0110
-    + 1100     | 1100    &  1100    ^  1100    ~  1100   >>     2
-     -----      -----      -----      -----      -----      -----
-     10010       1110       0100       1010       0011       0001
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(2.5,1.0){\mbox{Addition}}
-    \put(8.5,1.0){\mbox{Oder}}
-    \put(14.0,1.0){\mbox{Und}}
-    \put(18.0,1.0){\mbox{Exklusiv-Oder}}
-    \put(24.5,1.0){\mbox{Negation}}
-    \put(29.0,1.0){\mbox{Bit-Verschiebung}}
-  \end{picture}
-
-  \begin{verbatim}
-      01101100            01101100            01101100
-    | 00000010          & 11110111          ^ 00010000
-     ---------           ---------           ---------
-      01101110            01100100            01111100
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(2.5,1.0){\mbox{Bit gezielt setzen}}
-    \put(12.5,1.0){\mbox{Bit gezielt löschen}}
-    \put(22.5,1.0){\mbox{Bit gezielt umklappen}}
-  \end{picture}
-  \begin{itemize}
-    \item
-      Bits werden häufig von rechts und ab 0 numeriert (hier: 0 bis 7),\\
-      um die Maskenerzeugung mittels Schiebeoperatoren zu erleichtern.
-    \item
-      Die Bit-Operatoren (z.\,B.\ \lstinline|&| in C)
-      wirken jeweils auf alle Bits der Zahlen.
-      \hfill{\color{red}\lstinline|6 & 12 == 4|}\qquad\strut\\
-      Die logischen Operatoren (z.\,B.\ \lstinline|&&| in C)
-      prüfen die Zahl insgesamt auf $\ne 0$.
-      \hfill{\color{red}\lstinline|6 && 12 == 1|}\qquad\strut\\
-      Nicht verwechseln!
-  \end{itemize}
-
-  \bigbreak
-  
-  Anwendung: Bit 2 (also das dritte Bit von rechts) in einer 8-Bit-Zahl auf 1 setzen:
-  \begin{verbatim}
-      00000001            01101100
-   <<        2          | 00000100
-     ---------           ---------
-      00000100            01101100
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(3.5,1.0){\mbox{Maske für Bit 2}}
-    \put(12.5,1.0){\mbox{Bit gezielt setzen}}
-  \end{picture}\vspace{-4ex}
-  \begin{itemize}
-    \item
-      Schreibweise in C:\quad
-      \lstinline,a |= 1 << 2;,
-  \end{itemize}
-
-  \bigbreak
-  
-  Anwendung: Bit 2 in einer 8-Bit-Zahl auf 0 setzen:
-  \begin{verbatim}
-      00000001                                01101100
-   <<        2          ~ 00000100          & 11111011
-     ---------           ---------           ---------
-      00000100            11111011            01101000
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(3.5,1.0){\mbox{Maske zum Löschen von Bit 2 erzeugen}}
-    \put(22.5,1.0){\mbox{Bit gezielt löschen}}
-  \end{picture}\vspace{-4ex}
-  \begin{itemize}
-    \item
-      Schreibweise in C:\quad
-      \lstinline,a &= ~(1 << 2);,
-  \end{itemize}
-
-  \bigbreak
-
-  Anwendung: Bit 2 aus einer 8-Bit-Zahl extrahieren:
-  \begin{verbatim}
-      00000001            01101100            00000100
-   <<        2          & 00000100         >>        2
-     ---------           ---------           ---------
-      00000100            00000100            00000001
-  \end{verbatim}
-  \begin{picture}(0,0)(0,-0.25)
-    \color{red}
-    \put(2.5,1.0){\mbox{Maske für Bit 2}}
-    \put(12.5,1.0){\mbox{Bit 2 isolieren}}
-    \put(22.5,1.0){\mbox{in Zahl 0 oder 1 umwandeln}}
-  \end{picture}\vspace{-4ex}
-  \begin{itemize}
-    \item
-      Schreibweise in C:\quad
-      \lstinline,x = (a & (1 << 2)) >> 2;,
-  \end{itemize}
-
-  \bigbreak
-
-  Beispiel: Netzmaske für 256 IP-Adressen
-  \begin{verbatim}
-      192.168.  1.123
-    & 255.255.255.  0
-     ----------------
-      192.168.  1.  0
-  \end{verbatim}
-  \begin{picture}(0,0)(0,0)
-    \color{red}
-    \put(14.0,6.25){\vector(-1,0){2}}
-    \put(14.5,6){\mbox{IP-Adresse eines Rechners}}
-    \put(14.0,5.25){\vector(-1,0){2}}
-    \put(14.5,5){\mbox{Netzmaske: $255 = 11111111_2$}}
-    \put(14.0,3.25){\vector(-1,0){2}}
-    \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}}
-  \end{picture}\vspace{-6ex}
-
-  \bigbreak
-
-  Beispiel: Netzmaske für 8 IP-Adressen
-  \begin{verbatim}
-      192.168.  1.123                                   01111011
-    & 255.255.255.248                                 & 11111000
-     ----------------                                  ---------
-      192.168.  1.120                                   01111000
-  \end{verbatim}
-  \begin{picture}(0,0)(0,0)
-    \color{red}
-    \put(14.0,6.25){\vector(-1,0){2}}
-    \put(14.5,6){\mbox{IP-Adresse eines Rechners}}
-    \put(14.0,5.25){\vector(-1,0){2}}
-    \put(14.5,5){\mbox{Netzmaske}}
-    \put(14.0,3.25){\vector(-1,0){2}}
-    \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}}
-  \end{picture}\vspace{-6ex}
-
-  \subsection{Programmierung von Mikrocontrollern}
-
-  Ein Mikrocontroller ist ein elektronischer Baustein,
-  der einen kompletten Computer mit eingeschränkter Funktionalität enthält.
-
-  Mit "`eingeschränkter Funktionalität"' ist gemeint,
-  daß auf einem Mikrocontroller kein Universal-Betriebssystem läuft,
-  sondern daß darauf nur ein einziges Programm läuft,
-  nämlich die Anwendungs-Software.
-
-  Wenn ein Baustein einen kompletten Computer enthält,
-  der leistungsfähig genug ist,
-  daß darauf ein Universal-Betriebssystem laufen kann,
-  spricht man normalerweise nicht mehr von einem Mikrocontroller,
-  sondern von einem Ein-Chip-Computer.
-  Der Übergang ist fließend.
-
-  \breath
-
-  Da ein Mikrocontroller nicht über die Leistung verfügt,
-  einen Compiler laufen zu lassen,
-  erfolgt die Entwicklung von Software für Mikrocontroller
-  auf einem "`normalen"' Computer.
-  Diese Art der Software-Entwicklung,
-  bei der ein Computer Software für einen ganz anderen Computer erzeugt,
-  bezeichnet man als \newterm{Cross-Entwicklung}.
-  Die einzelnen Werkzeuge heißen entsprechend
-  \newterm{Cross-Compiler}, \newterm{Cross-Assembler\/} und \newterm{Cross-Linker}.
-
-  Beispiel: Erzeugen einer ausführbaren Datei \file{blink.elf}
-  aus einem C-Quelltext \file{blink.c}
-  für einen Mikrocontroller vom Typ ATmega328P
-  \begin{lstlisting}[style=cmd]
-    avr-gcc -Wall -Os -mmcu=atmega328p blink.c -o blink.elf
-  \end{lstlisting}
-
-  Damit der Mikrocontroller die ausführbare Datei ausführen kann,
-  muß man sie mit einem speziellen Werkzeug auf den Mikrocontroller
-  \newterm{herunterladen}.
-  Hierfür ist es oft notwendig, die Datei vorher in ein anderes Dateiformat
-  zu konvertieren.
-
-  Beispiel: Konvertierung der ausführbaren Datei \file{blink.elf}
-  aus dem ELF-Dateiformat in das Intel-HEX-Format:
-  \begin{lstlisting}[style=cmd]
-    avr-objcopy -O ihex blink.elf blink.hex
-  \end{lstlisting}
-
-  Anschließend kann die Datei auf den Mikrocontroller heruntergeladen werden.
-  Beispiel: Herunterladen der Datei \file{blink.hex}
-  in den Flash-Speicher eines ATmega328P-Mikrocontrollers
-  auf einem Mikrocontroller-Board vom Typ Arduino Uno
-  über die Schnittstelle \file{/dev/ttyACM0}
-  \begin{lstlisting}[style=cmd]
-    avrdude -P /dev/ttyACM0 -c arduino -p m328p -U flash:w:blink.hex
-  \end{lstlisting}
-
-  \subsection{I/O-Ports}
-
-  Es gibt drei grundlegende Mechanismen für die Kommunikation zwischen dem Prozessor
-  und einem externen Gerät:
-  \begin{itemize}
-    \item
-      Über Output-Ports kann der Prozessor das Gerät aktiv steuern,
-    \item
-      über Input-Ports kann er es aktiv abfragen,
-    \item
-      und über Interrupts kann das externe Gerät im Prozessor Aktivitäten auslösen.
-  \end{itemize}
-
-  \begin{center}
-    \includegraphics{io-ports-and-interrupts.pdf}
-  \end{center}
-
-  \setlength{\unitlength}{1cm}
-
-  Input- und Output-Ports, zusammengefaßt: I/O-Ports,
-  sind spezielle Speicherzellen, die mit einem externen Gerät verbunden sind.
-  \begin{itemize}
-    \item
-      Ein in einen Output-Port geschriebener Wert bewirkt eine Spannungsänderung in einer Leitung,
-      die zu einem externen Gerät führt.
-    \item
-      Wenn ein externes Gerät eine Spannung an eine Leitung anlegt, die zu einer Speicherzelle führt,
-      kann der Prozessor diese als Input-Port lesen.
-  \end{itemize}
-
-  Um z.\,B.\ auf einen Druck auf einen Taster zu warten,
-  kann ein Program periodisch in einer Schleife einen Input-Port lesen
-  und die Schleife erst dann beenden, wenn der Wert für "`Taster gedrückt"' gelesen wurde.
-
-  Diese Methode heißt "`Busy Waiting"': Der Prozessor ist vollständig mit Warten beschäftigt.
-  Wenn gleichzeitig noch andere Aktionen stattfinden sollen,
-  müssen diese in der Schleife mit berücksichtigt werden.
-
-  \bigskip
-  \goodbreak
-
-  Beispiel für die Verwendung eines Output-Ports: Roboter-Steuerung\\
-  Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\
-  Suchbegriff: setMotorDir
-  \goodbreak
-  \begin{lstlisting}
-    void setMotorDir(uint8_t left_dir, uint8_t right_dir)
-    {
-            mleft_dir = left_dir;
-            mright_dir = right_dir;
-            mleft_des_dir = left_dir;
-            mright_des_dir = right_dir;
-            if(left_dir)
-                    PORTC |= DIR_L;
-            else
-                    PORTC &= ~DIR_L;
-            if(right_dir)
-                    PORTC |= DIR_R;
-            else
-                    PORTC &= ~DIR_R;
-    }
-  \end{lstlisting}
-
-  Die Variable \lstinline|PORTC| ist ein Output-Port.
-  Durch Manipulation einzelner Bits in dieser Variablen
-  ändert sich die Spannung an den elektrischen "`Beinchen"' des Mikrocontrollers.
-  Hierdurch wird die Beschaltung von Elektromotoren umgepolt.
-
-  (Die Konstanten \lstinline|DIR_L| und \lstinline|DIR_R| sind "`Bitmasken"',
-  d.\,h.\ Zahlen, die in ihrer Binärdarstellung nur eine einzige $1$ und ansonsten Nullen haben.
-  Durch die Oder- und Und-Nicht-Operationen werden einzelne Bits in \lstinline|PORTC| auf $1$ bzw.\ $0$ gesetzt.)
-
-  \bigskip
-
-  Die direkte Ansteuerung von I/O-Ports ist nur auf Mikrocontrollern üblich.
-  Auf Personal-Computern erfolgt die gesamte Ein- und Ausgabe über Betriebssystem-"`Treiber"'.
-  Anwenderprogramme greifen dort i.\,d.\,R.\ nicht direkt auf I/O-Ports zu.
-
-  \subsection{Interrupts}
-
-  Ein Interrupt ist ein Unterprogramm, das nicht durch einen Befehl (\lstinline|call|),
-  sondern durch ein externes Gerät (über ein Stromsignal) aufgerufen wird.
-
-  Damit dies funktionieret, muß die Adresse, an der sich das Unterprogramm befindet,
-  an einer jederzeit auffindbaren Stelle im Speicher hinterlegt sein.
-  Diese Stelle heißt "`Interrupt-Vektor"'.
-
-  Da ein Interrupt jederzeit erfolgen kann,
-  hat das Hauptprogramm keine Chance, vor dem Aufruf die Registerinhalte zu sichern.
-  Für Interrupt-Unterprogramme, sog.\ Interrupt-Handler,
-  ist es daher zwingend notwendig, sämtliche Register vor Verwendung zu sichern
-  und hinterher zurückzuholen.
-
-  \bigskip
-
-  Beispiel für die Verwendung eines Interrupts: Roboter-Steuerung\\
-  Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\
-  Suchbegriff: ISR
-  \begin{lstlisting}
-    ISR (INT0_vect)
-    {
-            mleft_dist++;
-            mleft_counter++;
-            /* ... */
-    }
-  \end{lstlisting}
-  \begin{itemize}
-    \item
-      Durch das Schlüsselwort \lstinline|ISR| anstelle von z.\,B.\ \lstinline|void|
-      teilen wir dem Compiler mit, daß es sich um einen Interrupt-Handler handelt,
-      so daß er entsprechenden Code zum Sichern der Registerinhalte einfügt.
-    \item
-      Durch die Namensgebung \lstinline|INT0_vect| teilen wir dem Compiler mit,
-      daß er den Interrupt-Vektor Nr.\ 0 (also den ersten)
-      auf diesen Interrupt-Handler zeigen lassen soll.
-  \end{itemize}
-  (Tatsächlich handelt es sich bei \lstinline|ISR| und \lstinline|INT0_vect| um Macros.)
-
-  Die Schreibweise ist spezifisch für die Programmierung des Atmel AVR ATmega
-  unter Verwendung der GNU Compiler Collection (GCC).
-  Bei Verwendung anderer Werkzeuge und/oder Prozessoren
-  kann dasselbe Programm völlig anders aussehen.
-  Wie man Interrupt-Handler schreibt und wie man Interrupt-Vektoren setzt,
-  ist ein wichtiger Bestandteil der Dokumentation der Entwicklungswerkzeuge.
-
-  \bigskip
-
-  Die so geschriebene Funktion wird immer dann aufgerufen, wenn die
-  Hardware den Interrupt Nr.\ 0 auslöst. Wann das der Fall ist, hängt
-  von der Beschaltung ab. Im Falle des RP6 geschieht es dann, wenn
-  ein Sensor an der linken Raupenkette einen schwarzen Streifen auf
-  der Encoder-Scheibe registriert, also immer dann, wenn sich die
-  linke Raupenkette des Roboters um eine bestimmte Strecke gedreht
-  hat.
-
-  Jedesmal wenn sich die Raupenkette um einen Teilstrich weitergedreht hat,
-  werden also zwei Zähler inkrementiert.
-  Wir können dies nutzen, um z.\,B.\ durch Auslesen des Zählers \lstinline|mleft_dist|
-  die zurückgelegte Entfernung zu messen.
-  (Die RP6-Bibliothek selbst stellt nur eine Zeit- und eine Geschwindigkeitsmessung zur Verfügung.)
-  Wie dies konkret geschehen kann, sei im folgenden vorgestellt.
-
-  \goodbreak
-
-  Methode 1: Verändern des Interrupt-Handlers
-  \begin{itemize}
-    \item
-      Da die Bibliothek \lstinline|RP6RobotBase| im Quelltext vorhanden ist,
-      können wir sie selbst ändern und in den Interrupt-Handler
-      \lstinline|ISR (INT0_vect)| einen eigenen Zähler für Sensor-Ticks einbauen.
-    \item
-      Wenn wir diesen zum Zeitpunkt A auf 0 setzen und zum Zeitpunkt B
-      auslesen, erfahren wir, wieviele "`Ticks"' der Roboter dazwischen
-      zurückgelegt hat.
-  \end{itemize}
-
-  Methode 2: Verwenden eines vorhandenen Zählers
-  \begin{itemize}
-    \item
-      Tatsächlich enthält \lstinline|ISR (INT0_vect)| bereits zwei Zähler, die
-      bei jedem Sensor-"`Tick"' hochgezählt werden: \lstinline|mleft_dist| und
-      \lstinline|mleft_counter|.
-    \item
-      Einer davon (\lstinline|mleft_dist|) wird bei jedem \lstinline|move()| auf 0
-      zurückgesetzt. Für diesen Zähler enthält \lstinline|RP6RobotBaseLib.h|
-      einen "`undokumentierten"' Makro \lstinline|getLeftDistance()|, um ihn
-      auszulesen.
-    \item
-      Bei sorgfältiger Lektüre von \lstinline|RP6RobotBaseLib.c| erkennt man, daß
-      es unproblematisch ist, den Zähler vom Hauptprogramm aus auf 0 zu
-      setzen. (Dies ist jedoch mit Vorsicht zu genießen: In einer
-      eventuellen Nachfolgeversion der Bibliothek muß dies nicht mehr
-      der Fall sein!)
-  \end{itemize}
-
-  Methode 3: Abfrage der Sensoren mittels Busy Waiting
-  \begin{itemize}
-    \item
-      Alternativ zur Verwendung des Interrupt-Handlers kann man auch
-      von der eigenen Hauptschleife aus den Sensor periodisch abfragen
-      und bei jeder Änderung einen Zähler hochzählen. 
-    \item
-      Diese Methode heißt "`Busy Waiting"'. Sie hat den Vorteil der
-      Einfachheit aber den Nachteil, daß der Prozessor "`in Vollzeit"'
-      damit beschäftigt ist, einen Sensor abzufragen, und eventuelle
-      andere Aufgaben nur noch "`nebenher"' erledigen kann. 
-    \item
-      Wenn aus irgendwelchen Gründen der Interrupt-Mechanismus nicht
-      verwendet werden kann (z.B. weil der Prozessor über kein
-      Interrupt-Konzept verfügt), könnten wir die Lichtschranke alternativ auch mit einem Input-Port
-      verdrahten und mittels Busy Waiting abfragen.
-
-      Dies funktioniert nur dann, wenn die Schleife wirklich regelmäßig den Sensor abfragt.
-      Sobald der Prozessor längere Zeit mit anderen Dingen beschäftigt ist,
-      können beim Busy Waiting Signale der Lichtschranke verlorengehen.
-      Dieses Problem besteht nicht bei Verwendung von Interrupts.
-  \end{itemize}
-
-  \subsection{volatile-Variable}
-
-  Im C-Quelltext fällt auf, daß die Zähler-Variablen \lstinline|mleft_dist| und \lstinline|mleft_counter|\\
-  als \lstinline|volatile uint16_t mleft_counter| bzw.\ \lstinline|volatile uint16_t mleft_dist| deklariert sind\\
-  anstatt einfach nur als \lstinline|uint16_t mleft_counter| und \lstinline|uint16_t mleft_dist|.
-
-  Das Schlüsselwort \lstinline|volatile| teilt dem C-Compiler mit,
-  daß eine Variable immer im Speicher (RAM) aufbewahrt werden muß
-  und nicht in einem Prozessorregister zwischengespeichert werden darf.
-
-  Dies ist deswegen wichtig, weil jederzeit ein Interrupt erfolgen
-  kann, der den Wert der Variablen im Speicher verändert. Wenn im
-  Hauptprogramm alle "`überflüssigen"' Speicherzugriffe wegoptimiert
-  wurden, erfährt es nichts von der Änderung.
-
-  Entsprechendes gilt für I/O-Ports:
-  Wenn ein Programm einen Wert in einen Output-Port schreiben oder aus einem Input-Port lesen soll,
-  ist es wichtig, daß der Speicherzugriff auch tatsächlich stattfindet.
-
-\iffalse
-
-  \subsection{Software-Interrupts}
- 
-  Manche Prozessoren verfügen über einen Befehl, um Interrupts "`künstlich"' auszulösen.
-
-  Das Betriebssystem MS-DOS verwendet derartige Aufrufe
-  anstelle von "`normalen"' Unterprogrammaufrufen,
-  um Programmen Funktionen zur Verfügung zu stellen.
-
-  \bigskip
-  \goodbreak
-
-  Beispiel: Assembler-Version von \lstinline| printf ("Hello, world!\n") | unter MS-DOS bzw.\ Unix
-
-  \medskip
-
-  \lstinline|  |MS-DOS-Version für FASM (gekürzt)\hspace{3cm} Unix-Version für GCC (gekürzt)
-  \begin{verbatim}
-  hello  db 'Hello, world', 10, 13, '$'     hello:
-                                                    .string "Hello, world!\n"
-  mov ah, 09h
-  mov dx, hello                                     pushl   $hello
-  int 21h                                           call    printf\end{verbatim}
-
-  \begin{itemize}
-    \item
-      Die MS-DOS-Version ruft den Interrupt Nr.\ 33 (hexadezimal: 21) auf: \lstinline| int 21h|.\\
-      Die Unix-Version verwendet stattdessen einen normalen Unterprogrammaufruf: \lstinline| call printf|.
-    \item
-      Die MS-DOS-Version übergibt Parameter in Prozessorregistern:\\
-      Die Konstante \lstinline|09h| im \lstinline|ah|-Register wählt die Funktion "`Textausgabe"' aus;\\
-      das \lstinline|dx|-Register enthält einen Zeiger auf den Text.
-
-      Die Unix-Version benutzt den Stack zur Übergabe des Parameters: \lstinline| pushl $hello|.\\
-      (\lstinline|$hello| ist ein Zeiger auf den Text.)
-    \item
-      Obwohl beide Programme auf demselben Prozessor laufen,
-      unterscheiden sich die Sprachdialekte der beiden Assember FASM und GCC erheblich voneinander.\\
-      (Reihenfolge der Operanden umgekehrt, Suffix \lstinline|l| für "`long"', Präfix \lstinline|$| für Konstanten, \dots)
-  \end{itemize}
-
-  Derartige "`Software-Interrupts"' verursachen Probleme,
-  sobald ein Gerät den Interrupt für seinen eigentlichen Zweck verwendet.
-  MS-Windows verwendet -- außer zur Emulation von MS-DOS -- keine Software-Interrupts mehr.
-
-  \bigskip
-
-  (Ein sehr ähnlicher Mechanismus wird von modernen Betriebssystemen weiterhin für Systemaufrufe genutzt.
-  Hier geht es darum, den Übergang von potentiell unsicherem Code in Anwenderprogrammen
-  zum vertrauenswürdigen Code des Betriebssystems zu kontrollieren. Für Details siehe:\\
-  \url{http://de.wikipedia.org/wiki/Software-Interrupt}, \url{http://de.wikipedia.org/wiki/Systemaufruf})
-
-\fi
-
-  \subsection{Byte-Reihenfolge -- Endianness}
-
-  \subsubsection{Konzept}
-
-  Beim Speichern von Werten,
-  die größer sind als die kleinste adressierbare Einheit\\
-  (= Speicherzelle oder Speicherwort, häufig 1 Byte), werden mehrere Speicherworte belegt.
-
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-  \begin{displaymath}
-    1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}
-  \end{displaymath}
-
-  Diese 16-Bit-Zahl kann auf zwei verschiedene Weisen
-  in zwei 8-Bit-Speicherzellen gespeichert werden:
-  \begin{center}
-    \begin{tabular}{|c|c|l}\cline{1-2}
-      \raisebox{-1pt}{04} & \raisebox{-1pt}{03} & \strut \newterm{Big-Endian}, "`großes Ende zuerst"', \\\cline{1-2}
-      \multicolumn{2}{c}{} & für Menschen leichter lesbar \\
-      \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
-      \raisebox{-1pt}{03} & \raisebox{-1pt}{04} & \strut \newterm{Little-Endian}, "`kleines Ende zuerst"', \\\cline{1-2}
-      \multicolumn{2}{c}{} & bei Additionen effizienter \\
-      \multicolumn{2}{c}{} & (Schriftliches Addieren beginnt immer beim Einer.)
-    \end{tabular}
-  \end{center}
-  Welche Konvention man verwendet, ist letztlich Geschmackssache
-  und hängt von der verwendeten Hardware (Prozessor) und Software ab.
-  Man spricht hier von der \newterm{Endianness\/} (Byte-Reihenfolge) der Hardware bzw.\ der Software.
-
-  Im Kontext des Datenaustausches ist es wichtig,
-  sich auf eine einheitliche Endianness zu verständigen.
-  Dies gilt insbesondere für:
-  \begin{itemize}
-    \item
-      Dateiformate
-    \item
-      Datenübertragung
-  \end{itemize}
-
-  \goodbreak
-  \subsubsection{Dateiformate}
-
-  Als Beispiel für Dateiformate, in denen die Reihenfolge der Bytes
-  in 16- und 32-Bit-Zahlen spezifiziert ist, seien hier Audio-Formate genannt:
-  \begin{itemize}
-    \item
-      RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
-    \item
-      Au-Dateien (\file{.au}): Big-Endian
-    \goodbreak
-    \item
-      ältere AIFF-Dateien (\file{.aiff}): Big-Endian
-    \item
-      neuere AIFF-Dateien (\file{.aiff}): Little-Endian
-  \end{itemize}
-  Insbesondere ist es bei AIFF-Dateien wichtig, zu prüfen,
-  um welche Variante es sich handelt, anstatt sich auf eine bestimmte Byte-Reihenfolge zu verlassen.
-
-  Bei Dateiformaten mit variabler Endianness ist es sinnvoll und üblich,
-  die Endianness durch eine Kennung anzuzeigen.
-  Dies geschieht häufig am Anfang der Datei (im "`Vorspann"' -- "`Header"').
-
-  \bigbreak
-
-  Als weiteres Beispiel seien zwei Monochrom-Grafik-Formate genannt.
-  Hier steht jedes Bit für einen schwarzen bzw.\ weißen Bildpunkt,
-  daher spielt die Reihenfolge der Bits in den Bytes eine entscheidende Rolle.
-  (Diese Grafik-Formate werden in Übungsaufgaben weiter vertieft.)
-  \begin{itemize}
-    \item
-      PBM-Dateien: Big-Endian, \newterm{MSB first\/} -- die höchstwertige Binärziffer ist im Bild links
-    \item
-      XBM-Dateien: Little-Endian, \newterm{LSB first\/} -- die höchstwertige Binärziffer ist im Bild rechts
-  \end{itemize}
-  MSB/LSB = most/least significant bit
-
-  Achtung: Die Abkürzungen "`MSB/LSB"' werden manchmal auch für "`most/least significant \emph{byte}"' verwendet.
-  Im konkreten Fall ist es ratsam, die verwendete Byte- und Bit-Reihenfolge genau zu recherchieren
-  bzw.\ präzise zu dokumentieren.
-
-%  \bigbreak
-%
-%  Weiteres Beispiel: Textdateien im Format "`UTF-16"'.
-%  Hier stehen jeweils zwei aufeinanderfolgende Bytes für eine 16-Bit-Zahl.
-%  Am Dateianfang steht stets der Wert $65279 = \lstinline|FEFF|_{16}$ \dots
-
-  \subsubsection{Datenübertragung}
-
-  Bei der Übertragung von Daten über Leitungen
-  spielt sowohl die Reihenfolge der Bits in den Bytes ("`MSB first"' bzw.\ "`LSB first"')
-  als auch die Reihenfolge der Bytes in den übertragenen Zahlen ("`Big-/Little-Endian"') eine Rolle.
-
-  Als Beispiele seien genannt:
-  \begin{itemize}
-    \item
-      RS-232 (serielle Schnittstelle): MSB first
-    \item
-      I$^2$C: LSB first
-    \item
-      USB: beides
-
-      Um Übertragungsfehler erkennen zu können, werden im USB-Protokoll
-      bestimmte Werte einmal gemäß der MSB-first- und einmal gemäß der LSB-first-Konvention
-      übertragen und anschließend auf Gleichheit geprüft.
-    \medskip
-    \item
-      Ethernet: LSB first
-    \item
-      TCP/IP (Internet): Big-Endian
-  \end{itemize}
-  Insbesondere gilt für die Übertragung z.\,B.\ einer 32-Bit-Zahl über das Internet,
-  daß die vier Bytes von links nach rechts (Big-Endian) übertragen werden,
-  die acht Bits innerhalb jedes Bytes hingegen von rechts nach links (LSB first).
-
-  \subsection{Binärdarstellung von Zahlen}
-
-  Es gibt unendlich viele verschiedene ganze Zahlen.
-  Da Speicherplatz begrenzt ist, können Rechner nur begrenzt viele Zahlen darstellen.
-  In der Praxis legt man sich auf eine Anzahl von Bits fest,
-  die eine Zahl maximal belegen darf.
-  Typischerweise handelt es sich bei dieser Anzahl von Bits
-  um eine Zweierpotenz: 8, 16, 32, 64.
-
-  Eine 8-Bit-Zahl kann per definitionem Binärzahlen von 0000\,0000 bis 1111\,1111
-  darstellen. Dezimal sind dies die Zahlen von 0 bis 255.
-  Wenn man die 8-Bit-Zahl 255 inkrementiert (= um 1 erhöht),
-  gibt es einen Überlauf, und das Rechenergebnis ist 0:
-  Die Binärzahl 1111\,1111 + 1 = 1\,0000\,0000 hat 9 Bits.
-  Wenn man das oberste Bit abschneidet, bleibt der Wert 0 übrig.
-
-  Auf Computern macht man sich dieses Verhalten
-  für die Binärdarstellung negativer Zahlen zunutze:
-  Wenn 255 + 1 (dezimal geschrieben, mit 8-Bit-Zahlen berechnet) den Wert 0 ergibt,
-  dann ist 255 dasselbe wie $-1$.
-
-  Allgemein gilt: Diejenige Zahl $y$, die ich auf eine Zahl $x$ addieren muß,
-  um auf einem $n$-Bit-Rechner einen Überlauf und das Rechenergebnis $0$ zu erhalten,
-  ist die \emph{$n$-Bit-Binärdarstellung von $-x$\/}).
-
-  Um diese Zahl direkt auszurechnen, geht man folgendermaßen vor:
-  \begin{enumerate}
-    \item
-      Man invertiert alle Bits der Zahl.\\
-      Aus 0010\,1100 (= Binärdarstellung von 44) wird so zum Beispiel 1101\,0011.
-    \item
-      Man addiert 1 zu der erhaltenen Zahl:\\
-      1101\,0011 + 1 = 1101\,0100 (= 8-Bit-Binärdarstellung von $-44$).
-  \end{enumerate}
-  Diese Darstellung negativer Zahlen heißt \newterm{Zweierkomplement}.
-
-  \goodbreak
-
-  Theoretisch kann man jede Zahl bei gegebener Rechengenauigkeit
-  sowohl als postive als auch als negative Zahl interpretieren.
-  Die folgende Konvention hat sich als sinnvoll heraugestellt:
-  \begin{itemize}
-    \item
-      Entweder betrachtet man alle Zahlen als positiv,
-    \item
-      oder man betrachtet Zahlen, deren oberstes Bit gesetzt ist, als negativ\\
-      und die anderen als positiv.
-  \end{itemize}
-
-  Für normale Anwendungen ist die genaue Anzahl der Bits einer Ganzzahl-Variablen
-  unerheblich, sofern der Wertebereich groß genug für die durchzuführenden
-  Rechnungen ist. In diesen Fällen verwendet man in C den Datentyp \lstinline{int}
-  für vorzeichenbehaftete ganze Zahlen und \lstinline{unsigned int} (oder kurz:
-  \lstinline{unsigned}) für vorzeichenlose. Für die Ausgabe mit \lstinline{printf()}
-  verwendet man \lstinline{%d} oder \lstinline{%i} für vorzeichenbehaftete und
-  \lstinline{%u} für vorzeichenlose ganze Zahlen.
-
-  Für spezielle Situationen, in denen die genaue Anzahl der Bits eine Rolle spielt,
-  stellt C (unter Verwendung von \lstinline{#include <stdint.h>}) spezielle Datentypen bereit:
-
-  \begin{center}
-    \renewcommand{\arraystretch}{1.2}
-    \newcommand{\xdots}{\hspace*{-0.7em}\dots,\hspace*{-0.7em}}
-    \begin{tabular}{|c|c|c|rcl|}\hline
-      C-Datentyp & Bits & Vorzeichen & \multicolumn{3}{c|}{Wertebereich} \\\hline\hline
-      \lstinline,int8_t, & 8 & ja & $-128$, & \xdots & $127$ \\\hline
-      \lstinline,uint8_t, & 8 & nein & $0$, & \xdots & $255$ \\\hline
-      \lstinline,int16_t, & 16 & ja & $-32\,768$, & \xdots & $32\,767$ \\\hline
-      \lstinline,uint16_t, & 16 & nein & $0$, & \xdots & $65\,535$ \\\hline
-      \lstinline,int32_t, & 32 & ja & $-2\,147\,483\,648$, & \xdots & $2\,147\,483\,647$ \\\hline
-      \lstinline,uint32_t, & 32 & nein & $0$, & \xdots & $4\,294\,967\,295$ \\\hline
-      \lstinline,int64_t, & 64 & ja & $9\,223\,372\,036\,854\,775\,808$, & \xdots & $9\,223\,372\,036\,854\,775\,807$ \\\hline
-      \lstinline,uint64_t, & 64 & nein & $0$, & \xdots & $18\,446\,744\,073\,709\,551\,615$ \\\hline
-    \end{tabular}
-  \end{center}
-
-  Man beachte, daß es keine "`allein richtige"' Binärdarstellung einer negativen Zahl gibt;
-  diese hängt vielmehr von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab.
-  Auf einem 8-Bit-Rechner ist $255$ dasselbe wie $-1$,
-  auf einem 16-Bit-Rechner ist $255$ eine "`völlig normale"' Zahl;
-  stattdessen ist $65535$ dasselbe wie $-1$.
-
-  Ebensowenig gibt es einen "`allein richtigen"' Zahlenwert eines Bitmusters.
-  Dieser Zahlenwert hängt von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab
-  und davon, ob man überhaupt negative Zahlen zuläßt
-  oder vielleicht alle Zahlen als positive Zahlen interpretiert.
-
-  \breath
-
-  Beispiel: Für welche Zahl steht der Speicherinhalt 1001\,0000\,1100\,0011
-  (binär) = 90a3 (hexadezimal)?
-
-  Die richtige Antwort auf diese Frage hängt vom Datentyp ab,
-  also von der Bitgenauigkeit des Rechenwerks
-  und davon, ob wir überhaupt mit Vorzeichen rechnen:
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,: & $-93$ & (nur unteres Byte, Little-Endian)\\
-    als \lstinline,uint8_t,: & $163$ & (nur unteres Byte, Little-Endian)\\
-    als \lstinline,int16_t,: & $-28509$\\
-    als \lstinline,uint16_t,: & $37027$\\
-    \lstinline,int32_t, oder größer: & $37027$
-      & (zusätzliche Bytes mit Nullen aufgefüllt)
-  \end{tabular}
-
-  \breath
-
-  Siehe auch: \url{http://xkcd.com/571/}
-
-  \subsection{Speicherausrichtung -- Alignment}
-
-  Ein 32-Bit-Prozessor kann auf eine 32-Bit-Variable effizienter zugreifen,
-  wenn die Speicheradresse der Variablen ein Vielfaches von 32 Bits, also 4 Bytes ist.
-  Eine Variable, auf die dies zutrifft, heißt "`korrekt im Speicher ausgerichtet"' ("`aligned"').
-
-  "`Effizienter"' kann bedeuten,
-  daß Maschinenbefehle zum Arbeiten mit den Variablen schneller abgearbeitet werden.
-  Es kann aber auch bedeuten,
-  daß der Prozessor gar keine direkte Bearbeitung von inkorrekt ausgerichteten Variablen erlaubt.
-  In diesem Fall bedeutet eine inkorrekte Speicherausrichtung,
-  daß für jede Operation mit der Variablen anstelle eines einzelnen Maschinenbefehls
-  ein kleines Programm aufgerufen werden muß.
-
-  \bigskip
-
-  Um zu verstehen, welche Konsequenzen dies für die Arbeit mit Rechnern hat,
-  betrachten wir die folgenden Variablen:
-
-  \begin{lstlisting}
-    #include <stdint.h>
-
-    uint8_t a;
-    uint16_t b;
-    uint8_t c;
-  \end{lstlisting}
-
-  Die Anordnung dieser Variablen im Speicher könnte z.\,B.\ folgendermaßen aussehen:
-
-  \begin{quote}
-    \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}}
-    \begin{tabular}{r|ccc|}
-                    & & \dots         & \\\cline{2-4}
-      \texttt{3005} & &               & \\\cline{2-4}
-      \texttt{3004} & &               & \\\cline{2-4}
-      \texttt{3003} & & \lstinline|c| & \\\cline{2-4}
-      \texttt{3002} & &               & \\\cline{2-2}\cline{4-4}
-      \texttt{3001} & & \bup          & \\\cline{2-4}
-      \texttt{3000} & & \lstinline|a| & \\\cline{2-4}
-      \texttt{2fff} & &               & \\\cline{2-4}
-                    & & \dots         &
-    \end{tabular}
-  \end{quote}
-
-  Ein optimierender Compiler wird für eine korrekte Ausrichtung der Variablen \lstinline|b| sorgen,
-  beispielsweise durch Auffüllen mit unbenutzten Speicherzellen:
-
-  \begin{quote}
-    \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}}
-    \begin{tabular}{r|ccc|}
-                    & & \dots         & \\\cline{2-4}
-      \texttt{3005} & &               & \\\cline{2-4}
-      \texttt{3004} & & \lstinline|c| & \\\cline{2-4}
-      \texttt{3003} & &               & \\\cline{2-2}\cline{4-4}
-      \texttt{3002} & & \bup          & \\\cline{2-4}
-      \texttt{3001} & &               & \\\cline{2-4}
-      \texttt{3000} & & \lstinline|a| & \\\cline{2-4}
-      \texttt{2fff} & &               & \\\cline{2-4}
-                    & & \dots         &
-    \end{tabular}
-  \end{quote}
-
-  Alternativ ist es dem Compiler auch möglich,
-  die korrekte Ausrichtung durch "`Umsortieren"' der Variablen herzustellen
-  und dadurch "`Löcher"' zu vermeiden:
-
-  \begin{quote}
-    \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}}
-    \begin{tabular}{r|ccc|}
-                    & & \dots         & \\\cline{2-4}
-      \texttt{3005} & &               & \\\cline{2-4}
-      \texttt{3004} & &               & \\\cline{2-4}
-      \texttt{3003} & &               & \\\cline{2-2}\cline{4-4}
-      \texttt{3002} & & \bup          & \\\cline{2-4}
-      \texttt{3001} & & \lstinline|c| & \\\cline{2-4}
-      \texttt{3000} & & \lstinline|a| & \\\cline{2-4}
-      \texttt{2fff} & &               & \\\cline{2-4}
-                    & & \dots         &
-    \end{tabular}
-  \end{quote}
-
-  Fazit: Man kann sich als Programmierer nicht immer darauf verlassen,
-  daß die Variablen im Speicher in einer spezifischen Weise angeordnet sind.
-
-  In vielen existierenden Programmen geschieht dies dennoch.
-  Diese Programme sind fehlerhaft.
-  Dort kann es z.\,B.\ passieren, daß nach einem Upgrade des Compilers
-  schwer lokalisierbare Fehler auftreten.
-
-  \bigskip
-  \goodbreak
-
-  Entsprechende Überlegungen gelten für 64-Bit- und 16-Bit-Prozessoren.
-  Die Größe der Variablen, aufgerundet auf die nächste Zweierpotenz, gibt eine Ausrichtung vor.
-  Die Registerbreite des Prozessors markiert die größte Ausrichtung, die noch berücksichtigt werden muß.
-
-  Bei 8-Bit-Prozessoren stellt sich die Frage nach der Speicherausrichtung normalerweise nicht,
-  weil die kleinste adressierbare Einheit eines Speichers selten kleiner als 8 Bits ist.
-
-  Beispiele:
-  \begin{itemize}
-    \item
-      Eine 64-Bit-Variable auf einem 64-Bit-Prozessor muß auf 64 Bits ausgerichtet sein.
-    \item
-      Eine 32-Bit-Variable auf einem 64-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein.
-    \item
-      Eine 64-Bit-Variable auf einem 32-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein.
-    \item
-      Eine 64-Bit-Variable auf einem 8-Bit-Prozessor braucht nur auf 8 Bits ausgerichtet zu sein.
-  \end{itemize}
-
-  Bei der Definition von Datenformaten tut man gut daran,
-  die Ausrichtung der Daten von vorneherein zu berücksichtigen,
-  um auf möglichst vielen -- auch zukünftigen -- Prozessoren
-  eine möglichst effiziente Bearbeitung zu ermöglichen.
-
-  Wenn ich beispielsweise ein Dateiformat definiere, in dem 128-Bit-Werte vorkommen,
-  ist es sinnvoll, diese innerhalb der Datei auf 128 Bits (16 Bytes) auszurichten,
-  auch wenn mein eigener Rechner nur über einen 64-Bit-Prozessor verfügt.
-
-\iffalse
-
-  \section{Ergänzungen und Ausblicke}
-
-  \subsection{String-Operationen}
-
-  Die Include-Datei \file{string.h} deklariert eine Sammlung nützlicher Funktionen
-  für den Umgang mit Strings (\lstinline{char *}).
-
-  In den Sortierprogrammen \file{sort-\lstinline{*}.c} wurde davon bereits
-  die Funktion \lstinline{strcmp()} verwendet.
-
-  \lstinline{strcmp (foo, bar)} liefert den Wert \lstinline{-1} zurück,
-  wenn der String \lstinline{foo} alphabetisch kleiner ist als der String \lstinline{bar},
-  sie liefert \lstinline{0} zurück, wenn beide Strings gleich sind,
-  und sie liefert \lstinline{1} zurück, wenn \lstinline{foo} alphabetisch größer ist als \lstinline{bar}.
-
-  \subsection{Dateien}
-
-  \begin{itemize}
-    \item
-      \file{fhello.c} ist das klassische "`Hello, world!"`-Programm in einer Variante,
-      die in eine Datei \file{hello.txt} anstelle der Standardausgabe schreibt.
-
-      \begin{experts}
-        Auch die Standardausgabe ist übrigens eine "`normale"' Datei.
-        \lstinline{printf (foo)} ist nur eine Abkürzung für \lstinline{fprintf (stdout, foo)}.
-      \end{experts}
-    \item
-      \file{fread-1.c} zeigt, wie man zeilenweise aus einer Textdatei liest.
-
-      Dieses Programm prüft nicht, ob die Datei tatsächlich
-      erfolgreich geöffnet werden konnte.
-      Dies hat zur Folge, daß im Fehlerfall versucht wird,
-      auf einen \lstinline{NULL}-Pointer zuzugreifen -- also einen Absturz.
-
-      Das Programm ist somit grob fehlerhaft.
-    \item
-      \file{fread-2.c} zeigt, wie es besser geht:
-      Wenn die Datei nicht geöffnet werden kann,
-      wird eine Fehlermeldung ausgegeben und das Programm kontrolliert beendet.
-
-      Es besteht aber weiterhin ein Problem:
-      Die Fehlerursache "`Datei nicht gefunden"' wurde lediglich geraten.
-      Sie kann falsch sein und somit, anstatt hilfreich zu sein,
-      den Benutzer in die Irre führen.
-
-      Auch dieses Programm ist also noch grob fehlerhaft.
-    \item
-      \file{fread-3.c} zeigt die korrekte Vorgehensweise:
-      Mit Hilfe der Systemvariablen \lstinline{errno} (deklariert in \file{errno.h})
-      und der Funktion \lstinline{strerror()} (deklariert in \file{string.h})
-      wird geprüft, welcher Fehler vorliegt.
-      Anhand dieser Information wird dann die vom Betriebssystem
-      für diesen Fall vorgesehene Fehlermeldung ausgegeben.
-  \end{itemize}
-
-  Dieselben Überlegungen zur Fehlerbehandlung gelten natürlich auch
-  für das Öffnen einer Datei zum Schreiben, hier also auch für \file{fhello.c}.
-
-\fi
-
-  \section{Algorithmen}
-
-  \subsection{Differentialgleichungen}
-
-  Eine mathematische Gleichung mit einer gesuchten Zahl $x$, z.\,B.
-  \begin{displaymath}
-    x + 2 = -x
-  \end{displaymath}
-  läßt sich leicht nach der Unbekannten $x$ auflösen.
-  (In diesem Fall lautet die Lösung: $x = -1$.)
-
-  Wesentlich schwieriger ist es,
-  eine mathematische Gleichung mit einer gesuchten Funktion $x(t)$ zu lösen, z.\,B.:
-  \begin{displaymath}
-    x'(t) = -x(t)\qquad\mbox{mit}\qquad x(0) = 1
-  \end{displaymath}
-  Um hier auf die Lösung $x(t) = e^{-t}$ zu kommen,
-  sind bereits weitreichende mathematische Kenntnisse erforderlich.
-
-  Eine derartige Gleichung, die einen Zusammenhang zwischen der gesuchten Funktion
-  und ihren Ableitungen vorgibt, heißt \newterm{Differentialgleichung}.
-  Viele physikalisch-technische Probleme werden durch Differentialgleichungen beschrieben.
-
-  \goodbreak
-
-  \subsubsection{Beispiel: Pendelschwingung}
-
-  \begin{minipage}{9.4cm}
-    \setlength{\parskip}{\smallskipamount}
-    Das Verhalten eines Fadenpendels (mathematisches Pendel)
-    wird durch seine Auslenkung $\phi$ als Funktion der Zeit $t$ beschrieben.
-    Wie kann man $\phi(t)$ berechnen?
-
-    Wie aus anderen Veranstaltungen (Grundlagen der Physik, Mechanik) her bekannt sein sollte,
-    wirkt auf ein Fadenpendel, das um den Winkel $\phi(t)$ ausgelenkt ist,
-    die tangentiale Kraft $F = -m \cdot g \cdot \sin\phi(t)$.
-    Gemäß der Formel $F = m \cdot a$ bewirkt diese Kraft
-    eine tangentiale Beschleunigung $a = -g \cdot \sin\phi(t)$.
-    (Das Minuszeichen kommt daher, daß die Kraft der Auslenkung entgegengesetzt wirkt.)
-
-    Wenn das Pendel die Länge $l$ hat, können wir dieselbe tangentiale Beschleunigung
-    mit Hilfe der zweiten Ableitung des Auslenkungswinkels $\phi(t)$ berechnen:
-    $a = l \cdot \phi''(t)$ (Winkel in Bogenmaß).
-    Durch Gleichsetzen erhalten wir eine Gleichung,
-    die nur noch eine Unbekannte enthält, nämlich die Funktion $\phi(t)$.
-
-    Um $\phi(t)$ zu berechnen, müssen wir also die Differentialgleichung
-    \begin{displaymath}
-      \phi''(t) = -\frac{g}{l} \cdot \sin\phi(t)
-    \end{displaymath}
-    lösen.
-  \end{minipage}\hfill
-  \begin{minipage}{5.5cm}
-    \begin{center}
-      \begin{pdfpic}
-        \psset{unit=1.5cm}%
-        \begin{pspicture}(0,0)(0,0)
-          \SpecialCoor
-          \psline[linewidth=1pt](3;-110)(0,0)
-          \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.34;-20)(1.00;-90)}
-          \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.94;-110)(1.00;-90)}
-          \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.34;-20)}
-          \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.94;-110)}
-          \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(1.00;-90)}
-          \rput(3.25;-110){\rput(0.64;-20){\makebox(0,0){$F$}}}
-          \rput(3.25;-110){\rput(1.30;-90){\makebox(0,0){$m\cdot g$}}}
-          \pscircle*(3;-110){0.07}
-          \psline[linewidth=0.5pt,linestyle=dashed](0,0)(0,-1.9)
-          \psarc[linewidth=0.5pt,arrows=<-](0,0){1.5}{-110}{-90}
-          \rput(1.3;-100){\makebox(0,0){$\phi$}}
-          \psarc[linewidth=0.5pt,linestyle=dashed,arrows=<->,arcsepA=0.12](0,0){3}{-110}{-70}
-          \rput(0,-4.5){\psstrut}
-        \end{pspicture}
-      \end{pdfpic}
-    \end{center}
-  \end{minipage}
-
-  \breath
-    
-  \begin{experts}
-    Diese Differentialgleichung läßt sich mit "`normalen"' Mitteln nicht lösen,
-    daher verwendet man in der Praxis meistens die Kleinwinkelnäherung
-    $\sin\phi \approx \phi$ (für $\phi \ll 1$)
-    und löst stattdessen die Differentialgleichung:
-    \begin{displaymath}
-      \phi''(t) = -\frac{g}{l} \cdot \phi(t)
-    \end{displaymath}
-    Für ein mit der Anfangsauslenkung $\phi(0)$ losgelassenes Pendel
-    lautet dann das Ergebnis:
-    \begin{displaymath}
-      \phi(t) = \phi(0)\cdot\cos(\omega t)\qquad\mbox{mit}\qquad\omega=\sqrt{\frac{g}{l}}
-    \end{displaymath}
-    Das Beispielprogramm \gitfile{hp}{script}{pendulum-1.c} illustriert,
-    welche Bewegung sich aus diesem $\phi(t)$ ergibt.
-  \end{experts}
-
-  \subsubsection{Das explizite Euler-Verfahren}
-
-  Um eine Differentialgleichung mit Hilfe eines Computers näherungsweise \newterm{numerisch\/} zu lösen,
-  stehen zahlreiche Lösungsverfahren zur Verfügung.
-  Im folgenden soll das einfachste dieser Verfahren, das \newterm{explizite Euler-Verfahren\/}
-  (auch \newterm{Eulersches Polygonzugverfahren\/} genannt) vorgestellt werden.
-
-  Wir betrachten das System während eines kleinen Zeitintervalls $\Delta t$.
-  Während dieses Zeitintervalls sind alle von der Zeit $t$ abhängigen Funktionen
-  -- z.\,B.\ Ort, Geschwindigkeit, Beschleunigung, Kraft -- näherungsweise konstant.
-
-  Bei konstanter Geschwindigkeit $v$ ist es einfach,
-  aus dem Ort $x(t)$ zu Beginn des Zeitintervalls
-  den Ort $x(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen:
-  \begin{displaymath}
-    x(t + \Delta t) = x(t) + \Delta t \cdot v
-  \end{displaymath}
-
-  Bei konstanter Kraft $F = m \cdot a$
-  und somit konstanter Beschleunigung $a$ ist es ebenso einfach,
-  aus der Geschwindigkeit $v(t)$ zu Beginn des Zeitintervalls
-  die Geschwindigkeit $v(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen:
-  \begin{displaymath}
-    v(t + \Delta t) = v(t) + \Delta t \cdot a
-  \end{displaymath}
-
-  Wenn wir dies in einer Schleife durchführen und jedesmal $t$ um $\Delta t$ erhöhen,
-  erhalten wir Näherungen für die Funktionen $x(t)$ und $v(t)$.
-
-  \breath
-
-  Für das oben betrachtete Beispiel (Fadenpendel)
-  müssen wir in jedem Zeitintervall $\Delta t$
-  zunächst die tangentiale Beschleunigung $a(t)$ aus der tangentialen Kraft berechnen,
-  die sich wiederum aus der momentanen Auslenkung $\phi(t)$ ergibt:
-  \begin{displaymath}
-    a = -g \cdot \sin\phi
-  \end{displaymath}
-  Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Beschleunigung
-  berechnen wir die neue tangentiale Geschwindigkeit:
-  \begin{displaymath}
-    v(t + \Delta t) = v(t) + \Delta t \cdot a
-  \end{displaymath}
-  Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Geschwindigkeit
-  berechnen wir schließlich die neue Winkelauslenkung $\phi$,
-  wobei wir einen kleinen Umweg über den Kreisbogen $x = l\cdot\phi$ machen:
-  \begin{displaymath}
-    \phi(t + \Delta t) = \frac{x(t + \Delta t)}{l}
-                       = \frac{x(t) + \Delta t \cdot v}{l}
-                       = \phi(t) + \frac{\Delta t \cdot v}{l}
-  \end{displaymath}
-
-  Ein C-Programm, das diese Berechnungen durchführt (Datei: \gitfile{hp}{script}{pendulum-2.c}), enthält als Kernstück:
-  \goodbreak
-  \begin{lstlisting}
-    #define g 9.81
-    #define l 1.0
-    #define dt 0.05
-    #define phi0 30.0  /* degrees */
-
-    float t = 0.0;
-    float phi = phi0 * M_PI / 180.0;
-    float v = 0.0;
-
-    void calc (void)
-    {
-      float a = -g * sin (phi);
-      v += dt * a;
-      phi += dt * v / l;
-    }
-  \end{lstlisting}
-  \goodbreak
-  Jeder Aufruf der Funktion \lstinline{calc()}
-  versetzt das Pendel um das Zeitintervall \lstinline{dt} in die Zukunft.
- 
-  Es ist vom Verfahren her nicht notwendig, mit der Kleinwinkelnäherung $\sin\phi\approx\phi$ zu arbeiten.
-  Das Beispielprogramm \gitfile{hp}{script}{pendulum-3.c} illustriert,
-  welchen Unterschied die Kleinwinkelnäherung ausmacht.
-
-  Wie gut arbeitet das explizite Euler-Verfahren?
-  Um dies zu untersuchen, lösen wir eine Differentialgleichung,
-  deren exakte Lösung aus der Literatur bekannt ist,
-  nämlich die Differentialgleichung mit Kleinwinkelnäherung.
-  Das Beispielprogramm \gitfile{hp}{script}{pendulum-4.c} vergleicht beide Lösungen miteinander.
-  Für das betrachtete Beispiel ist die Übereinstimmung recht gut;
-  für Präzisionsberechnungen ist das explizite Euler-Verfahren jedoch nicht genau (und stabil) genug.
-  Hierfür sei auf die Lehrveranstaltungen zur numerischen Mathematik verwiesen.
-
-  \subsubsection*{Bemerkung}
-
-  Das Beispielprogramm \gitfile{hp}{script}{pendulum-4.c} berechnet mit überzeugender Übereinstimmung
-  dasselbe Ergebnis für die Auslenkung des Pendels auf zwei verschiedene Weisen:
-  \begin{enumerate}
-    \item
-      über eine Formel, die einen Cosinus enthält,
-    \item
-      mit Hilfe der Funktion \lstinline{calc()}, die nur Grundrechenarten verwendet.
-  \end{enumerate}
-  Dies läßt die Natur der Verfahren erahnen, mit deren Hilfe es möglich ist,
-  Sinus, Cosinus und andere kompliziertere Funktionen
-  nur unter Verwendung der Grundrechenarten zu berechnen.
-
-  \goodbreak
-
-  \subsection{Rekursion}
-
-  Aus der Mathematik ist das Beweisprinzip der \newterm{vollständigen Induktion\/} bekannt:
-  \begin{displaymath}
-    \hspace*{4cm}
-    \left.
-      \begin{array}{r}
-        \mbox{Aussage gilt für $n = 1$}\\[2pt]
-        \mbox{Schluß von $n - 1$ auf $n$}
-      \end{array}
-    \right\}
-    \mbox{Aussage gilt für alle $n\in\mathbb{N}$}
-  \end{displaymath}
-  Wenn auf diese Weise die Lösbarkeit eines Problems bewiesen wurde,
-  ist es direkt möglich, das Problem im Computer \emph{tatsächlich\/} zu lösen,
-  nämlich durch einen \newterm{rekursiven Algorithmus}.
-
-  \breath
-
-  Ein klassisches Beispiel für ein rekursiv lösbares Problem sind die Türme von Hanoi:
-  \begin{itemize}
-    \item
-      64 Scheiben, 3 Plätze, immer 1 Scheibe verschieben
-    \item
-      Ziel: Turm verschieben
-    \item
-      Es dürfen nur kleinere Scheiben auf größeren liegen.
-  \end{itemize}
-
-  \goodbreak
-  \begin{center}
-    \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg}
-
-    \small
-
-    Bildquelle: \url{http://commons.wikimedia.org/wiki/File:Tower\_of\_Hanoi.jpeg}\\
-    Urheber: \url{http://en.wikipedia.org/wiki/User:Evanherk}\\
-    Lizenz: GNU FDL (Version 1.2 oder später) oder\\
-    Creative Commons Attribution-Share Alike (Version 3.0 Unported)
-    
-  \end{center}
-
-  \goodbreak
-  Die rekursive Lösung des Problems lautet:
-  \begin{itemize}
-    \item
-      Wenn $n = 1$ ist, also nur eine Scheibe vorliegt,
-      läßt sich diese "`einfach so"' an den Zielplatz verschieben.
-      In diesem Fall sind wir direkt fertig.
-    \item
-      Wenn $n - 1$ Scheiben als verschiebbar vorausgesetzt werden,
-      lautet die Vorgehensweise:\\
-      verschiebe die oberen $n - 1$ Scheiben auf einen Hilfsplatz,\\
-      verschiebe die darunterliegende einzelne Scheibe auf den Zielplatz,\\
-      verschiebe die $n - 1$ Scheiben vom Hilfsplatz auf den Zielplatz.
-  \end{itemize}
-
-  \goodbreak
-  Dieser Algorithmus läßt sich unmittelbar in eine Programmiersprache übersetzen:
-  \begin{lstlisting}
-    void verschiebe (int n, int start, int ziel)
-    {
-      if (n == 1)
-        verschiebe_1_scheibe (start, ziel);
-      else
-        {
-          verschiebe (1, start, hilfsplatz);
-          verschiebe (n - 1, start, ziel);
-          verschiebe (1, hilfsplatz, ziel);
-        }
-    }
-  \end{lstlisting}
-
-\iffalse
-
-  \subsection{Floodfill}
-
-  Siehe die Vortragsfolien \file{ainf-20121220.pdf}\\
-  sowie die Beispielprogramme \file{fill-\lstinline{*}.c}
-
-  \subsection{Stack und FIFO}
-
-  Siehe Vortragsfolien und Beispielprogramme
-
-  \subsection{Wegfindungsalgorithmus für Roboterfahrzeug}
-
-  Siehe die Vortragsnotizen \file{ainf-20130117.txt},\\
-  die Beispielprogramme \file{text-parcour-\lstinline{*}.c},
-  \file{robotext.c} und \file{robotext.h}\\
-  sowie die E-Mails "`Wegfindung"' und "`Weg-Finde-Algorithmus"'
-
-\fi
-
-  \subsection{Aufwandsabschätzungen}
-
-  \subsubsection{Sortieralgorithmen}
-
-  Am Beispiel von Sortieralgorithmen soll hier aufgezeigt werden,
-  wie man die Lösung eines Problems schrittweise effizienter gestalten kann.
-
-  Als Problem wählen wir das Sortieren eines Arrays (z.\,B.\ von Namen).
-
-  \begin{itemize}
-    \item
-      Minimum/Maximum ermitteln:
-      \gitfile{hp}{script}{sort-0.c} (mit "`Schummeln"'),
-      \gitfile{hp}{script}{sort-1.c} (lineare Suche),
-      \gitfile{hp}{script}{sort-2.c} (mit Visualisierung)
-    \item
-      Selectionsort:
-      \gitfile{hp}{script}{sort-3.c} (bei Minimumsuche Anfang des Arrays überspringen),
-      \gitfile{hp}{script}{sort-4.c} (Selectionsort),
-      \gitfile{hp}{script}{sort-5.c} (100 Namen),
-      \gitfile{hp}{script}{sort-6.c} (100 Namen, ohne Visualisierung)
-    \item
-      Bubblesort:
-      \gitfile{hp}{script}{sort-7.c} (Selectionsort, Minimumsuche mit in der Hauptschleife),
-      \gitfile{hp}{script}{bsort-1.c} (Minimumsuche durch Vergleich benachbarter Strings),
-      \gitfile{hp}{script}{bsort-2.c} (Abbruch in äußerer Schleife, sobald sortiert),
-      \gitfile{hp}{script}{bsort-3.c} (Abbruch auch in innerer Schleife, sobald sortiert)
-    \item
-      Quicksort:
-      \gitfile{hp}{script}{qsort-1.c} (Array in 2 Hälften vorsortieren),
-      \gitfile{hp}{script}{qsort-2.c} (rekursiver Aufruf für linke Hälfte),
-      \gitfile{hp}{script}{qsort-3.c} (rekursiver Aufruf für beide Hälften)
-  \end{itemize}
-
-  Bei "`zufällig"' sortierten Ausgangsdaten arbeitet Quicksort schneller als Bubblesort.
-  Wenn die Ausgangsdaten bereits nahezu sortiert sind, ist es umgekehrt.
-  Im jeweils ungünstigsten Fall arbeiten beide Algorithmen gleich langsam.
-
-  \subsubsection{Landau-Symbole}
-
-  Das Landau-Symbol $\mathcal{O}(g)$ mit einer Funktion $g(n)$
-  steht für die \newterm{Ordnung\/} eines Algorithmus',
-  also die "`Geschwindigkeit"', mit der er arbeitet.
-  Die Variable $n$ bezeichnet die Menge der Eingabedaten,
-  hier also z.\,B.\ die Anzahl der Namen.
-
-  \begin{center}
-    \begin{pdfpic}
-      \psset{unit=1pt}
-      \begin{pspicture}(-20,-20)(250,200)
-        \psline[arrows=->](-10,0)(200,0)
-        \psline[arrows=->](0,-10)(0,200)
-        \psplot[plotpoints=200]{1}{125}{2 x 0.06 mul exp}
-        \put(100,190){\mbox{$g(n) \sim 2^n$}}
-        \psplot[plotpoints=200]{0}{190}{x x mul 0.005 mul}
-        \put(190,190){\mbox{$g(n) \sim n^2$}}
-        \psplot[plotpoints=200]{1}{190}{x ln x mul 0.1 mul}
-        \put(195,100){\mbox{$g(n) \sim n \log n$}}
-        \psplot[plotpoints=200]{0}{190}{x 0.4 mul}
-        \put(195,75){\mbox{$g(n) \sim n$}}
-        \psplot[plotpoints=200]{1}{190}{x ln 10 mul}
-        \put(195,50){\mbox{$g(n) \sim \log n$}}
-        \put(210,0){\makebox(0,0)[l]{$n$}}
-        \put(0,210){\makebox(0,0)[l]{$g(n)$}}
-      \end{pspicture}
-    \end{pdfpic}
-  \end{center}
-
-  \begin{itemize}
-    \item
-      $\mathcal{O}(n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten linear wächst.
-      Um doppelt so viele Namen zu sortieren, benötigt das Programm doppelt so lange.
-    \item
-      $\mathcal{O}(n^2)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten quadratisch wächst.
-      Um doppelt so viele Namen zu sortieren, benötigt das Programm viermal so lange.
-    \item
-      $\mathcal{O}(2^n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten exponentiell wächst.
-      Für jeden Namen, der dazukommt, benötigt das Programm doppelt so lange.
-
-      Ein derartiges Programm gilt normalerweise als inakzeptabel langsam.
-    \item
-      $\mathcal{O}(\log n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten logarithmisch wächst.
-      Für jede Verdopplung der Namen benötigt das Programm nur einen Rechenschritt mehr.
-
-      Ein derartiges Programm gilt als "`traumhaft schnell"'.
-      Dies wird jedoch nur selten erreicht.
-    \item
-      $\mathcal{O}(1)$ bedeutet, daß die Rechenzeit von der Menge der Eingabedaten unabhängig ist:
-      1\,000\,000 Namen werden genau so schnell sortiert wie 10.
-
-      Dies ist nur in Ausnahmefällen erreichbar.
-    \item
-      $\mathcal{O}(n \log n)$ liegt zwischen $\mathcal{O}(n)$ und $\mathcal{O}(n^2)$.
-
-      Ein derartiges Programm gilt als schnell.
-      Viele Sortieralgorithmen erreichen dieses Verhalten.
-  \end{itemize}
-
-  Wie sieht man einem Programm an, wie schnell es arbeitet?
-
-  \begin{itemize}
-    \item
-      Vorfaktoren interessieren nicht.
-
-      Wenn ein Code immer -- also unabhängig von den Eingabedaten -- zweimal ausgeführt wird,
-      beeinflußt das die Ordnung des Algorithmus nicht.
-
-      Wenn ein Code immer -- also unabhängig von den Eingabedaten -- 1\,000\,000mal ausgeführt wird,
-      mag das Programm für kleine Datenmengen langsam erscheinen.
-      Für die Ordnung interessiert jedoch nur das Verhalten für große Datenmengen,
-      und dort kann dasselbe Programm durchaus schnell sein.
-    \item
-      Jede Schleife, die von $0$ bis $n$ geht,
-      multipliziert die Rechenzeit des innerhalb der Schleife befindlichen Codes mit $n$.
-
-      Eine Doppelschleife (Schleife innerhalb einer Schleife) hat demnach $\mathcal{O}(n^2)$.
-    \goodbreak
-    \item
-      Wenn sich die Grenzen einer Schleife ständig ändern, nimmt man den Durschschnitt.
-
-      Beispiel:
-      \begin{lstlisting}[gobble=8]
-        for (int i = 0; i < n; i++)
-          for (int j = 0; j < i; j++)
-            ...
-      \end{lstlisting}
-      Die äußere Schleife wird immer $n$-mal ausgeführt,
-      die innere \emph{im Durchschnitt\/} $\frac{n}{2}$-mal, was proportional zu $n$ ist.
-
-      Zusammen ergibt sich $\mathcal{O}(n^2)$.
-    \item
-      Bei Rekursionen muß man mitzählen, wie viele Schleifen hinzukommen.
-
-      Bei Quicksort wird z.\,B.\ in jeder Rekursion
-      eine Schleife von $0$ bis $n$ (aufgeteilt) ausgeführt.
-      Bei jeder Rekursion wird das Array "`normalerweise"' halbiert,
-      d.\,h.\ die Rekursionstiefe ist proportional zum Logarithmus von $n$ (zur Basis 2).
-      Daraus ergibt sich die Ordnung $\mathcal{O}(n\log n)$ für den "`Normalfall"' des Quicksort.
-      (Im ungünstigsten Fall kann sich auch $\mathcal{O}(n^2)$ ergeben.)
-  \end{itemize}
-
-  Für eine präzise Definition der Landau-Symbole siehe z.\,B.:
-  \url{http://de.wikipedia.org/wiki/Landau-Symbole}
-
-  \section{Objektorientierte Programmierung}
-
-\iffalse
-
-  In Abschnitt \ref{Strukturen} haben wir Funktionen geschrieben,
-  die eine \lstinline{struct}-Variable bearbeiten.
-
-  Das Konzept, Funktionen möglichst eng mit den Daten zu bündeln,
-  die sie bearbeiten, ist ein wichtiger Aspekt der \newterm{objektorientierten Programmierung}.
-
-  Das Beispielprogramm \file{dates-1.c} illustriert einen Satz von Funktionen
-  zur Bearbeitung von \file{date}-Objekten, sog.\ \newterm{Methoden}.
-  Methoden erwarten als "`standardisierten"' ersten Parameter das Objekt:
-  einen Zeiger \lstinline{this} auf ein C-\lstinline{struct}.
-  Wenn der Satz von Funktionen vollständig ist, ist es nicht mehr nötig,
-  direkt auf die Datenfelder des \lstinline{struct}s zuzugreifen.
-  Dies nennt man \newterm{Kapselung}.
-
-  Viele Sprachen (z.\,B.\ C++ als Weiterentwicklung von C)
-  unterstützen objektorientierte Programmierung durch Sprachelemente.
-  In diesen Sprachen ist der \lstinline{this}-Parameter i.\,d.\,R.\ nicht sichtbar,
-  sondern implizit.
-
-  Das Beispielprogramm \file{dates-2.c} geht noch einen Schritt weiter
-  und verankert im Objekt Zeiger auf Methoden -- sog.\ \newterm{virtuelle Methoden}.
-  Dieses mit den Callback-Funktionen vergleichbare Konzept ermöglicht es,
-  verschiedenen, miteinander "`verwandten"' Objekten Methoden mit gleichen Namen
-  zuzuordnen, die sich aber unterschiedlich verhalten.
-  Dies nennt man \newterm{Polymorphie}.
-
-  Wenn die o.\,a.\ "`Verwandschaft"' von Objekten darin besteht,
-  daß das eine Objekt ein anderes erweitert (zusätzliche Datenfelder und Methoden,
-  evtl.\ veränderte, \newterm{überschriebene\/} virtuelle Methoden),
-  spricht man von \newterm{Vererbung}.
-  Das Objekt, das erweitert wird, ist der \newterm{Vorfahre\/} des anderen Objekts.
-
-  In Sprachen wie C, die keine Sprachelemente für objektorientierte Programmierung
-  zur Verfügung stellen, kann dennoch Objektorientierung "`zu Fuß"' erreicht werden.
-  Die GUI-Bibliothek GTK+,
-  die ursprünglich für das Bildverarbeitungsprogramm GIMP entwickelt wurde,
-  inzwischen aber in zahlreichen Programmen (z.\,B.\ Mozilla Firefox) ihren Dienst tut,
-  funktioniert auf diese Weise.
-
-\fi
-
-  \addtocounter{subsection}{-1}
-  \subsection{Dynamische Speicherverwaltung}
-
-  Variable in C haben grundsätzlich eine feste Größe.
-  Dies gilt auch für Arrays:
-  Auch mit der Schreibweise ohne Größenangabe, z.\,B.
-  \lstinline|int a[] = { 2, 3, 5, 7 };|
-  handelt es sich \emph{nicht\/} um ein Array veränderlicher Größe.
-  Die \lstinline{[]}-Schreibweise besagt lediglich,
-  daß der Compiler die Größe des Arrays anhand des Initialisierers
-  (hier: \lstinline|{ 2, 3, 5, 7 }|) selbst berechnen soll.
-  Das Beispiel \lstinline|int a[] = { 2, 3, 5, 7 };| ist nur eine andere Schreibweise für
-  \lstinline|int a[4] = { 2, 3, 5, 7 };|.
-
-  Um \emph{tatsächlich\/} Arrays mit einer variablen Anzahl von Elementen verwenden
-  zu können, ist es in C notwendig, durch einen Funktionsaufruf explizit Speicher zu
-  reservieren:
-  \begin{lstlisting}
-    #include <stdlib.h>
-    ...
-    int *a = malloc (4 * sizeof (int));
-    ...
-    free (a);
-  \end{lstlisting}
-
-  \lstinline{malloc()} reserviert Speicher, \lstinline{free()} gibt ihn wieder frei.
-   
-  Man beachte, daß man in C auf Zeiger mit dem \lstinline{[]}-Operator
-  genau wie auf "`normale"' Arrays mit einem Index zugreifen kann:
-  \begin{lstlisting}
-    int *a = malloc (4 * sizeof (int));
-    ...
-    for (int i = 0; i < 4; i++)
-      printf ("%d\n", a[i]);
-  \end{lstlisting}
-
-  Es gibt normalerweise keine Möglichkeit, einem Zeiger (hier: \lstinline{a}) anzusehen,
-  wie groß der Speicherbereich ist, auf den er zeigt.
-  Diesen Wert muß sich das Programm selbst merken, typischerweise in einer Variablen:
-  \begin{lstlisting}
-    int n = 4;
-    int *a = malloc (n * sizeof (int));
-    ...
-    for (int i = 0; i < n; i++)
-      printf ("%d\n", a[i]);
-  \end{lstlisting}
-
-  \subsection{Konzepte und Ziele}
-
-  Für viele Anwendungen ist der o.\,a.\ Mechanismus der \newterm{dynamischen Arrays\/}
-  noch nicht flexibel genug: Auch wenn die Anzahl der Elemente nicht mehr festliegt,
-  so müssen doch alle genau dieselbe Größe haben. In vielen Situationen möchte man
-  jedoch eine vorher nicht festgelegte Anzahl von Objekten unterschiedlichen Typs in
-  einer Schleife abarbeiten -- z.\,B.\ verschiedene geometrische Objekte in einem
-  Zeichenprogramm oder verschiedene Bedienelemente (Button, Zeichenbereich,
-  Eingabefeld, \dots) in einer graphischen Benutzeroberfläche (Graphical User
-  Interface -- GUI).
-
-  Um dieses Problem zu lösen, speichert man Zeiger auf Objekte unterschiedlicher Größe
-  in einem dynamischen Array.
-  Dies funktioniert, weil alle Zeiger -- auch wenn sie auf unterschiedlich große
-  Objekte zeigen -- die gleiche Größe haben
-  und daher in demselben Array koexistieren können.
-
-  \breath
-
-  Um alle diese Objekte in einer Schleife auf gleiche Weise behandeln zu können,
-  benötigt man standardisierte Funktionen, die mit dem Objekt arbeiten.
-  Diese nennt man \newterm{Methoden}.
-
-  Eine Methode bewirkt unterschiedliche Dinge,
-  je nachdem, auf welches Objekt sie angewandt wird.
-  Dies hängt vom Typ des Objekts ab.
-  Um dies zu realisieren, kann man ein Objekt als \lstinline{struct}-Variable
-  speichern, die zusätzlich zum eigentlichen Inhalt
-  eine Kennung für den Objekttyp als Datenfeld enthält.
-  In der Methode fragt man diese Typkennung ab
-  und entscheidet auf dieser Grundlage, was die Methode bewirkt.
-
-  Dies kann über \lstinline{if}-Abfragen (oder \lstinline{switch}-Anweisungen)
-  geschehen, bei sehr vielen unterschiedlichen Objekttypen entarten derartige
-  Methoden jedoch zu sehr unübersichtlichen \lstinline{if}-Ketten.
-  Weiter unten werden elegantere Wege zur Realisierung von Methoden vorgestellt.
-
-  \breath
-
-  Objekte, die einen gemeinsamen Anteil von Eigenschaften haben
-  und sich typischerweise in demselben Array befinden,
-  bezeichnet man als \newterm{miteinander verwandt}.
-  Der "`kleinste gemeinsame Nenner"' dieser Objekte,
-  also ein Objekttyp der \emph{nur\/} den gemeinsamen Anteil enthält,
-  heißt \newterm{Basisklasse\/} oder \newterm{gemeinsamer Vorfahr\/}
-  der Objekte. Umgekehrt heißt ein Objekttyp, der eine Basisklasse um neue
-  Eigenschaften erweitert, \newterm{abgeleitete Klasse\/}
-  oder \newterm{Nachfahre} der Basisklasse.
-
-  Eigenschaften, die ein Objekttyp mit seinem Vorfahren gemeinsam hat,
-  bezeichnet man als \newterm{vom Vorfahren geerbt}.
-
-  \breath
-
-  Ein "`Array von Objekten"' wird zunächst als Array von Zeigern auf die Basisklasse
-  realisiert; die Zeiger zeigen aber in Wirklichkeit
-  auf Objekte von abgeleiteten Klassen.
-  Diese Möglichkeit, unterschiedliche Objekte gemeinsam zu verwalten,
-  bezeichnet man als \newterm{Polymorphie} (griechisch: \emph{Vielgestaltigkeit\/}).
-
-  \subsection{Beispiel: Zahlen und Buchstaben}
-
-  Als Beispiel konstruieren wir eine Struktur,
-  die Zahlen und Buchstaben (Strings) gemeinsam verwalten soll,
-  also gewissermaßen ein Array,
-  das sowohl ganze Zahlen (\lstinline{int})
-  als auch Strings (\lstinline{char *}) als Elemente haben kann.
-
-  Zu diesem Zweck definieren wir zwei \lstinline{struct}-Datentypen
-  \lstinline{t_integer} und \lstinline{t_string},
-  die als Inhalt (\lstinline{content}) eine ganze Zahl bzw.\ einen String enthalten
-  und zusätzlich eine Typ-Kennung (hier: \lstinline{int type}).
-  Weiterhin definieren wir einen gemeinsamen Vorfahren \lstinline{t_base},
-  der \emph{nur\/} die Typ-Kennung enthält.
-
-  \goodbreak
-
-  \begin{center}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        typedef struct
-        {
-          int type;
-        } t_base;
-      \end{lstlisting}
-    \end{minipage}\\[0.5cm]
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        typedef struct
-        {
-          int type;
-          int content;
-        } t_integer;
-      \end{lstlisting}
-    \end{minipage}
-    \begin{minipage}{5cm}
-      \begin{lstlisting}[gobble=8]
-        typedef struct
-        {
-          int type;
-          char *content;
-        } t_string;
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-  Man beachte, daß diese drei \lstinline{struct}-Datentypen
-  trotz der absichtlichen Gemeinsamkeiten
-  aus Sicht des C-Compilers nichts miteinander zu tun haben;
-  sie sind voneinander vollkommen unabhängige Datentypen.
-
-  Unser "`Array von Zahlen und Buchstaben"'
-  erzeugen wir nun als Array von Zeigern auf den Basistyp,
-  lassen die Zeiger aber in Wirklichkeit
-  auf Variablen der abgeleiteten Datentypen zeigen:
-
-  \begin{lstlisting}
-    #define T_INTEGER 1
-    #define T_STRING 2
-
-    t_integer i = { T_INTEGER, 42 };
-    t_string s = { T_STRING, "Hello, world!" };
-
-    t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL };
-  \end{lstlisting}
-  \begin{picture}(0,0.9)(0,-0.6)
-    \color{red}
-    \put(2.975,0.75){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}}
-  \end{picture}
-
-  Damit der Compiler dies ohne Warnung akzeptiert,
-  ist eine explizite Typumwandlung des jeweiligen Zeigers auf den abgeleiteten Typ
-  in einen Zeiger auf den Basistyp erforderlich.
-
-  Bei der Benutzung der abgeleiteten Typen
-  erfolgt wieder eine explizite Typumwandlung, nur diesmal in umgekehrter Richtung:
-
-  \begin{lstlisting}
-    void print_object (t_base *this)
-    {
-      if (this->type == T_INTEGER)
-        printf ("Integer: %d\n", ((t_integer *) this)->content);
-      else if (this->type == T_STRING)
-        printf ("String: \"%s\"\n", ((t_string *) this)->content);
-    }
-    ...
-    for (int i = 0; object[i]; i++)
-      print_object (object[i]);
-  \end{lstlisting}
-
-  (Beispiel-Programm: \gitfile{hp}{20161219}{objects-7.c})
-
-  Die expliziten Typumwandlungen sind ein gravierender Nachteil dieser
-  Vorgehensweise, denn sie schalten jegliche Überprüfung durch den Compiler aus.
-  Der Programmierer ist komplett selbst dafür verantwortlich,
-  daß die \lstinline{struct}-Datentypen gemeinsame Felder haben
-  und daß der Zeiger jeweils auf den richtigen \lstinline{struct}-Typ zeigt.
-
-  Die folgenden Abschnitte stellen Möglichkeiten vor,
-  diese Nachteile abzumildern.
-
-  \breath
-
-  Die Verwendung von Zeigern auf "`normale"' Variable ist in der Praxis unüblich.
-  Stattdessen reserviert man mit \lstinline{malloc()} Speicher für die Objekte.
-  Es hat sich bewährt, für diesen Zweck eine spezielle Funktion,
-  den sog.\ \newterm{Konstruktor\/} zu schreiben.
-  Der Konstruktor kann den reservierten Speicher auch direkt
-  mit sinnvollen Werten initialisieren, wodurch wieder eine Fehlerquelle wegfällt.
-
-  \begin{lstlisting}
-    t_integer *new_integer (int i)
-    {
-      t_integer *p = malloc (sizeof (t_integer));
-      p->type = T_INTEGER;
-      p->content = i;
-      return p;
-    }
-
-    t_string *new_string (char *s)
-    {
-      t_string *p = malloc (sizeof (t_string));
-      p->type = T_STRING;
-      p->content = s;
-      return p;
-    }
-    ...
-
-    t_base *object[] = { (t_base *) new_integer (42),
-                        (t_base *) new_string ("Hello, world!"),
-                        NULL };
-  \end{lstlisting}
-
-  (Beispiel-Programm: \gitfile{hp}{20161219}{objects-8.c})
-
-  \subsection{Unions}
-
-  Explizite Typumwandlungen sind unsicher und nach Möglichkeit zu vermeiden.
-  Eine Alternative ergibt sich durch Verwendung des Datentyps \lstinline{union}.
-
-  Eine \lstinline{union} sieht formal wie ein \lstinline{struct} aus.
-  Der Unterschied besteht darin, daß die Datenfelder eines \lstinline{struct}
-  im Speicher \emph{hintereinander\/} liegen,
-  wohingegen sich die Datenfelder einer \lstinline{union}
-  \emph{denselben Speicherbereich teilen}.
-
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdio.h>
-      #include <stdint.h>
-
-      typedef union
-      {
-        int8_t i;
-        uint8_t u;
-      } num8_t;
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      int main (void)
-      {
-        num8_t n;
-        n.i = -3;
-        printf ("%d\n", n.u);
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  Die im o.\,a.\ Beispiel konstruierte \lstinline{union}
-  spricht dieselbe Speicherzelle einerseits als \lstinline{int8_t} an
-  und andererseits als \lstinline{uint8_t}.
-  Das Beispiel-Programm (Datei: \gitfile{hp}{20161219}{unions-1.c})
-  nutzt dies aus, um die negative Zahl \lstinline{-3}
-  als positive 8-Bit-Zahl auszugeben (Berechnung des Zweierkomplements).
-
-  \breath
-
-  In der objektorientierten Programmierung in C
-  nutzt man \lstinline{union}-Datentypen,
-  um ohne explizite Typumwandlung denselben Speicherbereich
-  als Objekte verschiedenen Typs zu interpretieren:
-
-  \begin{minipage}[t]{3.5cm}
-    \begin{lstlisting}[gobble=6]
-
-
-      typedef struct
-      {
-        int type;
-      } t_base;
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.5cm}
-    \begin{lstlisting}[gobble=6]
-
-      typedef struct
-      {
-        int type;
-        int content;
-      } t_integer;
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{3.5cm}
-    \begin{lstlisting}[gobble=6]
-
-      typedef struct
-      {
-        int type;
-        char *content;
-      } t_string;
-    \end{lstlisting}
-  \end{minipage}%
-  \begin{minipage}[t]{4.5cm}
-    \begin{lstlisting}[gobble=6]
-      typedef union
-      {
-        t_base base;
-        t_integer integer;
-        t_string string;
-      } t_object;
-    \end{lstlisting}
-  \end{minipage}
-  \begin{center}
-    \begin{minipage}{8.5cm}
-      \begin{lstlisting}[gobble=8]
-        if (this->base.type == T_INTEGER)
-          printf ("Integer: %d\n", this->integer.content);
-        else if (this->base.type == T_STRING)
-          printf ("String: \"%s\"\n", this->string.content);
-      \end{lstlisting}
-    \end{minipage}
-  \end{center}
-
-  (Beispiel-Programm: \gitfile{hp}{20161219}{objects-9.c})
-
-  Das Ansprechen falscher Speicherbereiche
-  wird hierdurch zwar nicht völlig ausgeschlossen;
-  der Compiler hat jedoch wesentlich mehr Möglichkeiten
-  als bei expliziten Typumwandlungen,
-  den Programmierer vor derartigen Fehlern zu bewahren.
-
-  Das Problem, von Hand dafür sorgen zu müssen,
-  daß die \lstinline{struct}-Datentypen zueinander passende Datenfelder enthalten,
-  bleibt weiterhin bestehen.
-
-  \breath
-
-  Ein alternativer Ansatz besteht darin,
-  nur die veränderlichen Eigenschaften der Objekte
-  in einer \lstinline{union} zu speichern --
-  siehe Aufgabe 1 (c) bis (e) in den Übungen vom 19.\,12.\,2016
-  (Datei: \gitfile{hp}{20161219}{hp-uebung-20161219.pdf}).
-
-  \goodbreak
-
-  \subsection{Beispiel: graphische Benutzeroberfläche (GUI)}
-
-  \href{http://www.gtk.org/}{GTK+} ist eine weit verbreitete Bibliothek
-  zur Erstellung graphischer Benutzeroberflächen (Graphical User Interface -- GUI).
-  Sie wurde ursprünglich
-  für das Bildverarbeitungsprogramm \href{http://www.gimp.org}{GIMP} geschrieben,
-  kommt aber u.\,a.\ auch im Web-Browser
-  \href{http://www.mozilla.org}{Mozilla Firefox} zum Einsatz.
-
-  GTK+ ist in C geschrieben und objektorientiert.
-  Die Bibliothek verwendet intern einige der hier besprochenen Vorgehensweisen
-  zur Realisierung objektorientierter Programmierung in C.
-
-  Die Beispielprogramme \href{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20161219}%
-  {\file{gtk-1.c} bis \file{gtk-7.c}} demonstrieren,
-  wie man mit Hilfe von GTK+ ein einfaches GUI-Programm schreibt,
-  das graphische Objekte (Rechteck, Kreis, Dreieck) auf den Bildschirm zeichnet
-  und sich nach dem Anklicken eines Buttons beendet.
-
-  Die Bedienelemente der GUI sind in GTK+ Objekte.
-  Hier ein paar Beispiele:
-  \begin{itemize}
-    \item
-      \lstinline{GtkWidget} ist die Basisklasse für alle GUI-Elemente.
-    \item
-      \lstinline{GtkContainer} ist ein Nachfahre von \lstinline{GtkWidget}.\\
-      Dieses Objekt kann, ähnlich einem Array, andere Objekte enthalten.
-    \item
-      \lstinline{GtkWindow} ist ein Fenster auf dem Bildschirm.\\
-      Es ist ein Nachfahre von \lstinline{GtkContainer}
-      und kann daher andere Objekte enthalten.
-    \item
-      \lstinline{GtkDrawingArea} ist ein rechteckiger Zeichenbereich auf dem Bildschirm.
-    \item
-      \lstinline{GtkButton} ist ein Bedienknopf.\\
-      Durch Anklicken des Knopfes kann der Benutzer Aktionen auslösen.
-  \end{itemize}
-
-  Um bei einer abgeleiteten Klasse (z.\,B.\ \lstinline{GtkWindow})
-  Eigenschaften der Basisklasse (z.\,B.\ \lstinline{GtkContainer}) nutzen zu können,
-  verwendet GTK+ explizite Typumwandlungen, die in Präprozessor-Macros gekapselt sind.
-  Um zum Beispiel ein \lstinline{GtkWindow}-Objekt \lstinline{window}
-  als \lstinline{GtkContainer} ansprechen zu können,
-  verwendet man \lstinline{GTK_CONTAINER (window)}.
-
-  Ähnlich wie in OpenGL/GLUT erfolgt auch in GTK+ das Zeichnen
-  sowie die Verarbeitung von Benutzereingaben (Tastatur, Maus)
-  über Callbacks.
-
-  In \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20161219/hp-2016ws-p4.pdf}%
-  {Praktikumsversuch 4} haben Sie selbst weitere Erfahrungen mit GTK+ gesammelt
-  und gleichzeitig eine eigene Objekt-Hierarchie
-  (für graphische Objekte: Rechteck, Kreis, Dreieck) programmiert.
-
-  \subsection{Virtuelle Methoden}
-
-  In großen Programmen wird die Anzahl der verwendeten Objekt-Datentypen
-  schnell sehr groß. Eine Methode, die per \lstinline{if} unterscheiden muß,
-  welche Art von Objekt sie gerade bearbeitet,
-  enthält dann lange \lstinline{if}-Ketten
-  und wird dadurch sehr unübersichtlich.
-
-  \begin{lstlisting}
-    void print_object (t_object *this)
-    {
-      if (this->base.type == T_INTEGER)
-        printf ("Integer: %d\n", this->integer.content);
-      else if (this->base.type == T_STRING)
-        printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-  Es wäre vorteilhaft, wenn alle Methoden,
-  die sich auf einen bestimmten Objekttyp beziehen,
-  auch nebeneinander im Quelltext stehen könnten,
-  anstatt sich über den gesamten Quelltext zu verteilen
-  (weil jede Funktion einen \lstinline{if}-Zweig für diesen Objekttyp hat).
-
-  \begin{lstlisting}
-    void print_integer (t_object *this)
-    {
-      printf ("Integer: %d\n", this->integer.content);
-    }
-
-    void print_string (t_object *this)
-    {
-      printf ("String: \"%s\"\n", this->string.content);
-    }
-  \end{lstlisting}
-
-  Um dies zu realisieren, verwendet man \emph{Zeiger auf Funktionen}:
-
-  \begin{lstlisting}
-    typedef struct
-    {
-      void (*print) (union t_object *this);
-    } t_base;
-
-    typedef struct
-    {
-      void (*print) (union t_object *this);
-      int content;
-    } t_integer;
-
-    typedef struct
-    {
-      void (*print) (union t_object *this);
-      char *content;
-    } t_string;
-  \end{lstlisting}
-
-  Um in C einen Zeiger auf eine Funktion zu deklarieren,
-  deklariert man eine "`normale"' Funktion,
-  deren "`Name"' die Gestalt \lstinline{(*print)} hat --
-  mit dem vorangestellten Stern und den umschließenden Klammern.
-  (Merkregel: Das, worauf \lstinline{print} zeigt -- also \lstinline{*print} --,
-  ist eine Funktion.)
-
-  Der Aufruf einer derartigen Funktion erfolgt
-  über den im Objekt gespeicherten Zeiger:
-
-  \begin{lstlisting}
-    for (int i = 0; object[i]; i++)
-      object[i]->print (object[i]);
-  \end{lstlisting}
-
-  Eine derartige Funktion, die für verschiedene Objekttypen existiert
-  und bei deren Aufruf automatisch "`die passende"' Funktion ausgewählt wird,
-  heißt \newterm{virtuelle Methode}.
-
-  \breath
-
-  Jeder Methode wird ein Zeiger \lstinline{t_object *this} auf das Objekt
-  als Parameter mitgegeben.
-
-  Bei der Deklaration der virtuellen Methode innerhalb des Objekt-Typs
-  wird daher der Union-Typ \lstinline{t_object} bereits benötigt.
-  Dieser kann jedoch erst später deklariert werden,
-  wenn die darin enthaltenen Objekt-Typen bekannt sind.
-
-  Um dieses Problem zu lösen, muß die \lstinline{union t_object}
-  "`doppelt"' deklariert werden:
-
-  \begin{lstlisting}
-    typedef union t_object
-    {
-      t_base base;
-      t_integer integer;
-      t_string string;
-    } t_object;
-  \end{lstlisting}
-
-  Dadurch daß \lstinline{t_object} auch oben,
-  hinter dem Schlüsselwort \lstinline{union} steht,
-  ist neben dem Datentyp \lstinline{t_object}
-  auch ein Datentype \lstinline{union t_object}
-  (in einem separaten Namensraum) bekannt.
-  Derartig deklarierte Typen kann man \newterm{vorwärts-deklarieren\/}:
-  Wenn man eine Zeile
-  \begin{lstlisting}
-    union t_object;
-  \end{lstlisting}
-  den anderen Deklarationen voranstellt,
-  wissen diese, daß es später eine \lstinline{union t_object} geben wird.
-  Zeiger auf diese -- noch unbekannte -- \lstinline{union}
-  dürfen dann bereits in Deklarationen -- hier: Funktionsparameter --
-  verwendet werden.
-
-  \breath
-
-  Das Beispiel-Programm \gitfile{hp}{20170109}{objects-12.c} illustriert,
-  wie man virtuelle Methoden in C realisieren kann.
-
-  In größeren Projekten ist es nicht effizient,
-  in jeder einzelnen Objektinstanz (= Variable des Objekttyps)
-  sämtliche Zeiger auf sämtliche virtuellen Methoden zu speichern.
-  Stattdessen speichert man in der Objektinstanz
-  lediglich einen Zeiger auf eine Tabelle von Zeigern auf die virtuellen Methoden,
-  die sog.\ \newterm{virtuelle Methodentabelle} --
-  siehe das Beispiel-Programm \gitfile{hp}{20170109}{objects-13.c}.
-
-  \subsection{Einführung in C++}
-
-  Objektorientierte Programmierung in C ist sehr mühselig und fehleranfällig:
-  Objekt-Datentypen müssen manuell so abgeglichen werden,
-  daß sie in ihren ersten Datenfeldern übereinstimmen,
-  Konstruktoren müssen manuell erstellt werden, usw.
-
-  Um diese Probleme zu beheben, wurden neue Computersprachen entwickelt,
-  die objektorientierte Programmierung durch neue Sprachelemente unterstützen.
-  Die objektorientierte Weiterentwicklung von C ist C++.
-  Andere bekannte objektorientierte Sprachen sind Java, Python, C\#, JavaScript,
-  PHP, verschiedene Pascal-Dialekte und viele weitere.
-
-  Das Beispiel-Programm \gitfile{hp}{20170109}{objects-14.cpp}
-  ist eine direkte Übersetzung von \gitfile{hp}{20170109}{objects-12.c} nach C++.
-  In C++ kümmert sich der Compiler um die Vererbung zwischen den Objekt-Datentypen,
-  um die Verwaltung der Zeiger auf virtuelle Methoden,
-  um korrekte Konstruktoren und um vieles mehr.
-  Auch die Übergabe des Objekt-Zeigers \lstinline{this} an Methoden
-  erfolgt in C++ automatisch: Aus \lstinline{object[i]->base.print (object[i]);}
-  wird \lstinline{object[i]->print ();}.
-
-  Dadurch daß der Compiler viele Aufgaben übernimmt,
-  die der Programmierer ansonsten manuell abarbeiten müßte,
-  wird der Quelltext kürzer und weniger fehleranfällig.
-
-  \section{Datenstrukturen}
-
-  \subsection{Stack und FIFO}
-
-  Eine häufige Situation beim Programmieren ist,
-  daß man ein Array für eine gewisse Maximalmenge von Einträgen anlegt,
-  aber nur zum Teil nutzt.
-
-  Einem derartigen Array ein Element hinzuzufügen, ist einfach:
-  Man erhöht die Variable, die die Auslastung des Arrays speichert.
-  Ebenso einfach ist das Entfernen des zuletzt eingefügten Elements:
-  Man erniedrigt die Variable, die die Auslastung des Arrays speichert.
-
-  "`Einfach"' bedeutet hier, daß die benötigte Rechenzeit gering ist.
-  Genaugenommen ist die Rechenzeit immer gleich groß,
-  egal wie viele Elemente sich bereits im Array befinden.
-  Die Komplexität (Landau-Symbol) der Operation,
-  am Ende des Arrays ein Element einzufügen oder zu entfernen,
-  ist $\mathcal{O}(1)$.
-
-  Eine derartige Struktur eignet sich gut,
-  um Elemente in der Reihenfolge des Eintreffens zu speichern,
-  sie aber in \emph{umgekehrter\/} Reihenfolge wieder abzuarbeiten.
-  Man "`stapelt"' gewissermaßen die Elemente in dem Array.
-  Aus diesem Grunde heißt diese Struktur \newterm{Stack\/} (engl.: \emph{Stapel})
-  oder \newterm{LIFO\/} für \emph{last in, first out}.
-
-  Andere Operationen -- z.\,B.\ das Einfügen oder Löschen von Elementen
-  in der Mitte -- sind aufwendiger, da man die im Array befindlichen Elemente
-  in einer Schleife beiseiteschieben muß.
-  Die Rechenzeit ist proportional zur Anzahl der Elemente,
-  die sich bereits im Array befinden: $\mathcal{O}(n)$.
-
-  Das Suchen in einem bereits sortieren Array ist hingegen in $\mathcal{O}(\log n)$
-  möglich: Man beginnt die Suche in der Mitte und prüft,
-  ob sich das gesuchte Element in der unteren oder in der oberen Hälfte befindet.
-  In der ermittelten Hälfte beginnt man die Suche wieder in der Mitte --
-  so lange, bis man nur noch ein einzelnes Element vor sich hat.
-
-  Das Beispiel-Programm \gitfile{hp}{20170116}{stack-11.c} illustriert,
-  wie man einen Stack mit den o.\,g.\ Funktionalitäten implementieren kann.
-
-  \breath
-
-  Eine weitere wichtige Situation ist,
-  daß man anfallende Daten zwischenspeichern
-  und \emph{in derselben Reihenfolge\/} wieder abarbeiten möchte.
-  Eine Struktur, die dies ermöglicht, heißt \newterm{FIFO\/}
-  für \emph{first in, first out}.
-
-  Um einen FIFO zu realisieren, verwendet man nicht eine einzelne Variable,
-  die den genutzten Teil des Arrays speichert, sondern zwei:
-  Ein Schreib-Index markiert, an welcher Stelle Platz
-  für das nächste einzufügende Element ist;
-  ein Lese-Index markiert das zuerst eingefügte Element.
-  Beide Indizes werden bei Verwendung hochgezählt.
-  Wenn sie gleich sind, ist der FIFO leer.
-
-  Der entscheidende Trick: Wenn eine der beiden Indexvariablen
-  das Ende des Arrays erreicht, wird sie wieder auf 0 gesetzt.
-  Die beiden Indexvariablen arbeiten also \emph{ringförmig\/}; 
-  der FIFO wird durch einen \newterm{Ringpuffer\/} realisiert.
-
-  Beispiel-Programm: \gitfile{hp}{20170116}{fifo-8.c}
-
-  \subsection{Verkettete Listen}
-
-  In Arrays ist das Einfügen in der Mitte sehr aufwendig ($\mathcal{O}(n)$).
-  Um das Einfügen zu vereinfachen, hat man sich die folgende Struktur überlegt:
-
-  \begin{itemize}
-    \item
-      Jeder Datensatz ist ein \lstinline{struct},
-      der zusätzlich zum eigentlichen Inhalt noch einen Zeiger
-      auf das nächste Element enthält.
-    \item
-      Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}.
-    \item
-      Eine Variable (z.\,B.\ \lstinline{first}) zeigt auf das erste Element.
-    \item
-      Wenn die Liste leer ist, zeigt bereits die \lstinline{first}-Variable
-      auf \lstinline{NULL}.
-  \end{itemize}
-
-  \begin{quote}
-    \begin{tikzpicture}
-      \color{blendedblue}
-      \node(first) at (0,0.5) {first};
-      \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3};
-      \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7};
-      \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137};
-      \node(NULL) at (7,2) {NULL};
-      \draw[-latex](first)--(3);
-      \draw[-latex](3)--(7);
-      \draw[-latex](7)--(137);
-      \draw[-latex](137)--(NULL);
-    \end{tikzpicture}
-  \end{quote}
-
-  Eine derartige Struktur heißt eine \newterm{(einfach) verkettete Liste}.
-
-  Wenn nun ein zusätzliches Element in die Liste eingefügt werden soll,
-  geschieht dies durch "`Umbiegen"' der Zeiger,
-  die auf das jeweils nächste Element zeigen:
-
-  \begin{quote}
-    \begin{tikzpicture}
-      \color{blendedblue}
-      \node(first) at (0,0.5) {first};
-      \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3};
-      \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5};
-      \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7};
-      \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137};
-      \node(NULL) at (7,2) {NULL};
-      \draw[-latex](first)--(3);
-      \draw[-latex](3) to[out=0] (5);
-      \draw[-latex](5) to[in=180] (7);
-      \draw[-latex](7)--(137);
-      \draw[-latex](137)--(NULL);
-    \end{tikzpicture}
-  \end{quote}
-
-  Unabhängig von der Gesamtzahl der Elemente,
-  die sich bereits in der Liste befinden,
-  müssen für das Einfügen eines Elements genau 2 Zeiger neu gesetzt werden.
-  Der Aufwand für das Einfügen beträgt somit $\mathcal{O}(1)$.
-
-  Diesem Vorteil steht der Nachteil gegenüber,
-  daß es bei einer verketteten Liste nicht mehr möglich ist,
-  "`einfach so"' auf das Element mit einem bekannten Index zuzugreifen;
-  dies kann nun nur noch über eine Schleife geschehen.
-  Während bei einem Array der wahlfreie Zugriff in $\mathcal{O}(1)$ möglich ist,
-  geschieht dies bei einer verketteten Liste in $\mathcal{O}(n)$.
-
-  Als Konsequenz ist auch das Suchen in $\mathcal{O}(\log n)$ nicht mehr möglich;
-  auch dies erfordert nun $\mathcal{O}(n)$.
-
-  \subsection{Bäume}
-
-  Für datenintensive Anwendungen -- insbesondere Datenbanken --
-  ist es wünschenswert, \emph{sowohl\/} den wahlfreien Zugriff
-  \emph{als auch\/} das Einfügen in der Mitte \emph{als auch\/}
-  das Suchen und das sortierte Einfügen möglichst effizient zu realisieren.
-
-  Dies geschieht über rekursive Datenstrukturen, sog.\ \newterm{Bäume}.
-
-  \breath
-
-  Wie bei einer verketteten Liste sind die Elemente -- die \newterm{Knoten\/} --
-  eines Baums \lstinline{struct}-Variable.
-  Zusätzlich zum eigentlichen Inhalt speichert man darin noch Zeiger
-  auf größere bzw.\ kleinere Elemente.
-
-  Im einfachsten Fall enthält jeder Knoten genau einen Inhalt
-  und jeweils einen Zeiger auf kleinere bzw.\ größere Elemente:
-
-  \begin{lstlisting}
-    typedef struct node
-    {
-      int content;
-      struct node *left, *right;
-    } node;
-  \end{lstlisting}
-
-  Ein aus derartigen Knoten aufgebauter Baum
-  verzweigt sich an jedem Knoten in jeweils zwei Teilbäume
-  und heißt daher \newterm{binärer Baum}.
-
-  Die Struktur emöglicht es,
-  jeweils "`zwischen"' zwei bereits eingefügten Knoten noch weitere einzufügen.
-  Wenn in einen derartigen sortierten binären Baum nacheinander die Zahlen
-  7, 3, 137 und 5 eingefügt werden, ergibt sich das folgende Bild:
-
-  \begin{quote}
-    \begin{tikzpicture}
-      \color{blendedblue}
-      \node(root) at (0,0) {\lstinline{node *root;}};
-      \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7};
-      \draw[-latex](root)--(7);
-      \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137};
-      \draw[-latex](7)--(137);
-      \node(137_left) at (1,-4.5) {\lstinline{NULL}};
-      \node(137_right) at (3,-4.5) {\lstinline{NULL}};
-      \draw[-latex](137)--(137_left);
-      \draw[-latex](137)--(137_right);
-      \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3};
-      \draw[-latex](7)--(3);
-      \node(3_left) at (-3,-4.5) {\lstinline{NULL}};
-      \draw[-latex](3)--(3_left);
-      \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5};
-      \draw[-latex](3)--(5);
-      \node(5_left) at (-2,-6) {\lstinline{NULL}};
-      \node(5_right) at (0,-6) {\lstinline{NULL}};
-      \draw[-latex](5)--(5_left);
-      \draw[-latex](5)--(5_right);
-    \end{tikzpicture}
-  \end{quote}
-
-  Sowohl das Einfügen als auch die Ausgabe und die Suche
-  erfolgen in Bäumen \emph{rekursiv}.
-  Der Rechenaufwand hängt dabei von der Rekursionstiefe,
-  also von der "`Tiefe"' des Baums ab.
-  Da die Tiefe mit der maximal möglichen Anzahl der Knoten logarithmisch wächst,
-  ist Einfügen und Suchen in $\mathcal{O}(\log n)$ möglich.
-  Dies ist ein Kompromiß zwischen den Verhalten eines Arrays
-  (Einfügen in $\mathcal{O}(n)$, Suchen in $\mathcal{O}(\log n)$)
-  und dem einer verketteten Liste (Einfügen in $\mathcal{O}(1)$,
-  Suchen in $\mathcal{O}(n)$).
-  Ein sortiertes Einfügen in einen Baum
-  ermöglicht eine Sortierung in $\mathcal{O}(n\log n)$.
-
-  Dies funktioniert nur, wenn die Tiefe des Baums tatsächlich nur logarithmisch
-  mit der Anzahl der Knoten wächst.
-  Wenn man in dem oben beschriebenen einfachen Fall eines binären Baums
-  die Elemente in bereits sortierter Reihenfolge einfügt,
-  entartet der Baum zu einer verketteten Liste.
-  Suchen ist dann nur noch in $\mathcal{O}(n)$ möglich
-  und Sortieren in $\mathcal{O}(n^2)$.
-
-  Um dies zu vermeiden, wurden teils aufwendige Strategien entwickelt,
-  den Baum jederzeit \newterm{balanciert},
-  d.\,h.\ in logarithmischer Tiefe zu halten.
-  Derartige \newterm{balancierte Bäume\/} finden Verwendung
-  in realen Datenbank-Programmen.
-
-\end{document}
diff --git a/script/hp-slides-title-2019ws.pdf b/script/hp-slides-title-2019ws.pdf
deleted file mode 100644
index 0aceae7e85885e3d3587849559195518af8197f9..0000000000000000000000000000000000000000
Binary files a/script/hp-slides-title-2019ws.pdf and /dev/null differ
diff --git a/script/hp-slides-title-2019ws.tex b/script/hp-slides-title-2019ws.tex
deleted file mode 100644
index 48b57873a5110e5e5e5d32ed666e094d7ab8e3e9..0000000000000000000000000000000000000000
--- a/script/hp-slides-title-2019ws.tex
+++ /dev/null
@@ -1,75 +0,0 @@
-% hp-slides-title-2019ws.pdf - Title Page for Lecture Slides on Low-Level Programming
-% Copyright (C) 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-
-\setlength{\parskip}{\medskipamount}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{Wintersemester 2019/20}
-
-\begin{document}
-
-\maketitleframe
-
-\nosectionnonumber{Wichtiger Hinweis}
-
-\begin{frame}[plain]
-
-  \vfill
-
-  \shownosectionnonumber
-
-  \vspace*{-\medskipamount}
-
-  Diese Vortragsfolien dienen dazu, den Vortrag der/des Lehrenden zu unter-\\stützen.
-  Sie enthalten \textbf{nur einen Teil} der Lerninhalte.
-  Wie groß dieser Teil ist, hängt von den konkreten Lerninhalten ab
-  und kann von "`praktisch alles"' bis "`praktisch gar nichts"' schwanken.
-  Diese Folien alleine sind daher
-  \textbf{nicht für ein Selbststudium geeignet!}
-  Hierfür sei auf das Skript verwiesen,
-  in dem allerdings keine tagesaktuellen Änderungen enthalten sind.
-
-  Mindestens genauso wichtig wie die Vortragsfolien sind die Beispiel-Programme,
-  die vor Ihren Augen in den Vorlesungen erarbeitet werden.
-  Diese sind im Git-Repository
-  (\url{https://gitlab.cvh-server.de/pgerwinski/hp.git})
-  mit allen Zwischenschritten enthalten und befinden sich
-  in den zu den jeweiligen Kalenderdaten gehörenden Verzeichnissen
-  (z.\,B.\ für den 10.\kern0.5pt10.\,2019 unter
-  \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010/}\kern1pt).
-
-  Wenn Sie die Übungsaufgaben bearbeiten, nutzen Sie die Gelegenheit,
-  Ihre Lösungen in den Übungen überprüfen zu lassen.
-  Wer nach Vergleich mit der Musterlösung zu dem Schluß kommt,
-  alles richtig gelöst zu haben, erlebt sonst in der Klausur oft eine
-  unangenehme Überraschung.
-
-  \strut\hfill In jedem Fall: \emph{Viel Erfolg!}
-
-\end{frame}
-
-\end{document}
diff --git a/script/if-0.c b/script/if-0.c
deleted file mode 100644
index dfb4aec197bbb12584bbaceb35181fc7f0b015f2..0000000000000000000000000000000000000000
--- a/script/if-0.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b;
-  printf ("Bitte a eingeben: ");
-  scanf ("%d", &a);
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  printf ("a geteilt durch b ist: %d\n", a / b);
-  return 0;
-}
diff --git a/script/if-1.c b/script/if-1.c
deleted file mode 100644
index e3104ff36e95c10188beb787fb2a2c27457a17b2..0000000000000000000000000000000000000000
--- a/script/if-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b;
-  printf ("Bitte a eingeben: ");
-  scanf ("%d", &a);
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("a geteilt durch b ist: %d\n", a / b);
-  return 0;
-}
diff --git a/script/if-2.c b/script/if-2.c
deleted file mode 100644
index 295496a3d67ae6220d8ed49724cab55e4dc6115e..0000000000000000000000000000000000000000
--- a/script/if-2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b;
-  printf ("Bitte a eingeben: ");
-  scanf ("%d", &a);
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("a geteilt durch b ist: %d\n", a / b);
-  else
-    printf ("Bitte nicht durch 0 teilen!\n");
-  return 0;
-}
diff --git a/script/if-3.c b/script/if-3.c
deleted file mode 100644
index 514672ff98b5524216ef2c14bfb2a0601c0177e9..0000000000000000000000000000000000000000
--- a/script/if-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b;
-  printf ("Bitte a eingeben: ");
-  scanf ("%d", &a);
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("a geteilt durch b ist: %d\n", a / b);
-  else
-    printf ("Bitte nicht durch 0 teilen!\n");
-    printf ("Das tut man nicht.\n");
-  return 0;
-}
diff --git a/script/if-4.c b/script/if-4.c
deleted file mode 100644
index e82781f53b33882eef10cca825fb6ebe9b886942..0000000000000000000000000000000000000000
--- a/script/if-4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b;
-  printf ("Bitte a eingeben: ");
-  scanf ("%d", &a);
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("a geteilt durch b ist: %d\n", a / b);
-  else
-    {
-      printf ("Bitte nicht durch 0 teilen!\n");
-      printf ("Das tut man nicht.\n");
-    }
-  return 0;
-}
diff --git a/script/if-5.c b/script/if-5.c
deleted file mode 100644
index af167ac2baf8a2467e87d1ec1c6fb43cc967ed81..0000000000000000000000000000000000000000
--- a/script/if-5.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include<stdio.h>
-int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a);
-printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf(
-"a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n");
-printf("Das tut man nicht.\n");}return 0;}
diff --git a/script/if-6.c b/script/if-6.c
deleted file mode 100644
index aa0c257019586c9371441e379bb777e2888804bb..0000000000000000000000000000000000000000
--- a/script/if-6.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int b;
-  printf ("Bitte b eingeben: ");
-  scanf ("%d", &b);
-  printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0);
-  printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0);
-  printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23);
-  return 0;
-}
diff --git a/script/incdate-0.c b/script/incdate-0.c
deleted file mode 100644
index 5c54eb2087df82f7b4ddf4fb394cec6fc5899d28..0000000000000000000000000000000000000000
--- a/script/incdate-0.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 31;
-  d->month = 1;
-  d->year = 2012;
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-1.c b/script/incdate-1.c
deleted file mode 100644
index df35af04eb9a60e5ce4a23e1ba696c03c43ea445..0000000000000000000000000000000000000000
--- a/script/incdate-1.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 31;
-  d->month = 1;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;  /* FIXME */
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-2.c b/script/incdate-2.c
deleted file mode 100644
index 255cae70abca2e526ce4bbe487ee0f5f8fd25580..0000000000000000000000000000000000000000
--- a/script/incdate-2.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 31;
-  d->month = 1;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  if (d->day > 31)  /* FIXME */
-    {
-      d->month++;  /* FIXME */
-      d->day = 1;
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-3.c b/script/incdate-3.c
deleted file mode 100644
index 6ed5cd4190ebbeec448728d7b0cc6778abe63684..0000000000000000000000000000000000000000
--- a/script/incdate-3.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 31;
-  d->month = 12;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  if (d->day > 31)  /* FIXME */
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-4.c b/script/incdate-4.c
deleted file mode 100644
index 86c6e623c566d1cd8f67d3c3268fec016c3c7bbc..0000000000000000000000000000000000000000
--- a/script/incdate-4.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 30;
-  d->month = 4;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;  /* FIXME */
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-5.c b/script/incdate-5.c
deleted file mode 100644
index e97980c292d7d25c2a30beb74b5a390e67768720..0000000000000000000000000000000000000000
--- a/script/incdate-5.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 30;
-  d->month = 4;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;
-  if (d->month == 2)
-    days_in_month = 28;  /* FIXME */
-  else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-    days_in_month = 30;
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-6.c b/script/incdate-6.c
deleted file mode 100644
index 1ce6f6a8a6a64d5ea0d81b048a6287e901ba3ae3..0000000000000000000000000000000000000000
--- a/script/incdate-6.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 28;
-  d->month = 2;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;
-  if (d->month == 2)
-    {
-      int is_leap_year = 1;  /* FIXME */
-      if (is_leap_year)
-        days_in_month = 29;
-      else
-        days_in_month = 28;
-    }
-  else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-    days_in_month = 30;
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-7.c b/script/incdate-7.c
deleted file mode 100644
index 983c0fdbe8de409f38006c1507cde49727e5102c..0000000000000000000000000000000000000000
--- a/script/incdate-7.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 28;
-  d->month = 2;
-  d->year = 2012;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;
-  if (d->month == 2)
-    {
-      int is_leap_year = 0;
-      if (d->year % 4 == 0)
-        is_leap_year = 1;  /* FIXME */
-      if (is_leap_year)
-        days_in_month = 29;
-      else
-        days_in_month = 28;
-    }
-  else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-    days_in_month = 30;
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-8.c b/script/incdate-8.c
deleted file mode 100644
index b8d4d5fe2b4d1766b66e4f7ec0aad0c273902f93..0000000000000000000000000000000000000000
--- a/script/incdate-8.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 28;
-  d->month = 2;
-  d->year = 2100;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;
-  if (d->month == 2)
-    {
-      int is_leap_year = 0;
-      if (d->year % 4 == 0)
-        is_leap_year = 1;  /* FIXME */
-      if (is_leap_year)
-        days_in_month = 29;
-      else
-        days_in_month = 28;
-    }
-  else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-    days_in_month = 30;
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/incdate-9.c b/script/incdate-9.c
deleted file mode 100644
index 288491ae9feb71fc79d32c2a09c1b34469c1d173..0000000000000000000000000000000000000000
--- a/script/incdate-9.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 28;
-  d->month = 2;
-  d->year = 2000;
-}
-
-void inc_date (date *d)
-{
-  d->day++;
-  int days_in_month = 31;
-  if (d->month == 2)
-    {
-      int is_leap_year = 0;
-      if (d->year % 4 == 0)
-        {
-          is_leap_year = 1;
-          if (d->year % 100 == 0)
-            {
-              is_leap_year = 0;
-              if (d->year % 400 == 0)
-                is_leap_year = 1;
-            }
-        }
-      if (is_leap_year)
-        days_in_month = 29;
-      else
-        days_in_month = 28;
-    }
-  else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11)
-    days_in_month = 30;
-  if (d->day > days_in_month)
-    {
-      d->month++;
-      d->day = 1;
-      if (d->month > 12)
-        {
-          d->year++;
-          d->month = 1;
-        }
-    }
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  inc_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/input-1.c b/script/input-1.c
deleted file mode 100644
index ed33d5ddcde9772002f639a19ffd6ce105307080..0000000000000000000000000000000000000000
--- a/script/input-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &a);
-  printf ("Sie haben eingegeben: %d\n", a);
-  return 0;
-}
diff --git a/script/input-2.c b/script/input-2.c
deleted file mode 100644
index 6b8995d3639f2f34f74ac4b309bcc7be0f895325..0000000000000000000000000000000000000000
--- a/script/input-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", a);
-  printf ("Sie haben eingegeben: %d\n", a);
-  return 0;
-}
diff --git a/script/io-ports-and-interrupts.pdf b/script/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/script/io-ports-and-interrupts.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/io-ports-and-interrupts.pdf
\ No newline at end of file
diff --git a/script/logo-hochschule-bochum-cvh-text-v2.pdf b/script/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/script/logo-hochschule-bochum-cvh-text-v2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/script/logo-hochschule-bochum.pdf b/script/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/script/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/script/loop-1.c b/script/loop-1.c
deleted file mode 100644
index 8cca7d3e184272d08d3ddebe4c13a5afa7a1cd6e..0000000000000000000000000000000000000000
--- a/script/loop-1.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int i = 1;
-  while (i <= 10)
-    {
-      printf ("%d\n", i);
-      i = i + 1;
-    }
-  return 0;
-}
diff --git a/script/loop-2.c b/script/loop-2.c
deleted file mode 100644
index 1098615d2ec421e20303e52a73b96b65ec254613..0000000000000000000000000000000000000000
--- a/script/loop-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int i;
-  for (i = 1; i <= 10; i = i + 1)
-    printf ("%d\n", i);
-  return 0;
-}
diff --git a/script/loop-3.c b/script/loop-3.c
deleted file mode 100644
index ff95622ceb9310bbc5b1d6c4b71e89ed9b83af68..0000000000000000000000000000000000000000
--- a/script/loop-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int i;
-  for (i = 1; 10; i + 1)
-    printf ("%d\n", i);
-  return 0;
-}
diff --git a/script/maerchen.c b/script/maerchen.c
deleted file mode 100644
index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000
--- a/script/maerchen.c
+++ /dev/null
@@ -1,4 +0,0 @@
-Vor langer, langer Zeit
-gab es einmal
-#include "hexe.h"
-Die lebte in einem Wald.
diff --git a/script/mathe-1.c b/script/mathe-1.c
deleted file mode 100644
index 6a099f1e281242f3d6892e7538dc4b140dc4b861..0000000000000000000000000000000000000000
--- a/script/mathe-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", 23 + 19);
-  return 0;
-}
diff --git a/script/moon-texture.png b/script/moon-texture.png
deleted file mode 120000
index 1af16e6965c37de47d65304f0a45287800177f97..0000000000000000000000000000000000000000
--- a/script/moon-texture.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/moon-texture.png
\ No newline at end of file
diff --git a/script/opengl-magic.c b/script/opengl-magic.c
deleted file mode 100644
index 121353940b3db8bdcc6193ef110aebdd75a0de1a..0000000000000000000000000000000000000000
--- a/script/opengl-magic.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#if defined(__APPLE__) || defined(MACOSX)
-  #include <OpenGL/gl.h>
-  #include <OpenGL/glu.h>
-  #include <GLUT/glut.h>
-#else
-  #include <GL/gl.h>
-  #include <GL/glu.h>
-  #include <GL/glut.h>
-#endif
-
-#include "opengl-magic.h"
-
-void init_opengl (int *argcp, char **argv, char *window_name)
-{
-  glutInit (argcp, argv);
-  glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
-  glutInitWindowSize (1024, 768);
-  glutCreateWindow (window_name);
-  glMatrixMode (GL_PROJECTION);
-  glLoadIdentity ();
-  gluPerspective (20.0, -1.33333, 3.0, 7.0);
-  glMatrixMode (GL_MODELVIEW);
-  glLoadIdentity ();
-  glTranslatef (0.0, 0.0, -5.0);
-  glClearColor (0.0, 0.0, 0.0, 0.0);
-  glEnable (GL_DEPTH_TEST);
-  glEnable (GL_LIGHTING);
-  glEnable (GL_LIGHT0);
-  static GLfloat light0_position[] = { 1.0, 0.0, 1.0, 0.0 };
-  glLightfv (GL_LIGHT0, GL_POSITION, light0_position);
-}
-
-void set_material_color (float r, float g, float b)
-{
-  GLfloat color[] = { r, g, b };
-  glMaterialfv (GL_FRONT, GL_AMBIENT, color);
-  glMaterialfv (GL_FRONT, GL_DIFFUSE, color);
-}
-
-#if defined(__APPLE__) || defined(MACOSX)
-
-void glutSolidCylinder (double radius, double height, int slices, int stacks)
-{
-  GLUquadricObj *q = gluNewQuadric ();
-  gluCylinder (q, radius, radius, height, slices, stacks);
-  gluDeleteQuadric (q);
-}
-
-#endif
diff --git a/script/opengl-magic.h b/script/opengl-magic.h
deleted file mode 100644
index afa963a5fab8ac6ba323f724c0dcb51a995a76aa..0000000000000000000000000000000000000000
--- a/script/opengl-magic.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef OPENGL_MAGIC_H
-#define OPENGL_MAGIC_H
-
-extern void init_opengl (int *argcp, char **argv, char *window_name);
-extern void set_material_color (float r, float g, float b);
-
-#ifdef __MACOSX__
-  extern void glutSolidCylinder (double radius, double height, int slices, int stacks);
-#endif
-
-#endif /* OPENGL_MAGIC_H */
diff --git a/script/orbit-1.c b/script/orbit-1.c
deleted file mode 100644
index 1f963cf44d937ba0627d7bc224930a7bcd39d27b..0000000000000000000000000000000000000000
--- a/script/orbit-1.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glut.h>
-#include "opengl-magic.h"
-#include "textured-spheres.h"
-
-float t = 0.0;
-GLuint earth_texture, moon_texture;
-
-void draw_earth (void)
-{
-  glPushMatrix ();
-  glRotatef (90, 1.0, 0.0, 0.0);
-  glRotatef (100.0 * t, 0.0, 0.0, 1.0);
-  draw_textured_sphere (earth_texture, 0.25512, 63, 20);
-  glPopMatrix ();
-}
-
-void draw_moon (void)
-{
-  glPushMatrix ();
-  glRotatef (90, 1.0, 0.0, 0.0);
-  glRotatef (-90, 0.0, 0.0, 1.0);
-  draw_textured_sphere (moon_texture, 0.06952, 31, 10);
-  glPopMatrix ();
-}
-
-void draw (void)
-{
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  glPushMatrix ();
-  glRotatef (23.44, 1.0, 0.0, -1.0);
-  draw_earth ();
-  glRotatef (5.145, 0.0, 1.0, 1.0);
-  glRotatef (30.0 * t, 0.0, -1.0, 0.0);
-  glTranslatef (0.9, 0.0, 0.0);
-  draw_moon ();
-  glPopMatrix ();
-  glFlush ();
-  glutSwapBuffers ();
-}
-
-void timer_handler (int value)
-{
-  t += 0.05;
-  glutPostRedisplay ();
-  glutTimerFunc (50, timer_handler, 0);
-}
-
-int main (int argc, char **argv)
-{
-  init_opengl (&argc, argv, "Orbit");
-  init_texture ("earth-texture.png", &earth_texture);
-  init_texture ("moon-texture.png", &moon_texture);
-  glutDisplayFunc (draw);
-  glutTimerFunc (50, timer_handler, 0);
-  glutMainLoop ();
-  return 0;
-}
diff --git a/script/output-1.c b/script/output-1.c
deleted file mode 100644
index d4f8b191d6d4491df2661046ce99c21ec2045a60..0000000000000000000000000000000000000000
--- a/script/output-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf (42);
-  return 0;
-}
diff --git a/script/output-2.c b/script/output-2.c
deleted file mode 100644
index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000
--- a/script/output-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: %d\n", 42);
-  return 0;
-}
diff --git a/script/output-3.c b/script/output-3.c
deleted file mode 100644
index d099c14a9d196ed21cf3bd07945b59221eccebcb..0000000000000000000000000000000000000000
--- a/script/output-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2);
-  return 0;
-}
diff --git a/script/output-4.c b/script/output-4.c
deleted file mode 100644
index 9f2674e21e43a2566d9c4f4f0548af05801c6a7b..0000000000000000000000000000000000000000
--- a/script/output-4.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n");
-  return 0;
-}
diff --git a/script/params-1.c b/script/params-1.c
deleted file mode 100644
index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000
--- a/script/params-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  for (int i = 0; i < argc; i++)
-    printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-  return 0;
-}
diff --git a/script/params-2.c b/script/params-2.c
deleted file mode 100644
index d4ac6da31fe8138bf4b42326445a1ea2e2684a7d..0000000000000000000000000000000000000000
--- a/script/params-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  for (int i = 0; argv[i] != NULL; i++)
-    printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-  return 0;
-}
diff --git a/script/params-3.c b/script/params-3.c
deleted file mode 100644
index 412c451645508ecd8e65c695f47b8ffb822657a2..0000000000000000000000000000000000000000
--- a/script/params-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  for (char **p = argv; *p; p++)
-    printf ("argv[p] = \"%s\"\n", *p);
-  return 0;
-}
diff --git a/script/pgscript.sty b/script/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/script/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/script/pgslides.sty b/script/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/script/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/script/philosophy.c b/script/philosophy.c
deleted file mode 100644
index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000
--- a/script/philosophy.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-#include "answer.h"
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
diff --git a/script/pointers-1.c b/script/pointers-1.c
deleted file mode 100644
index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000
--- a/script/pointers-1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/script/qsort-1.c b/script/qsort-1.c
deleted file mode 100644
index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000
--- a/script/qsort-1.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/script/qsort-2.c b/script/qsort-2.c
deleted file mode 100644
index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000
--- a/script/qsort-2.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-  if (l < right)
-    quicksort (name, l, right);
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/script/qsort-3.c b/script/qsort-3.c
deleted file mode 100644
index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000
--- a/script/qsort-3.c
+++ /dev/null
@@ -1,74 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, char *pivot, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (name[i] == pivot)
-        printf (" <==");
-      else if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, char *pivot, int left, int right)
-{
-  int result = strcmp (name[left], pivot);
-  comparisons++;
-  display (name, pivot, left, right);
-  usleep (200000);
-  return result;
-}
-
-void quicksort (char **name, int left, int right)
-{
-  int p = (left + right) / 2;
-  char *pivot = name[p];
-  int l = left;
-  int r = right;
-  while (l < r)
-    {
-      while (l < r && compare (name, pivot, l, r - 1) < 0)
-        l++;
-      while (l < r && compare (name, pivot, r - 1, l) > 0)
-        r--;
-      if (l < r)
-        {
-          char *temp = name[r - 1];
-          name[r - 1] = name[l];
-          name[l] = temp;
-          l++;
-          r--;
-        }
-    }
-  if (r > left)
-    quicksort (name, left, r);
-  if (l < right)
-    quicksort (name, l, right);
-}
-
-void sort (char **name)
-{
-  int r = 0;
-  while (name[r])
-    r++;
-  quicksort (name, 0, r);
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, NULL, -1, -1);
-  return 0;
-}
diff --git a/script/sfmath.sty b/script/sfmath.sty
deleted file mode 120000
index 599e505416fb5a096f751581a66c53bc109e935d..0000000000000000000000000000000000000000
--- a/script/sfmath.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/sfmath.sty
\ No newline at end of file
diff --git a/script/sort-0.c b/script/sort-0.c
deleted file mode 100644
index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000
--- a/script/sort-0.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int find_first (char **name)
-{
-  return 2;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  printf ("%s\n", name[first]);
-  return 0;
-}
diff --git a/script/sort-1.c b/script/sort-1.c
deleted file mode 100644
index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000
--- a/script/sort-1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int find_first (char **name)
-{
-  int first = 0;
-  for (int i = 1; name[i]; i++)
-    if (strcmp (name[i], name[first]) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  printf ("%s\n", name[first]);
-  return 0;
-}
diff --git a/script/sort-2.c b/script/sort-2.c
deleted file mode 100644
index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000
--- a/script/sort-2.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name)
-{
-  int first = 0;
-  for (int i = 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name);
-  display (name, first, -1);
-  return 0;
-}
diff --git a/script/sort-3.c b/script/sort-3.c
deleted file mode 100644
index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000
--- a/script/sort-3.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  int first = find_first (name, 0);
-  display (name, first, -1);
-  return 0;
-}
diff --git a/script/sort-4.c b/script/sort-4.c
deleted file mode 100644
index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000
--- a/script/sort-4.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/sort-5.c b/script/sort-5.c
deleted file mode 100644
index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000
--- a/script/sort-5.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = {
-                   #include "names.h"
-                   NULL
-                 };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/sort-6.c b/script/sort-6.c
deleted file mode 100644
index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000
--- a/script/sort-6.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-//  display (name, left, right);
-//  usleep (200);
-  return result;
-}
-
-int find_first (char **name, int i0)
-{
-  int first = i0;
-  for (int i = i0 + 1; name[i]; i++)
-    if (compare (name, i, first) < 0)
-      first = i;
-  return first;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = find_first (name, sorted);
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = {
-                   #include "names.h"
-                   NULL
-                 };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/sort-7.c b/script/sort-7.c
deleted file mode 100644
index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000
--- a/script/sort-7.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-int comparisons = 0;
-
-void display (char **name, int left, int right)
-{
-  printf ("\e[H\e[J");
-  for (int i = 0; name[i]; i++)
-    {
-      printf ("%s", name[i]);
-      if (i == left || i == right)
-        printf (" <--");
-      printf ("\n");
-    }
-  printf ("%d\n", comparisons);
-}
-
-int compare (char **name, int left, int right)
-{
-  int result = strcmp (name[left], name[right]);
-  comparisons++;
-  display (name, left, right);
-  usleep (200000);
-  return result;
-}
-
-void sort (char **name)
-{
-  int sorted = 0;
-  while (name[sorted])
-    {
-      int first = sorted;
-      for (int i = sorted + 1; name[i]; i++)
-        if (compare (name, i, first) < 0)
-          first = i;
-      char *temp = name[sorted];
-      name[sorted] = name[first];
-      name[first] = temp;
-      sorted++;
-    }
-}
-
-int main (void)
-{
-  char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter",
-                   "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans",
-                   "Thomas", "Ulrich", "Zacharias", NULL };
-  sort (name);
-  display (name, -1, -1);
-  return 0;
-}
diff --git a/script/statements-1.c b/script/statements-1.c
deleted file mode 100644
index 92514b3c0bcccc1ff4eb032037407a122a2b02e8..0000000000000000000000000000000000000000
--- a/script/statements-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  2 + 2;
-  return 0;
-}
diff --git a/script/statements-2.c b/script/statements-2.c
deleted file mode 100644
index 475bce5c85b75e4e57d0d1fee9179daaf6647dbf..0000000000000000000000000000000000000000
--- a/script/statements-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int x;
-  x = printf ("%d\n", 2 + 2);
-  printf ("%d\n", x);
-  return 0;
-}
diff --git a/script/strings-1.c b/script/strings-1.c
deleted file mode 100644
index d06457baea6cca1429b4c37026c8af1a8500a676..0000000000000000000000000000000000000000
--- a/script/strings-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello_world[] = "Hello, world!\n";
-  int i = 0;
-  while (hello_world[i] != 0)
-    printf ("%d", hello_world[i++]);
-  return 0;
-}
diff --git a/script/strings-2.c b/script/strings-2.c
deleted file mode 100644
index 4128aea3e056e146850c1b7ded7a7a2e16dbfcba..0000000000000000000000000000000000000000
--- a/script/strings-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello_world[] = "Hello, world!\n";
-  int i = 0;
-  while (hello_world[i] != 0)
-    printf ("%c", hello_world[i++]);
-  return 0;
-}
diff --git a/script/strings-3.c b/script/strings-3.c
deleted file mode 100644
index a2e12ba883dc8e7f16dbc53319566c5b942bc791..0000000000000000000000000000000000000000
--- a/script/strings-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello_world[] = "Hello, world!\n";
-  char *p = hello_world;
-  while (*p)
-    printf ("%c", *p++);
-  return 0;
-}
diff --git a/script/strings-4.c b/script/strings-4.c
deleted file mode 100644
index dc9602c6d3ea235a66f167b3db1c345aad181a2c..0000000000000000000000000000000000000000
--- a/script/strings-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *p = "Hello, world!";
-  printf ("%s\n", p);
-  return 0;
-}
diff --git a/script/structs-1.c b/script/structs-1.c
deleted file mode 100644
index 1cc76786c7595897b141cf492d9ac747e19bb000..0000000000000000000000000000000000000000
--- a/script/structs-1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-int main (void)
-{
-  date today = { 1, 11, 2016 };
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/script/structs-2.c b/script/structs-2.c
deleted file mode 100644
index 9bfa4cbfb321487fbeed8022de0c027ab7e468e2..0000000000000000000000000000000000000000
--- a/script/structs-2.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  (*d).day = 1;
-  (*d).month = 11;
-  (*d).year = 2016;
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  printf ("%d.%d.%d\n", today.day,
-          today.month, today.year);
-  return 0;
-}
diff --git a/script/structs-3.c b/script/structs-3.c
deleted file mode 100644
index 2abdd1fb052263976666b9a8bdf0646871936b47..0000000000000000000000000000000000000000
--- a/script/structs-3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 1;
-  d->month = 11;
-  d->year = 2016;
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  printf ("%d.%d.%d\n", today.day,
-          today.month, today.year);
-  return 0;
-}
diff --git a/script/textured-spheres.c b/script/textured-spheres.c
deleted file mode 100644
index aee3dc199ab3bd0c85c63d22e5cfdc9456ca2188..0000000000000000000000000000000000000000
--- a/script/textured-spheres.c
+++ /dev/null
@@ -1,168 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <png.h>
-#include "textured-spheres.h"
-
-#ifndef __USE_POSIX
-  extern int fileno (FILE *stream);
-#endif
-
-static png_byte *load_png_file (char *filename, unsigned *w, unsigned *h)
-{
-  FILE *f = fopen (filename, "rb");
-  if (!f)
-    return NULL;
-
-  /* is it a PNG file? */
-  png_byte buf[8];
-  if (fread (buf, 1, 8, f) != 8)
-    {
-      fclose (f);
-      return NULL;
-    }
-  if (!png_check_sig (buf, 8))
-    {
-      fclose (f);
-      return NULL;
-    }
-
-  png_struct *png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
-                                                NULL, NULL, NULL);
-  if (!png_ptr)
-    {
-      fclose (f);
-      return NULL;
-    }
-
-  png_info *info_ptr = png_create_info_struct (png_ptr);
-  if (!info_ptr)
-    {
-      fclose (f);
-      png_destroy_read_struct (&png_ptr, NULL, NULL);
-      return NULL;
-    }
-
-  if (setjmp (png_jmpbuf (png_ptr)))
-    {
-      fclose (f);
-      png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
-      return NULL;
-    }
-
-  png_init_io (png_ptr, f);
-  png_set_sig_bytes (png_ptr, 8);
-  png_read_info (png_ptr, info_ptr);
-
-  png_uint_32 width;
-  png_uint_32 height;
-  int bit_depth;
-  int color_type;
-  png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth,
-                &color_type, NULL, NULL, NULL);
-
-  /* tell libpng to strip 16 bit/color files down to 8 bits/color */
-  if (bit_depth == 16)
-    png_set_strip_16 (png_ptr);
-  /* expand paletted colors into true RGB triplets */
-  if (color_type == PNG_COLOR_TYPE_PALETTE)
-    png_set_expand (png_ptr);
-  /* expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
-  if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
-    png_set_expand (png_ptr);
-  /* expand paletted or RGB images with transparency to full alpha channels
-     so the data will be available as RGBA quartets. */
-  if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
-    png_set_expand (png_ptr);
-  /* transform grayscale images into rgb */
-  if (color_type == PNG_COLOR_TYPE_GRAY
-      || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
-    png_set_gray_to_rgb (png_ptr);
-
-  if (color_type & PNG_COLOR_MASK_ALPHA)
-    png_set_strip_alpha (png_ptr);
-
-  png_read_update_info (png_ptr, info_ptr);
-  png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth,
-		&color_type, NULL, NULL, NULL);
-  if (color_type != PNG_COLOR_TYPE_RGB
-      && color_type != PNG_COLOR_TYPE_RGB_ALPHA)
-    {
-      fclose (f);
-      png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
-      return NULL;
-    }
-
-  png_uint_32 row_bytes = png_get_rowbytes (png_ptr, info_ptr);
-  if (row_bytes & 0x01)
-    row_bytes++;
-
-  png_byte *png_pixels = malloc (row_bytes * height * sizeof (png_byte));
-  if (png_pixels == NULL)
-    {
-      fclose (f);
-      png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
-      return NULL;
-    }
-
-  png_byte **row_pointers = malloc (height * sizeof (png_bytep));
-  if (row_pointers == NULL)
-    {
-      fclose (f);
-      png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
-      free (png_pixels);
-      png_pixels = NULL;
-      return NULL;
-    }
-
-  int i;
-  for (i = 0; i < height; i++)
-    row_pointers[i] = png_pixels + i * row_bytes;
-
-  png_read_image (png_ptr, row_pointers);
-
-  png_read_end (png_ptr, info_ptr);
-  png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
-  fclose (f);
-
-  if (w)
-    *w = width;
-  if (h)
-    *h = height;
-  free (row_pointers);
-
-  return png_pixels;
-}
-
-void init_texture (char *image_filename, GLuint *texture)
-{
-  unsigned image_width, image_height;
-  png_byte *image = load_png_file (image_filename, &image_width, &image_height);
-  if (!image)
-    {
-      fprintf (stderr, "textured-spheres.c: cannot open texture file \"%s\"",
-               image_filename);
-      exit (1);
-    }
-  glGenTextures (1, texture);
-  glBindTexture (GL_TEXTURE_2D, *texture);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-  glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-  gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image_width, image_height, GL_RGB, GL_UNSIGNED_BYTE, image);
-}
-
-void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks)
-{
-  static GLfloat white_color[] = { 1.0, 1.0, 1.0 };
-  glMaterialfv (GL_FRONT, GL_AMBIENT, white_color);
-  glMaterialfv (GL_FRONT, GL_DIFFUSE, white_color);
-  glBindTexture (GL_TEXTURE_2D, texture);
-  glEnable (GL_TEXTURE_2D);
-  GLUquadric *sphere = gluNewQuadric ();
-  gluQuadricTexture (sphere, GL_TRUE);
-  gluSphere (sphere, radius, slices, stacks);
-  glDisable (GL_TEXTURE_2D);
-}
diff --git a/script/textured-spheres.h b/script/textured-spheres.h
deleted file mode 100644
index aa2fb4f4f6d609bbab3f524069cac8a56636c712..0000000000000000000000000000000000000000
--- a/script/textured-spheres.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef TEXTURED_SPHERES_H
-#define TEXTURED_SPHERES_H
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-extern void init_texture (char *image_filename, GLuint *texture);
-extern void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks);
-
-#endif /* TEXTURED_SPHERES_H */
diff --git a/update b/update
deleted file mode 100755
index 7e329525738ce44ce22385b3db99df43ffb3684d..0000000000000000000000000000000000000000
--- a/update
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/bin/bash
-
-sem=2019ws
-course=hp
-date_mask="20[12][0-9][01][0-9][0-3][0-9]"
-
-time_mask="[0-2][0-9][0-5][0-9][0-5][0-9]"
-base_url="https://gitlab.cvh-server.de/pgerwinski/$course/tree/master/"
-raw_base_url="https://gitlab.cvh-server.de/pgerwinski/$course/raw/master/"
-pattern="README:"
-
-if [ "$1" = "--no-slides" ]; then
-  shift
-else
-  slides_tex_file="$course-slides-$sem.tex"
-  cat > "$slides_tex_file" << EOF
-\documentclass{article}
-
-\usepackage[final]{pdfpages}
-\usepackage[paperwidth=363pt,paperheight=272pt]{geometry}
-\usepackage{hyperref}
-
-\pagestyle{empty}
-
-\begin{document}
-  \includepdf[pages=1]{script/$course-slides-title-$sem.pdf}
-  \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis}
-  \includepdf[pages=2-]{script/$course-slides-title-$sem.pdf}
-EOF
-
-  for x in $date_mask/$course-$date_mask.pdf; do
-    f=$(echo $x | cut -d '/' -f 1)
-    y=$(echo $f | cut -b 1-4)
-    m=$(echo $f | cut -b 5-6)
-    d=$(echo $f | cut -b 7-8)
-    date="$d.$m.$y"
-    src=$(echo $x | sed -e 's/\.pdf$/.tex/')
-    description=$(grep -m 1 "$pattern" "$src" | sed -e "s/^.*$pattern *//")
-    echo "  \pdfbookmark[1]{$date: $description}{$f}" >> "$slides_tex_file"
-    echo "  \includepdf[pages=-]{$x}" >> "$slides_tex_file"
-  done
-
-  echo '\end{document}' >> "$slides_tex_file"
-
-  lualatex -interaction batchmode "$slides_tex_file" \
-    && echo \
-    && lualatex -interaction batchmode "$slides_tex_file" \
-    || {
-         echo
-         echo "$0: error compiling $slides_tex_file"
-         exit 1
-       }
-  echo
-fi
-
-# if pdfjam --papersize "{362.835pt,272.126pt}" -o hp-slides-$sem.pdf \
-#    $date_mask/hp-$date_mask.pdf > /dev/null 2> pdfjam.err; then
-#   rm pdfjam.err
-# else
-#   cat pdfjam.err
-#   rm pdfjam.err
-#   exit 1
-# fi
-
-readme_old=README.md
-readme=README-NEW.md
-
-collect ()
-{
-  if [ "$1" = "--with-examples" ]; then
-    with_examples=true
-    shift
-  else
-    with_examples=false
-  fi
-  if [ "$1" = "--no-date" ]; then
-    show_date=false
-    shift
-  else
-    show_date=true
-  fi
-  headline="$1"; shift
-  source_suffix="$1"; shift
-  target_suffix="$1"; shift
-  underline=$(echo "$headline" | sed -e 's/./-/g')
-  echo >> $readme
-  echo "$headline" >> $readme
-  echo "$underline" >> $readme
-  for f in "$@"; do
-    if [ -f "$f" ]; then
-      description=$(grep -m 1 "$pattern" "$f" | sed -e "s/^.*$pattern *//")
-      if $show_date; then
-        y=$(echo $f | cut -b 1-4)
-        m=$(echo $f | cut -b 5-6)
-        d=$(echo $f | cut -b 7-8)
-        date="$d.$m.$y: "
-      else
-        date=""
-      fi
-      url="$raw_base_url"$(echo $f | sed -e "s/\.$source_suffix$/.$target_suffix/")
-      if $with_examples; then
-        example_url="$base_url"$(echo $f | sed -e "s,/[^/]*$,/,")
-        echo " * [$date$description]($url) [**(Beispiele)**]($example_url)" >> $readme
-      else
-        echo " * [$date$description]($url)" >> $readme
-      fi
-    else
-      return 1
-    fi
-  done
-}
-
-cat > $readme << EOF
-Hardwarenahe Programmierung
-===========================
-
-Lehrveranstaltung im Wintersemester 2019/20  
-Hochschule Bochum, Campus Velbert/Heiligenhaus  
-Prof. Dr. rer. nat. Peter Gerwinski
-
-Copyright © 2012–2019  Peter Gerwinski
-
-**Diese Lehrmaterialien sind freie Software.**  
-Sie dürfen diese gemäß den jeweils angegebenen Lizenzen  
-([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0),
-[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3),
-[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED))  
-studieren, kopieren, modifizieren und/oder weitergeben.  
-Für Details siehe [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README).
-EOF
-
-collect --with-examples "Vortragsfolien und Beispiele:" tex pdf $date_mask/hp-$date_mask.tex $date_mask/verschluesselung-$date_mask.tex
-
-cat >> $readme << EOF
- * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-$sem.pdf)
-EOF
-
-collect "Übungsaufgaben:" tex pdf $date_mask/hp-uebung-$date_mask.tex
-collect "Musterlösungen:" tex pdf $date_mask/hp-musterloesung-$date_mask.tex || echo "(keine)" >> $readme
-collect "Tafelbilder:" txt jpg $date_mask/photo-$date_mask-$time_mask.txt || echo "(keine)" >> $readme
-collect --no-date "Praktikumsunterlagen:" tex pdf $date_mask/hp-$sem-p[1-4].tex || echo "(keine)" >> $readme
-collect --with-examples --no-date "Alte Klausuren:" tex pdf exams/$date_mask/*-klausur-$date_mask.tex >> $readme
-
-cat >> $readme << EOF
-
-Skript:
--------
- * [Hardwarenahe Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/script/hp-$sem.pdf)
-
-Original-Materialien einschließlich Beispiel-Programme und LaTeX-Quelltexte:
-----------------------------------------------------------------------------
- * [common – gemeinsame Dateien für Skript und Vortragsfolien](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common)
- * [script – Skript zur Lehrveranstaltung](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script)
- * [201????? – Vortragsfolien und Beispiele](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master)
- * [branch 2018ws – vollständige Lehrmaterialien vom Wintersemester 2018/19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws)
-
-
-Low-Level Programming
-=====================
-
-Course in winter semester 2019–20
-Bochum University of Applied Sciences, Campus Velbert/Heiligenhaus  
-Prof. Dr. rer. nat. Peter Gerwinski
-
-Copyright © 2012–2019  Peter Gerwinski
-
-**These teaching materials are Free Software.**  
-You may study, copy, modify, and/or distribute them  
-according to their respective licences  
-([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0),
-[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3),
-[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)).  
-See the file [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README) for details.
-
- * [common – common files for lecture notes and slides](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common)
- * [script – lecture notes](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script)
- * [201????? – slides and examples](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master)
- * [hp-slides-2019ws.pdf – all slides in 1 file](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf)
- * [branch 2018ws – complete teaching materials from winter semester 2018–19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws)
-EOF
-
-if diff -wu $readme_old $readme; then
-  rm $readme
-else
-  echo -n "Press ENTER to overwrite $readme_old, ^C to abort (keeping $readme) "
-  read junk
-  mv $readme $readme_old
-fi