diff --git a/20201105/hello-1.c b/20201105/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20201105/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201105/hello-2.c b/20201105/hello-2.c
deleted file mode 100644
index 2dbbad99d102df43d00779483f789f03274353ca..0000000000000000000000000000000000000000
--- a/20201105/hello-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!");
-  return 0;
-}
diff --git a/20201105/hello-3.c b/20201105/hello-3.c
deleted file mode 100644
index 087b3ad2304138af63900056572aa62f69a353be..0000000000000000000000000000000000000000
--- a/20201105/hello-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf (Hello, world!);
-  return 0;
-}
diff --git a/20201105/hello-4.c b/20201105/hello-4.c
deleted file mode 100644
index e27a989a53130e32f7861b61e00dd347b4730879..0000000000000000000000000000000000000000
--- a/20201105/hello-4.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  "Hello, world!";
-  return 0;
-}
diff --git a/20201105/hello-gtk.c b/20201105/hello-gtk.c
deleted file mode 100644
index 016867d41e42de57390a21653de467c061e5ded0..0000000000000000000000000000000000000000
--- a/20201105/hello-gtk.c
+++ /dev/null
@@ -1,23 +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);
-  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;
-}
diff --git a/20201105/hello.c b/20201105/hello.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20201105/hello.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201105/if-1.c b/20201105/if-1.c
deleted file mode 100644
index cdab16affa86b37267669782aff8785833c18d1a..0000000000000000000000000000000000000000
--- a/20201105/if-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &a);
-  if (a > 10)
-    printf ("Die Hälfte ist: %d\n", a / 2);
-  else
-    printf ("Das Doppelte ist: %d\n", 2 * a);
-  return 0;
-}
diff --git a/20201105/if-10.c b/20201105/if-10.c
deleted file mode 100644
index fe334d7106b8a13b757e67e66070e471671002a7..0000000000000000000000000000000000000000
--- a/20201105/if-10.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/if-11.c b/20201105/if-11.c
deleted file mode 100644
index efd7fa7b33d0769f13b4689e69e28cef45fa54dd..0000000000000000000000000000000000000000
--- a/20201105/if-11.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  printf ("%d\n", a < b);
-  return 0;
-}
diff --git a/20201105/if-2.c b/20201105/if-2.c
deleted file mode 100644
index 6e676e183ba0bbdf9f9656046a6a3a1575472f80..0000000000000000000000000000000000000000
--- a/20201105/if-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("%d\n", a / b);
-  return 0;
-}
diff --git a/20201105/if-3.c b/20201105/if-3.c
deleted file mode 100644
index fe18ddb8cc91978d720368e5f6b69215d17581f8..0000000000000000000000000000000000000000
--- a/20201105/if-3.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    printf ("%d\n", a / b);
-    printf ("Danke sehr.\n");
-  return 0;
-}
diff --git a/20201105/if-4.c b/20201105/if-4.c
deleted file mode 100644
index 507d07a82870a4dc5062adc0ef79ce5e825e0dc8..0000000000000000000000000000000000000000
--- a/20201105/if-4.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/if-5.c b/20201105/if-5.c
deleted file mode 100644
index 1e6e776997c8310afd46c73eb29bab8ae5880333..0000000000000000000000000000000000000000
--- a/20201105/if-5.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <stdio.h>
-int main (void) { int a = 137; int b; printf ("Bitte eine Zahl eingeben: ");
-scanf ("%d", &b); if (b != 0) { printf ("%d\n", a / b); printf ("Danke sehr.\n"); }
-return 0; }
diff --git a/20201105/if-6.c b/20201105/if-6.c
deleted file mode 100644
index e131613c2384ed26373342de8fd238987fc66ed6..0000000000000000000000000000000000000000
--- a/20201105/if-6.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0 && a > b)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/if-7.c b/20201105/if-7.c
deleted file mode 100644
index 9624fa3f901cc34ded9ba79a91a9edb7e1fe7d7d..0000000000000000000000000000000000000000
--- a/20201105/if-7.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != 0 & a > b)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/if-8.c b/20201105/if-8.c
deleted file mode 100644
index 920bb851f4ae30da95cefde4bf6aa99d34a92bb4..0000000000000000000000000000000000000000
--- a/20201105/if-8.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != (0 & a) > b)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/if-9.c b/20201105/if-9.c
deleted file mode 100644
index 8a5ad6c228a005bc5d86f98b471aa4ec39ea6026..0000000000000000000000000000000000000000
--- a/20201105/if-9.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b != ((0 & a) > b))
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201105/input-1.c b/20201105/input-1.c
deleted file mode 100644
index 5ca4c8c63cf313591a5a57e18c915329a3c71162..0000000000000000000000000000000000000000
--- a/20201105/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/20201105/input-2.c b/20201105/input-2.c
deleted file mode 100644
index e17d5efab4ea071e9ada023e783e11425e360e09..0000000000000000000000000000000000000000
--- a/20201105/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: %20.15lf\n", a);
-  return 0;
-}
diff --git a/20201105/input-3.c b/20201105/input-3.c
deleted file mode 100644
index bd9397091a6d95d4159441a3380edad04c22fb37..0000000000000000000000000000000000000000
--- a/20201105/input-3.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: %20.13lf\n", a);
-  return 0;
-}
diff --git a/20201105/input-4.c b/20201105/input-4.c
deleted file mode 100644
index 1433c46a4b04af241fa9cc0bc5088f30b337aeba..0000000000000000000000000000000000000000
--- a/20201105/input-4.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: %23.20lf\n", a);
-  return 0;
-}
diff --git a/20201105/input-5.c b/20201105/input-5.c
deleted file mode 100644
index 3c8912a1210787f322016cd6b611a3dd1bcaced3..0000000000000000000000000000000000000000
--- a/20201105/input-5.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/20201105/loops-1.c b/20201105/loops-1.c
deleted file mode 100644
index 535de8f8e459cf19ccf7ccfc895c38bf5d2a89fd..0000000000000000000000000000000000000000
--- a/20201105/loops-1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 1;
-  while (a <= 10)
-    {
-      printf ("%d\n", a);
-      a = a + 1;
-    }
-}
diff --git a/20201105/loops-10.c b/20201105/loops-10.c
deleted file mode 100644
index cd6a07bfd5d68dd871daacc88a7ef58fc7daaa20..0000000000000000000000000000000000000000
--- a/20201105/loops-10.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int a = 137; a > -5; a = a - 2)
-    printf ("%d\n", a);
-}
diff --git a/20201105/loops-11.c b/20201105/loops-11.c
deleted file mode 100644
index 878568cec7ff5cae44b6d1f39964c2a6f265d5d2..0000000000000000000000000000000000000000
--- a/20201105/loops-11.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 1;
-  do
-    {
-      printf ("%d\n", a);
-      a = a + 1;
-    }
-  while (a <= 10);
-}
diff --git a/20201105/loops-12.c b/20201105/loops-12.c
deleted file mode 100644
index 1e41aaf610532b746194c453f93b5eddc03da5d4..0000000000000000000000000000000000000000
--- a/20201105/loops-12.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 11;
-  do
-    {
-      printf ("%d\n", a);
-      a = a + 1;
-    }
-  while (a <= 10);
-}
diff --git a/20201105/loops-13.c b/20201105/loops-13.c
deleted file mode 100644
index a034e8fbe6032c098128cf49282cec9cc4b3e78d..0000000000000000000000000000000000000000
--- a/20201105/loops-13.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 11;
-  while (a <= 10)
-    {
-      printf ("%d\n", a);
-      a = a + 1;
-    }
-}
diff --git a/20201105/loops-2.c b/20201105/loops-2.c
deleted file mode 100644
index d28512e329cd3db74551d0532efdfdf7f4d8529b..0000000000000000000000000000000000000000
--- a/20201105/loops-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int a = 1; a <= 10; a = a + 1)
-    printf ("%d\n", a);
-}
diff --git a/20201105/loops-3.c b/20201105/loops-3.c
deleted file mode 100644
index f197918519623121390cf7fb89a15b4b443592d0..0000000000000000000000000000000000000000
--- a/20201105/loops-3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 10;
-  while (a)
-    {
-      printf ("%d\n", a);
-      a = a - 1;
-    }
-}
diff --git a/20201105/loops-4.c b/20201105/loops-4.c
deleted file mode 100644
index bbab20e7f3e2eea2051d2cc2a64e82d1573dbe91..0000000000000000000000000000000000000000
--- a/20201105/loops-4.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 10;
-  while (a != 0)
-    {
-      printf ("%d\n", a);
-      a = a - 1;
-    }
-}
diff --git a/20201105/loops-5.c b/20201105/loops-5.c
deleted file mode 100644
index a2c995b5694c6ecdb16d50363a5ad06437b6dcdc..0000000000000000000000000000000000000000
--- a/20201105/loops-5.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int a = 10; a != 0; a = a - 1)
-    printf ("%d\n", a);
-}
diff --git a/20201105/loops-6.c b/20201105/loops-6.c
deleted file mode 100644
index f886a46f296d10eb6ba98bfacf5b09d2eab4ac6d..0000000000000000000000000000000000000000
--- a/20201105/loops-6.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 10;
-  while (a)
-    {
-      printf ("%d\n", a);
-      a = a - 2;
-    }
-}
diff --git a/20201105/loops-7.c b/20201105/loops-7.c
deleted file mode 100644
index 1f8f65c1ba3cb35ca62cfbe315ce06469fe54162..0000000000000000000000000000000000000000
--- a/20201105/loops-7.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  while (a)
-    {
-      printf ("%d\n", a);
-      a = a - 2;
-    }
-}
diff --git a/20201105/loops-8.c b/20201105/loops-8.c
deleted file mode 100644
index 3fef4c50419f74e19d6970f10299375dd2bc9ea9..0000000000000000000000000000000000000000
--- a/20201105/loops-8.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  while (a >= 0)
-    {
-      printf ("%d\n", a);
-      a = a - 2;
-    }
-}
diff --git a/20201105/loops-9.c b/20201105/loops-9.c
deleted file mode 100644
index 63774e315f9376cc20f35bd6b863702668167b37..0000000000000000000000000000000000000000
--- a/20201105/loops-9.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  while (a > -5)
-    {
-      printf ("%d\n", a);
-      a = a - 2;
-    }
-}
diff --git a/20201105/mumbleBot-20201105.diff b/20201105/mumbleBot-20201105.diff
deleted file mode 100644
index c1fb850e886db29bbaeb30d224dc56e538281bbf..0000000000000000000000000000000000000000
--- a/20201105/mumbleBot-20201105.diff
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/commands/poll.go b/commands/poll.go
-index 1729be5..cb6291a 100644
---- a/commands/poll.go
-+++ b/commands/poll.go
-@@ -90,11 +90,12 @@ func (c *PollCommand) Execute(user *gumble.User, private bool, args ...string) {
- 			var voteMsg bytes.Buffer
- 			switch len(args) {
- 			case 0: //Classic poll
--				ResultNames = []string{"yes", "no"}
- 				standardVote = true
-+				ResultNames = []string{"yes", "no"}
- 				votingMessages = []string{"yes", "ja", "+", "no", "nein", "-"}
- 				voteMsg.WriteString(" yes/no/ja/nein/+/-")
- 			case 1: //Range poll
-+				standardVote = false
- 				voteMsg.WriteString(" anything between")
- 				colonIndex := strings.Index(args[0], ":")
- 				if colonIndex != -1 {
-@@ -158,6 +159,7 @@ func (c *PollCommand) Execute(user *gumble.User, private bool, args ...string) {
- 				}
- 				votingMessages = ResultNames
- 			default: //Poll with given answer possibilites
-+				standardVote = false
- 				ResultNames = make([]string, len(args))
- 				votingMessages = make([]string, len(args))
- 				for i, name := range args {
diff --git a/20201105/output-1.c b/20201105/output-1.c
deleted file mode 100644
index ae37ad290203e4e490e3e2fac5a8080f7dfa0364..0000000000000000000000000000000000000000
--- a/20201105/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/20201105/output-2.c b/20201105/output-2.c
deleted file mode 100644
index b41d5374dff9a974b9a99a4a828ff1c673e64223..0000000000000000000000000000000000000000
--- a/20201105/output-2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: ");
-  int a = 42;
-  printf (a);
-  printf ("\n");
-  return 0;
-}
diff --git a/20201105/output-3.c b/20201105/output-3.c
deleted file mode 100644
index 2020c9dd740c98c254e38736634327e34b0c0905..0000000000000000000000000000000000000000
--- a/20201105/output-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: %d", 42);
-  printf ("\n");
-  return 0;
-}
diff --git a/20201105/output-4.c b/20201105/output-4.c
deleted file mode 100644
index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000
--- a/20201105/output-4.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/20201105/output-5.c b/20201105/output-5.c
deleted file mode 100644
index 839dffd3877da616ef753aecae3d4349dd775046..0000000000000000000000000000000000000000
--- a/20201105/output-5.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Antwort lautet: %x\n", 42);
-  return 0;
-}
diff --git a/20201105/variables-1.c b/20201105/variables-1.c
deleted file mode 100644
index 72294c6576a5619922f31bbe286cad3bd365329a..0000000000000000000000000000000000000000
--- a/20201105/variables-1.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/20201105/variables-2.c b/20201105/variables-2.c
deleted file mode 100644
index 86a75660f1a99ce1bc860cc62efea3601557c6ec..0000000000000000000000000000000000000000
--- a/20201105/variables-2.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/20201105/variables-3.c b/20201105/variables-3.c
deleted file mode 100644
index 791c6f2f2a91f4ac771c12b29cf98f39b026f8e7..0000000000000000000000000000000000000000
--- a/20201105/variables-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 42;
-  printf ("Die Antwort lautet: %d\n", a);
-  return 0;
-}
diff --git a/20201105/variables-4.c b/20201105/variables-4.c
deleted file mode 100644
index 4f9092cb2c1726eab8e382ea491db889ac839e1a..0000000000000000000000000000000000000000
--- a/20201105/variables-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a;
-  a = 42;
-  printf ("Die Antwort lautet: %d\n", a);
-  return 0;
-}
diff --git a/20201112/aufgabe-4.c b/20201112/aufgabe-4.c
deleted file mode 100644
index b8b3de796fbef94bd4a86f944e1269b97e97982b..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/fibonacci.txt b/20201112/fibonacci.txt
deleted file mode 100644
index d2daea9ad4c40e2b492174f8fd33b850aee1ab88..0000000000000000000000000000000000000000
--- a/20201112/fibonacci.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-Fibonacci-Zahl Nr. 199:
-
- * Quelle: http://www.wackerart.de/mathematik/big_numbers/fibonacci_numbers.html
-   173 402 521 172 797 813 159 685 037 284 371 942 044 301
-
- * Quelle: Wolfram Alpha
-   173 402 521 172 797 813 159 685 037 284 371 942 044 301
- 
- * Quelle: ./loesung-3-12
-   173 402 521 172 797 813 134 481 939 662 687 621 349 376
-                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Ab loesung-3-7.c ist die Berechnung der Fibonacci-Zahlen falsch!
-                                                         ~~~~~~
-Derartige Rechnungen darf man nur mit ganzen Zahlen durchführen,
-nicht jedoch mit Fließkommazahlen.
-
-Dies gilt insbesondere auch für Kryptographie, z.B. RSA-Verschlüsselung.
-
-
-Die Fibonacci-Zahl Nr. 199 paßt selbst in eine "long long unsigned" nicht hinein.
-
-Wie kann man die Genauigkeit des Rechners erhöhen?
---> "schriftlich" rechnen
-
-  13 · 17 = (10 + 3) · (10 + 7)
-
-          = 10 · 10 + 10 · 7 + 3 · 10 + 3 · 7    --> nur noch kleines Einmaleins,
-                                                     evtl. mit Nullen dran
-          =    100
-             +  70
-             +  30
-             +  21
-            ---1--
-               221
-
---> Funktion, um 2 128-Bit-Zahlen zu addieren
-
- - Wir speichern jede 128-Bit-Zahl in einem Array von 4 32-Bit-Zahlen
-
- - Wir addieren jeweils 2 32-Bit-Zahlen ("1 Ziffer").
-   Das Ergebnis kann größer sein als 32 Bit, aber nicht größer als 64 Bit.
-
- - Die unteren 32 Bit speichern wir als Ergebnis (7 + 5: "2 hin").
-   Die oberen merken wir uns als Übertrag ("1 im Sinn").
-
- - Damit haben wir den "Einer" addiert.
-   Als nächstes kommt der "Zehner" (tatsächlich: der 2^32er).
-   --> Wir gehen das Array in einer Schleife von rechts nach links durch.
-
-Weniger effizient, aber leichter auszugeben: Dezimalziffern als Array speichern.
---> siehe ../20201203/fibonacci-*.c
-
- * Quelle: ../20201203/fibonacci-10.c
-   173 402 521 172 797 813 159 685 037 284 371 942 044 301
-
---> :-)
-
-f[9999] = 20793608237133498072112648988642836825087036094015903119682945866528501423455686648927456034305226515591757343297190158010624794267250973176133810179902738038231789748346235556483191431591924532394420028067810320408724414693462849062668387083308048250920654493340878733226377580847446324873797603734794648258113858631550404081017260381202919943892370942852601647398213554479081823593715429566945149312993664846779090437799284773675379284270660175134664833266377698642012106891355791141872776934080803504956794094648292880566056364718187662668970758537383352677420835574155945658542003634765324541006121012446785689171494803262408602693091211601973938229446636049901531963286159699077880427720289235539329671877182915643419079186525118678856821600897520171070499437657067342400871083908811800976259727431820539554256869460815355918458253398234382360435762759823179896116748424269545924633204614137992850814352018738480923581553988990897151469406131695614497783720743461373756218685106856826090696339815490921253714537241866911604250597353747823733268178182198509240226955826416016690084749816072843582488613184829905383150180047844353751554201573833105521980998123833253261228689824051777846588461079790807828367132384798451794011076569057522158680378961532160858387223882974380483931929541222100800313580688585002598879566463221427820448492565073106595808837401648996423563386109782045634122467872921845606409174360635618216883812562321664442822952537577492715365321134204530686742435454505103269768144370118494906390254934942358904031509877369722437053383165360388595116980245927935225901537634925654872380877183008301074569444002426436414756905094535072804764684492105680024739914490555904391369218696387092918189246157103450387050229300603241611410707453960080170928277951834763216705242485820801423866526633816082921442883095463259080471819329201710147828025221385656340207489796317663278872207607791034431700112753558813478888727503825389066823098683355695718137867882982111710796422706778536913192342733364556727928018953989153106047379741280794091639429908796650294603536651238230626
-(2090 Ziffern)
diff --git a/20201112/functions-1.c b/20201112/functions-1.c
deleted file mode 100644
index 09d985fad681138e9a922a7f21e2379d474604b0..0000000000000000000000000000000000000000
--- a/20201112/functions-1.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#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;
-}
diff --git a/20201112/functions-10.c b/20201112/functions-10.c
deleted file mode 100644
index ad641f07f7e8a4054876dd32048893e8a873756e..0000000000000000000000000000000000000000
--- a/20201112/functions-10.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/20201112/functions-11.c b/20201112/functions-11.c
deleted file mode 100644
index 9d05928f1a8180fe8217eca6bccf9712aa76bf22..0000000000000000000000000000000000000000
--- a/20201112/functions-11.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/20201112/functions-12.c b/20201112/functions-12.c
deleted file mode 100644
index 28c42f65af3992c21c4ba7156b8d96cae46f2423..0000000000000000000000000000000000000000
--- a/20201112/functions-12.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h>
-
-/*
-
-void foo (void)
-{
-  b++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): " "a = %d, b = %d\n", a, b);
-  a++;
-}
-
-*/
-
-int main (void)
-{
-  int a, b = 3;
-  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/20201112/functions-13.c b/20201112/functions-13.c
deleted file mode 100644
index 2ecf18b5cabfc427a2f9565fad00498214e4c575..0000000000000000000000000000000000000000
--- a/20201112/functions-13.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/20201112/functions-14.c b/20201112/functions-14.c
deleted file mode 100644
index cd9e2e0fd6c63cbdf2f4e81dd97a6f11b5b5074a..0000000000000000000000000000000000000000
--- a/20201112/functions-14.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/20201112/functions-15.c b/20201112/functions-15.c
deleted file mode 100644
index 9cf7165357fd2776a1ddcb446a65ab13e2fce6d4..0000000000000000000000000000000000000000
--- a/20201112/functions-15.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-
-int a = 0, b = 3;
-
-void foo (void)
-{
-  b++;
-  a++;
-  static int a = 5;
-  int b = 7;
-  printf ("foo(): " "a = %d, b = %d\n", 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/20201112/functions-16.c b/20201112/functions-16.c
deleted file mode 100644
index 449b1a8977645c734f1b19d56412e8f805228322..0000000000000000000000000000000000000000
--- a/20201112/functions-16.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/20201112/functions-17.c b/20201112/functions-17.c
deleted file mode 100644
index 060bbf83a72a7f1d611a6e5da7f1003595053641..0000000000000000000000000000000000000000
--- a/20201112/functions-17.c
+++ /dev/null
@@ -1,27 +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 = 12;
-  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/20201112/functions-18.c b/20201112/functions-18.c
deleted file mode 100644
index b5938747e6c21ad5b2e714b79e90ea33a877b698..0000000000000000000000000000000000000000
--- a/20201112/functions-18.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/20201112/functions-19.c b/20201112/functions-19.c
deleted file mode 100644
index d6b79a3bff03197295a6f98e98e1270562e62486..0000000000000000000000000000000000000000
--- a/20201112/functions-19.c
+++ /dev/null
@@ -1,33 +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++;
-}
-
-void bar (void)
-{
-  static int a = 42;
-  printf ("bar(): " "a = %d, b = %d\n", 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 ();
-  bar ();
-/*
-  printf ("main(): " "a = %d, b = %d\n", a, b);
-*/
-  return 0;
-}
diff --git a/20201112/functions-2.c b/20201112/functions-2.c
deleted file mode 100644
index b09b8e32bd8e5dfc7958bc3bf01c6847329c5b1c..0000000000000000000000000000000000000000
--- a/20201112/functions-2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-void add_verbose (int a, int b)
-{
-  printf ("%d + %d = %d\n", a, b, a + b);
-}
-
-int main (void)
-{
-  int a = add_verbose (3, 7);
-  return 0;
-}
diff --git a/20201112/functions-20.c b/20201112/functions-20.c
deleted file mode 100644
index d6aa7c54fae1fbb49b36f9c851997bfc98d84a27..0000000000000000000000000000000000000000
--- a/20201112/functions-20.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/20201112/functions-21.c b/20201112/functions-21.c
deleted file mode 100644
index c2227a37337933854056d2c2affee96fb43424f2..0000000000000000000000000000000000000000
--- a/20201112/functions-21.c
+++ /dev/null
@@ -1,24 +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/20201112/functions-3.c b/20201112/functions-3.c
deleted file mode 100644
index c4a6e39de59add196b12a4f9da63bb769326aa60..0000000000000000000000000000000000000000
--- a/20201112/functions-3.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-void add_verbose (int a, int b)
-{
-  printf ("%d + %d = %d\n", a, b, a + b);
-}
-
-int main (void)
-{
-  void a = add_verbose (3, 7);
-  return 0;
-}
diff --git a/20201112/functions-4.c b/20201112/functions-4.c
deleted file mode 100644
index 0bff50c9b0ad954586a8979c3445953b30e0371f..0000000000000000000000000000000000000000
--- a/20201112/functions-4.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-void print_hello (void)
-{
-  printf ("Hello, world!\n");
-}
-
-int main (void)
-{
-  print_hello ();
-  print_hello ();
-  return 0;
-}
diff --git a/20201112/functions-5.c b/20201112/functions-5.c
deleted file mode 100644
index bf9d5729f0e72a95d6c89a8da64e64c94196241b..0000000000000000000000000000000000000000
--- a/20201112/functions-5.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 42;
-}
-
-int main (void)
-{
-  print_hello ();
-  print_hello ();
-  return 0;
-}
diff --git a/20201112/functions-6.c b/20201112/functions-6.c
deleted file mode 100644
index f7d53df85008f6f8370c9a24047326e1603354f0..0000000000000000000000000000000000000000
--- a/20201112/functions-6.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 42;
-}
-
-void main (void)
-{
-  print_hello ();
-  print_hello ();
-}
diff --git a/20201112/functions-7.c b/20201112/functions-7.c
deleted file mode 100644
index 8d9c8d1675de779bb3e59b6d4f0d9b2f0f0aa440..0000000000000000000000000000000000000000
--- a/20201112/functions-7.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 42;
-}
-
-int main (void)
-{
-  print_hello ();
-  print_hello ();
-  return 42;
-}
diff --git a/20201112/functions-7.txt b/20201112/functions-7.txt
deleted file mode 100644
index 26b41b9ebe46fddad60ea08f4a8011bcdd40fefd..0000000000000000000000000000000000000000
--- a/20201112/functions-7.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 42;
-}
-
-int main (void)
-{
-  print_hello ();
-  print_hello ();
-  return 42;
-}
-cassini/home/peter/bo/2020ws/hp/20201112> gcc -Wall -O functions-7.c -o functions-7           cassini/home/peter/bo/2020ws/hp/20201112> if ./functions-7; then echo "Hat geklappt."; else echo "Hat nicht geklappt."; fi
-Hello, world!
-Hello, world!
-Hat nicht geklappt.
-cassini/home/peter/bo/2020ws/hp/20201112> echo $?
-0
-cassini/home/peter/bo/2020ws/hp/20201112> ./functions-7
-Hello, world!
-Hello, world!
-cassini/home/peter/bo/2020ws/hp/20201112> echo $?
-42
-cassini/home/peter/bo/2020ws/hp/20201112> ./functions-6
-Hello, world!
-Hello, world!
-cassini/home/peter/bo/2020ws/hp/20201112> echo $?
-42
-cassini/home/peter/bo/2020ws/hp/20201112> ./functions-5
-Hello, world!
-Hello, world!
-cassini/home/peter/bo/2020ws/hp/20201112> echo $?
-0
-cassini/home/peter/bo/2020ws/hp/20201112>
diff --git a/20201112/functions-8.c b/20201112/functions-8.c
deleted file mode 100644
index b12831230dc2e6d9ed775e9db180d798baee7673..0000000000000000000000000000000000000000
--- a/20201112/functions-8.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 137;
-}
-
-void main (void)
-{
-  print_hello ();
-  print_hello ();
-}
diff --git a/20201112/functions-8.txt b/20201112/functions-8.txt
deleted file mode 100644
index 67451237c74c9d0a83898330fbba475e8efec185..0000000000000000000000000000000000000000
--- a/20201112/functions-8.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-int print_hello (void)
-{
-  printf ("Hello, world!\n");
-  return 137;
-}
-
-void main (void)
-{
-  print_hello ();
-  print_hello ();
-}
-cassini/home/peter/bo/2020ws/hp/20201112> gcc -Wall -O functions-8.c -o functions-8           functions-8.c:9:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
- void main (void)
-      ^~~~
-cassini/home/peter/bo/2020ws/hp/20201112> ./functions-8
-Hello, world!
-Hello, world!
-cassini/home/peter/bo/2020ws/hp/20201112> echo $?
-137
-cassini/home/peter/bo/2020ws/hp/20201112>
diff --git a/20201112/functions-9.c b/20201112/functions-9.c
deleted file mode 100644
index 1f8d7ce8f62ecb3ea4c9afe552e98dd30c512894..0000000000000000000000000000000000000000
--- a/20201112/functions-9.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/20201112/gitlab.png b/20201112/gitlab.png
deleted file mode 100644
index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000
Binary files a/20201112/gitlab.png and /dev/null differ
diff --git a/20201112/hello-1-O0.s b/20201112/hello-1-O0.s
deleted file mode 100644
index 25d65981166e1534883ba3df675651412e484f5d..0000000000000000000000000000000000000000
--- a/20201112/hello-1-O0.s
+++ /dev/null
@@ -1,27 +0,0 @@
-	.file	"hello-1.c"
-	.text
-	.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 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201112/hello-1-O1.s b/20201112/hello-1-O1.s
deleted file mode 100644
index 62e109941c257c18e147f35cb6d795f5df027b4b..0000000000000000000000000000000000000000
--- a/20201112/hello-1-O1.s
+++ /dev/null
@@ -1,24 +0,0 @@
-	.file	"hello-1.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"Hello, world!"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	leaq	.LC0(%rip), %rdi
-	call	puts@PLT
-	movl	$0, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201112/hello-1.c b/20201112/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20201112/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201112/hp-20201112-fig1.pdf b/20201112/hp-20201112-fig1.pdf
deleted file mode 100644
index d4e9c5f6d40d491efa9b49f4e1bcd0c9a0497924..0000000000000000000000000000000000000000
Binary files a/20201112/hp-20201112-fig1.pdf and /dev/null differ
diff --git a/20201112/hp-20201112-fig1.tex b/20201112/hp-20201112-fig1.tex
deleted file mode 100644
index 638a00ac007de5fa087a72f96be8776db32ed75f..0000000000000000000000000000000000000000
--- a/20201112/hp-20201112-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/20201112/hp-20201112.pdf b/20201112/hp-20201112.pdf
deleted file mode 100644
index 7bedab72706e692695171fd77d8eb0a3bf864c0b..0000000000000000000000000000000000000000
Binary files a/20201112/hp-20201112.pdf and /dev/null differ
diff --git a/20201112/hp-20201112.tex b/20201112/hp-20201112.tex
deleted file mode 100644
index aac071d34b356f21928fea3f804f52445765464a..0000000000000000000000000000000000000000
--- a/20201112/hp-20201112.tex
+++ /dev/null
@@ -1,1194 +0,0 @@
-% hp-20201112.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: 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{12.\ November 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}}}
-      \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-20201112-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}\\
-      Nutzen Sie die Gelegenheit, Fragen zu stellen!
-    \item
-      \textbf{Praktikum}
-      \begin{itemize}
-        \item zunächst keine festen Termine
-        \item Quelltext zukommen lassen, zusammen durchgehen
-        \item zusätzliche Themen, z.\,B.\ Grundlagen Unix-Shell
-      \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/20201112/hp-2020ws-p1.pdf b/20201112/hp-2020ws-p1.pdf
deleted file mode 100644
index 53d11a2244231aeaf456105cc01b7cd12b9a817e..0000000000000000000000000000000000000000
Binary files a/20201112/hp-2020ws-p1.pdf and /dev/null differ
diff --git a/20201112/hp-2020ws-p1.tex b/20201112/hp-2020ws-p1.tex
deleted file mode 100644
index 46566d8a56196bbd4b5db233cec529b9968a46b1..0000000000000000000000000000000000000000
--- a/20201112/hp-2020ws-p1.tex
+++ /dev/null
@@ -1,199 +0,0 @@
-% hp-2020ws-p1.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 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: Versuch 1: 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 4.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 2020/21\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 $(\kern0.5pt p-1)\cdot(q-1)$ und teilerfremd zu $(\kern0.5pt 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((\kern0.5pt 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}
-
-        \textbf{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.
-
-      \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$.
-
-        \textbf{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$.
-
-      \item
-        \textbf{Rechenzeit vergleichen}
-
-        Vergleichen Sie nun
-        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.)
-
-        \textbf{Hinweis 1:}
-%        Wenn Sie ein Programm per Kommandozeile mit \lstinline[style=cmd]{time ./programm} starten,
-%        wird Ihnen angezeigt, wieviel Rechenzeit das Programm benötigt hat.
-%        Die drei angezeigten Werte stehen hierbei für die
-%        tatsächlich verstrichene Gesamtzeit (\lstinline[style=terminal]{real}),
-%        für die mit Rechnen verbrachte Zeit (\lstinline[style=terminal]{user})
-%        und für die mit Systemaufrufen (z.\,B.\ Ein- und Ausgabe)
-%        verbrachte Zeit (\lstinline[style=terminal]{sys}).
-        Ein einfacher Weg, die von Ihrem Programm benötigte Rechenzeit zu messen,
-        ist die Verwendung der Funktion \lstinline{clock()}.
-        Diese gibt zurück, wieviel Rechenzeit seit Programmstart aufgewendet wurde.
-        Der Typ dieses Rückgabewerts ist ein ganzzahliger Typ, \lstinline{clock_t},
-        mit dem man rechnen und den man mit \lstinline{%ld} ausgeben kann.
-        Pro Sekunde wächst der Zähler um \lstinline{CLOCKS_PER_SEC} Einheiten.
-        Typischerweise hat \lstinline{CLOCKS_PER_SEC} den Wert \lstinline{1000000}
-        oder \lstinline{1000}, die Zeiteinheit ist also eine Mikrosekunde
-        bzw.\ eine Millisekunde.
-
-        \textbf{Hinweis 2:}
-        Die mit der o.\,a.\ Methode meßbaren Zeiten sind eigentlich zu ungenau,
-        um damit die sehr kurzen Rechenzeiten erfassen zu können --
-        etwa so, als wollten Sie mit einem Lineal mit Millimetereinteilung
-        die Dicke eines Blatts Papier messen. Beides ist jedoch möglich.
-
-      \item
-        \textbf{Abgabe:}
-        Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte
-        per E-Mail an \file{peter.gerwinski@hs-bochum.de}
-        mit dem \textbf{Betreff:} \lstinline[style=terminal]{fi2niNoh}
-        unter Angabe von Name, Matrikel-Nummer,
-        Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS).
-
-    \end{itemize}
-
-  \end{multicols}
-
-  \vspace*{-\bigskipamount}
-
-  \strut\hfill\emph{Viel Erfolg!}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 17.\ Dezember 2020
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019, 2020\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/20201112/hp-musterloesung-20201112.pdf b/20201112/hp-musterloesung-20201112.pdf
deleted file mode 100644
index a30be210e47015cbbcb98cbfc5469c0e1975f0f9..0000000000000000000000000000000000000000
Binary files a/20201112/hp-musterloesung-20201112.pdf and /dev/null differ
diff --git a/20201112/hp-musterloesung-20201112.tex b/20201112/hp-musterloesung-20201112.tex
deleted file mode 100644
index 37247f42e0c7f9f4bd32644a9cbd749c28039a26..0000000000000000000000000000000000000000
--- a/20201112/hp-musterloesung-20201112.tex
+++ /dev/null
@@ -1,326 +0,0 @@
-% hp-musterloesung-20201112.pdf - Solutions to the 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
-% 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 -- 12.\ November 2020}
-
-  \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}{2020ws/20201112}{loesung-1-1.c} bis \gitfile{hp}{2020ws/20201112}{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}{2020ws/20201112}{loesung-1-4.c} und \gitfile{hp}{2020ws/20201112}{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}{2020ws/20201112}{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}{2020ws/20201112}{loesung-1-2.c}
-  und \gitfile{hp}{2020ws/20201112}{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 2017 ist kein Schaltjahr.
-    \item 2018 ist kein Schaltjahr.
-    \item 2019 ist kein Schaltjahr.
-    \item 2020 ist ein 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 2017 2018 2019 2020; 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}{2020ws/20201112}{loesung-2-1.c}, \gitfile{hp}{2020ws/20201112}{loesung-2-2.c} und \gitfile{hp}{2020ws/20201112}{loesung-2-3.c}.
-  (Zum Compilieren von \gitfile{hp}{2020ws/20201112}{loesung-2-2.c} und \gitfile{hp}{2020ws/20201112}{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}{2020ws/20201112}{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}{2020ws/20201112}{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}{2020ws/20201112}{loesung-3-1.c} und \gitfile{hp}{2020ws/20201112}{loesung-3-2.c}.
-
-  Die Lösung in \gitfile{hp}{2020ws/20201112}{loesung-3-2.c}
-  speichert alle berechneten Zahlen in einem Array,
-  die in \gitfile{hp}{2020ws/20201112}{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}{2020ws/20201112}{loesung-3-1.c} zu bevorzugen.
-
-  Wichtig in \gitfile{hp}{2020ws/20201112}{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}{2020ws/20201112}{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}{2020ws/20201112}{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/20201112/hp-uebung-20201112.pdf b/20201112/hp-uebung-20201112.pdf
deleted file mode 100644
index 485f0934a5c5cbd518b659c85708179c9c07306e..0000000000000000000000000000000000000000
Binary files a/20201112/hp-uebung-20201112.pdf and /dev/null differ
diff --git a/20201112/hp-uebung-20201112.tex b/20201112/hp-uebung-20201112.tex
deleted file mode 100644
index ecfe5175d765cf81a36db1411e8fc52d84657d90..0000000000000000000000000000000000000000
--- a/20201112/hp-uebung-20201112.tex
+++ /dev/null
@@ -1,114 +0,0 @@
-% hp-uebung-20201112.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
-% 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 -- 12.\ November 2020}
-
-  \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}{2020ws/20201112}{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/20201112/if-12.c b/20201112/if-12.c
deleted file mode 100644
index c04561accc01d6c880780c361bde83e474c6b290..0000000000000000000000000000000000000000
--- a/20201112/if-12.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 137;
-  int b;
-  printf ("Bitte eine Zahl eingeben: ");
-  scanf ("%d", &b);
-  if (b & a > b)
-    {
-      printf ("%d\n", a / b);
-      printf ("Danke sehr.\n");
-    }
-  return 0;
-}
diff --git a/20201112/loesung-1-1.c b/20201112/loesung-1-1.c
deleted file mode 100644
index ea41b8ea35bf871389c8be15779a58c293c81049..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-1-2.c b/20201112/loesung-1-2.c
deleted file mode 100644
index d9e4df8a36238875e0b46398b21f93e7f4f98792..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-1-3.c b/20201112/loesung-1-3.c
deleted file mode 100644
index 97051b3bb5e6620ff771d6b3f5949687130abea8..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-1-4.c b/20201112/loesung-1-4.c
deleted file mode 100644
index 3a0d218e6c03f326ad73bad55ad3e29ea882eb2d..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-1-5.c b/20201112/loesung-1-5.c
deleted file mode 100644
index 999d9f2030e29f1c961b12d647d2e82592b637bf..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-2-1.c b/20201112/loesung-2-1.c
deleted file mode 100644
index 5ec9dd3caf6639d22bf770ef4b6bb779a3d7c714..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-2-2.c b/20201112/loesung-2-2.c
deleted file mode 100644
index 8f9319ee596a52f38531a2cefb376b54e7ec3ec0..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-2-3.c b/20201112/loesung-2-3.c
deleted file mode 100644
index 71fca2538b991397ac5f046a33ff0f9130b2980f..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-2-f4.c b/20201112/loesung-2-f4.c
deleted file mode 100644
index 8520d438f654856a74c22ffd01b9c5815741efbc..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-3-1.c b/20201112/loesung-3-1.c
deleted file mode 100644
index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-3-10.c b/20201112/loesung-3-10.c
deleted file mode 100644
index 7bb464e8490084edbe8f388e1e6cf2bfd0b5c4be..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-10.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 200; i++)
-    {
-      printf ("f[%d] = %.0Lf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-11.c b/20201112/loesung-3-11.c
deleted file mode 100644
index def1256c1aaa78d07234bf73be485077e5e68270..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-11.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 200; i++)
-    {
-      printf ("f[%d] = %30.0Lf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-12.c b/20201112/loesung-3-12.c
deleted file mode 100644
index 7ca898622fd72bac0cf074b947f0e0f8810d3689..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-12.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 200; i++)
-    {
-      printf ("f[%3d] = %60.0Lf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-2.c b/20201112/loesung-3-2.c
deleted file mode 100644
index 7043f66e6b73894be9547a5562de8cad43cf0e71..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/loesung-3-3.c b/20201112/loesung-3-3.c
deleted file mode 100644
index c469857baa199b0baf12f6dec00f63fd119b0cb1..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-3.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long int f0 = 0;
-  long 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/20201112/loesung-3-4.c b/20201112/loesung-3-4.c
deleted file mode 100644
index c3c0dbe62bffce9adfc49cadb1c747e2e932c04e..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-4.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long int f0 = 0;
-  long int f1 = 1;
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %ld\n", i, f0);
-      long int f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-5.c b/20201112/loesung-3-5.c
deleted file mode 100644
index 119125542cf5fdca1289cf5918428f1634c4f2ee..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-5.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long f0 = 0;
-  long f1 = 1;
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %ld\n", i, f0);
-      long f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-6.c b/20201112/loesung-3-6.c
deleted file mode 100644
index 339217e92fb44da2e667dc15c5bbd839b9f579c2..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-6.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint64_t f0 = 0;
-  uint64_t f1 = 1;
-  for (int i = 0; i < 100; i++)
-    {
-      printf ("f[%d] = %lu\n", i, f0);
-      uint64_t f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-7.c b/20201112/loesung-3-7.c
deleted file mode 100644
index 11a9e200a07e1e7c368b014f659f3c5f55196ff3..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-7.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 100; i++)
-    {
-      printf ("f[%d] = %llf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-8.c b/20201112/loesung-3-8.c
deleted file mode 100644
index d6aff68d21c4aa754fa94a434f5bb17235d6535e..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-8.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 100; i++)
-    {
-      printf ("f[%d] = %Lf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-3-9.c b/20201112/loesung-3-9.c
deleted file mode 100644
index e1d95dc56e72da5a203548ff0907c6c128004a28..0000000000000000000000000000000000000000
--- a/20201112/loesung-3-9.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  long double f0 = 0;
-  long double f1 = 1;
-  for (int i = 0; i < 100; i++)
-    {
-      printf ("f[%d] = %.0Lf\n", i, f0);
-      long double f2 = f0 + f1;
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201112/loesung-4.c b/20201112/loesung-4.c
deleted file mode 100644
index f8481e994c02ac8e581244713756c9e9be7c7fd6..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/logo-hochschule-bochum-cvh-text-v2.pdf b/20201112/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201112/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/20201112/logo-hochschule-bochum.pdf b/20201112/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201112/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201112/pgscript.sty b/20201112/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201112/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201112/pgslides.sty b/20201112/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201112/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201112/side-effects-1.c b/20201112/side-effects-1.c
deleted file mode 100644
index 61c4abb82e369b17b5acc83107b9baa598f371d2..0000000000000000000000000000000000000000
--- a/20201112/side-effects-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  "Hello, world!\n";
-  return 0;
-}
diff --git a/20201112/side-effects-10.c b/20201112/side-effects-10.c
deleted file mode 100644
index 10573eec3a86b02a2d0e8fdea51ded667e71adfc..0000000000000000000000000000000000000000
--- a/20201112/side-effects-10.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi;
-  pi = 3,1415926535897932384626433;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-11.c b/20201112/side-effects-11.c
deleted file mode 100644
index d9e15de833542d40e30ca956f75fb78ecdb62033..0000000000000000000000000000000000000000
--- a/20201112/side-effects-11.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi;
-  pi = 3,14159265;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-12.c b/20201112/side-effects-12.c
deleted file mode 100644
index c0dc876159df6f392d118937b99ae3d8b036bf6b..0000000000000000000000000000000000000000
--- a/20201112/side-effects-12.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi;
-  pi = 3.14159265;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-13.c b/20201112/side-effects-13.c
deleted file mode 100644
index c2ad73c35706a2330052416148db8ab49b16837c..0000000000000000000000000000000000000000
--- a/20201112/side-effects-13.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  for (int i = 0; i < 10; printf ("%d\n", i), i++);
-  return 0;
-}
diff --git a/20201112/side-effects-14.c b/20201112/side-effects-14.c
deleted file mode 100644
index 0ccbeb406340365d6bafc464a335881014c2c5ed..0000000000000000000000000000000000000000
--- a/20201112/side-effects-14.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi = 3,14159265;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-15.c b/20201112/side-effects-15.c
deleted file mode 100644
index 13b4a2dbb8c5aa4dbd65951a5e9afeec1af31aa4..0000000000000000000000000000000000000000
--- a/20201112/side-effects-15.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi = 3, e = 14159265;
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-16.c b/20201112/side-effects-16.c
deleted file mode 100644
index 562c3482275dd9a1432d829914f61fefadc2916e..0000000000000000000000000000000000000000
--- a/20201112/side-effects-16.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  double pi = (3,14159265);
-  printf ("pi = %lf\n", pi);
-  return 0;
-}
diff --git a/20201112/side-effects-2.c b/20201112/side-effects-2.c
deleted file mode 100644
index 275a28e55e4568ff0e7f135bfaae8de819d224f7..0000000000000000000000000000000000000000
--- a/20201112/side-effects-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  42;
-  return 0;
-}
diff --git a/20201112/side-effects-3.c b/20201112/side-effects-3.c
deleted file mode 100644
index 54daff5627ad1b1d9be0bee7b47b1916b7734bce..0000000000000000000000000000000000000000
--- a/20201112/side-effects-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int whatever = printf ("Hello, world!\n");
-  printf ("Zurückgegebener Wert: %d\n", whatever);
-  return 0;
-}
diff --git a/20201112/side-effects-4.c b/20201112/side-effects-4.c
deleted file mode 100644
index 76da09fecf9feec1f2d30d82b456b9a8e7845fb1..0000000000000000000000000000000000000000
--- a/20201112/side-effects-4.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = a = 12;
-  c = b++;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/side-effects-5.c b/20201112/side-effects-5.c
deleted file mode 100644
index b7b2be950285591c0778a74bf50385977618f060..0000000000000000000000000000000000000000
--- a/20201112/side-effects-5.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = a = 12;
-  c = ++b;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/side-effects-6.c b/20201112/side-effects-6.c
deleted file mode 100644
index f40b8f68d7c383a80713707bf10212840d6fd451..0000000000000000000000000000000000000000
--- a/20201112/side-effects-6.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = a += 12;
-  c = ++b;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/side-effects-7.c b/20201112/side-effects-7.c
deleted file mode 100644
index fa3588957ec39244cdb34f6f9282f1a41e89c2a7..0000000000000000000000000000000000000000
--- a/20201112/side-effects-7.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = a, 42;
-  c = ++b;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/side-effects-8.c b/20201112/side-effects-8.c
deleted file mode 100644
index 03bbdb2f2dde80c9d4afe3465174ff1053a5b48a..0000000000000000000000000000000000000000
--- a/20201112/side-effects-8.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = (a, 42);
-  c = ++b;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/side-effects-9.c b/20201112/side-effects-9.c
deleted file mode 100644
index 28d9afc75d040968cdfea735d97bc83c05a5105b..0000000000000000000000000000000000000000
--- a/20201112/side-effects-9.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b, c;
-  a = 10;
-  b = (a = 7, 42);
-  c = ++b;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  return 0;
-}
diff --git a/20201112/test.txt b/20201112/test.txt
deleted file mode 100644
index f43a1847892086aeb466c814d726c1860a0b9d67..0000000000000000000000000000000000000000
--- a/20201112/test.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Ich ging im Walde
-so für mich hin,
-und nichts zu suchen,
-das war mein Sinn.
-
-vim ist praktisch.
diff --git a/20201119/arrays-1.c b/20201119/arrays-1.c
deleted file mode 100644
index 35cf856c63942234116544ac721ff0a47d797b09..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/arrays-10.c b/20201119/arrays-10.c
deleted file mode 100644
index bafaa0e2a558352ff8f8784b5a933870674265b2..0000000000000000000000000000000000000000
--- a/20201119/arrays-10.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[];
-  for (int *p = prime; *p; p++)
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/arrays-11.c b/20201119/arrays-11.c
deleted file mode 100644
index df8992bc15e0a9d675d5c58fde39571cf4051043..0000000000000000000000000000000000000000
--- a/20201119/arrays-11.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[] = { 2, 3, 5, 7, 11, 0 };
-  for (int *p = prime; *p; p++)
-    printf ("%d\n", *p);
-  prime[5] = 13;              /* Dies funktioniert zwar im Moment, ist aber falsch! */
-                              /* Wir schreiben über das Array hinaus. Dies kann zu einem */
-  for (int *p = prime; *p; p++)                                    /* Absturz führen. */
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/arrays-12.c b/20201119/arrays-12.c
deleted file mode 100644
index 21cf467acd52bf44e9619a44373fbb31a54b3b6e..0000000000000000000000000000000000000000
--- a/20201119/arrays-12.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[] = { };
-  for (int *p = prime; *p; p++)
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/arrays-13.c b/20201119/arrays-13.c
deleted file mode 100644
index f27e0c15ff89ff1bf1cf4a2e0bc55f1d775f4f59..0000000000000000000000000000000000000000
--- a/20201119/arrays-13.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[] = { 0 };
-  for (int *p = prime; *p; p++)
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/arrays-2.c b/20201119/arrays-2.c
deleted file mode 100644
index d206e6c3296fe7f7e48febd10893a5be65fca67a..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/arrays-3.c b/20201119/arrays-3.c
deleted file mode 100644
index 388b8bcc0dc426cc3aaee3769fc5ac577bfa441c..0000000000000000000000000000000000000000
--- a/20201119/arrays-3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[5] = { 2, 3, 5, 7, 11 };
-  int *p;
-  p = prime;
-  for (int i = 0; i < 5; i++)
-    printf ("%d\n", p[i]);
-  return 0;
-}
diff --git a/20201119/arrays-4-O0.s b/20201119/arrays-4-O0.s
deleted file mode 100644
index ebca8d83fa17c0087d4f4a1e853e32b8e848594a..0000000000000000000000000000000000000000
--- a/20201119/arrays-4-O0.s
+++ /dev/null
@@ -1,45 +0,0 @@
-	.file	"arrays-4.c"
-	.text
-	.section	.rodata
-.LC0:
-	.string	"%d\n"
-	.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
-	subq	$32, %rsp
-	movl	$2, -32(%rbp)
-	movl	$3, -28(%rbp)
-	movl	$5, -24(%rbp)
-	movl	$7, -20(%rbp)
-	movl	$11, -16(%rbp)
-	movl	$0, -4(%rbp)
-	jmp	.L2
-.L3:
-	movl	-4(%rbp), %eax
-	cltq
-	movl	-32(%rbp,%rax,4), %eax
-	movl	%eax, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	addl	$1, -4(%rbp)
-.L2:
-	cmpl	$4, -4(%rbp)
-	jle	.L3
-	movl	$0, %eax
-	leave
-	.cfi_def_cfa 7, 8
-	ret
-	.cfi_endproc
-.LFE0:
-	.size	main, .-main
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201119/arrays-4-m32.s b/20201119/arrays-4-m32.s
deleted file mode 100644
index c7bcb148f2f18c3418ab976bc4f7111beb397331..0000000000000000000000000000000000000000
--- a/20201119/arrays-4-m32.s
+++ /dev/null
@@ -1,79 +0,0 @@
-	.file	"arrays-4.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	leal	4(%esp), %ecx
-	.cfi_def_cfa 1, 0
-	andl	$-16, %esp
-	pushl	-4(%ecx)
-	pushl	%ebp
-	.cfi_escape 0x10,0x5,0x2,0x75,0
-	movl	%esp, %ebp
-	pushl	%edi
-	pushl	%esi
-	pushl	%ebx
-	pushl	%ecx
-	.cfi_escape 0xf,0x3,0x75,0x70,0x6
-	.cfi_escape 0x10,0x7,0x2,0x75,0x7c
-	.cfi_escape 0x10,0x6,0x2,0x75,0x78
-	.cfi_escape 0x10,0x3,0x2,0x75,0x74
-	subl	$56, %esp
-	call	__x86.get_pc_thunk.bx
-	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
-	movl	$2, -44(%ebp)
-	movl	$3, -40(%ebp)
-	movl	$5, -36(%ebp)
-	movl	$7, -32(%ebp)
-	movl	$11, -28(%ebp)
-	leal	-44(%ebp), %esi
-	leal	-24(%ebp), %eax
-	movl	%eax, -60(%ebp)
-	leal	.LC0@GOTOFF(%ebx), %edi
-.L2:
-	subl	$8, %esp
-	pushl	(%esi)
-	pushl	%edi
-	call	printf@PLT
-	addl	$4, %esi
-	addl	$16, %esp
-	cmpl	-60(%ebp), %esi
-	jne	.L2
-	movl	$0, %eax
-	leal	-16(%ebp), %esp
-	popl	%ecx
-	.cfi_restore 1
-	.cfi_def_cfa 1, 0
-	popl	%ebx
-	.cfi_restore 3
-	popl	%esi
-	.cfi_restore 6
-	popl	%edi
-	.cfi_restore 7
-	popl	%ebp
-	.cfi_restore 5
-	leal	-4(%ecx), %esp
-	.cfi_def_cfa 4, 4
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.section	.text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
-	.globl	__x86.get_pc_thunk.bx
-	.hidden	__x86.get_pc_thunk.bx
-	.type	__x86.get_pc_thunk.bx, @function
-__x86.get_pc_thunk.bx:
-.LFB12:
-	.cfi_startproc
-	movl	(%esp), %ebx
-	ret
-	.cfi_endproc
-.LFE12:
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201119/arrays-4.c b/20201119/arrays-4.c
deleted file mode 100644
index 83a03a4fe9425d684db38f0219cd9e9e19b405ba..0000000000000000000000000000000000000000
--- a/20201119/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 i = 0; i < 5; i++)
-    printf ("%d\n", prime[i]);
-  return 0;
-}
diff --git a/20201119/arrays-4.s b/20201119/arrays-4.s
deleted file mode 100644
index 7e82bcaa41df38434faa6619221913a632de15fe..0000000000000000000000000000000000000000
--- a/20201119/arrays-4.s
+++ /dev/null
@@ -1,53 +0,0 @@
-	.file	"arrays-4.c"
-	.text
-	.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)                   # #include <stdio.h>
-	movl	$3, 4(%rsp)                  # 
-	movl	$5, 8(%rsp)                  # int main (void)
-	movl	$7, 12(%rsp)                 # {
-	movl	$11, 16(%rsp)                #   int prime[5] = { 2, 3, 5, 7, 11 };
-	movq	%rsp, %rbx                   #   for (int i = 0; i < 5; i++)
-	leaq	20(%rbx), %r12               #     printf ("%d\n", prime[i]);
-	leaq	.LC0(%rip), %rbp             #   return 0;
-.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 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201119/arrays-5.c b/20201119/arrays-5.c
deleted file mode 100644
index 2015ffc6cd5057daaa755294ab4af602559eefa4..0000000000000000000000000000000000000000
--- a/20201119/arrays-5.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/20201119/arrays-5.s b/20201119/arrays-5.s
deleted file mode 100644
index 3a7c4d5dfeaed0ea17968f93767c3ec23693dda2..0000000000000000000000000000000000000000
--- a/20201119/arrays-5.s
+++ /dev/null
@@ -1,47 +0,0 @@
-	.file	"arrays-5.c"
-	.text
-	.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)                       # #include <stdio.h>
-	movl	$3, 4(%rsp)                      # 
-	movl	$5, 8(%rsp)                      # int main (void)
-	movl	$7, 12(%rsp)                     # {
-	movl	$11, 16(%rsp)                    #   int prime[5] = { 2, 3, 5, 7, 11 };
-	movq	%rsp, %rbx                       #   for (int *p = prime; p < prime + 5; p++)
-	leaq	20(%rsp), %rbp                   #     printf ("%d\n", *p);
-.L2:                                             #   return 0;
-	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 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201119/arrays-6.c b/20201119/arrays-6.c
deleted file mode 100644
index 28a88d55b97ae96e3a4e9a4a467ba89e57719dba..0000000000000000000000000000000000000000
--- a/20201119/arrays-6.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[6] = { 2, 3, 5, 7, 11, 0 };
-  for (int *p = prime; *p != 0; p++)
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/arrays-7.c b/20201119/arrays-7.c
deleted file mode 100644
index dcf32170d4658f2eafdf436809e9a9aa0e56379b..0000000000000000000000000000000000000000
--- a/20201119/arrays-7.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#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;
-}
diff --git a/20201119/arrays-8.c b/20201119/arrays-8.c
deleted file mode 100644
index 6e19ec4ef5e5b81e940168a4a4e6b3026a4f4375..0000000000000000000000000000000000000000
--- a/20201119/arrays-8.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#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;
-}
diff --git a/20201119/arrays-9.c b/20201119/arrays-9.c
deleted file mode 100644
index 37209f1e1bf1f979d0a8102afbaf52808c3501cd..0000000000000000000000000000000000000000
--- a/20201119/arrays-9.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int prime[] = { 2, 3, 5, 7, 11, 0 };
-  for (int *p = prime; *p; p++)
-    printf ("%d\n", *p);
-  prime[5] = 13;              /* Dies funktioniert zwar im Moment, ist aber falsch! */
-  prime[6] = 0;               /* Wir schreiben über das Array hinaus. Dies kann zu einem */
-  for (int *p = prime; *p; p++)                                    /* Absturz führen. */
-    printf ("%d\n", *p);
-  return 0;
-}
diff --git a/20201119/aufgabe-2.c b/20201119/aufgabe-2.c
deleted file mode 100644
index 52e4f0af52b66fb03cd652d621f5044685cfa47e..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/break-1.c b/20201119/break-1.c
deleted file mode 100644
index f3ee1a8199e63ce57a7624796af5e9f91917b614..0000000000000000000000000000000000000000
--- a/20201119/break-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 0;
-  int b = 1;
-  printf ("%d\n", b);
-  for (int i = 0; i < 10; i++)
-    {
-      int c = a + b;
-      a = b;
-      b = c;
-      printf ("%d\n", b);
-    }
-  return 0;
-}
diff --git a/20201119/break-2.c b/20201119/break-2.c
deleted file mode 100644
index 061092d844651f831ceeee60efc0f2d1d3b84698..0000000000000000000000000000000000000000
--- a/20201119/break-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-/* Aufgabe: Finde die erste Fibonacci-Zahl, die größer ist als 10. */
-
-int main (void)
-{
-  int a = 0;
-  int b = 1;
-  while (1)
-    {
-      int c = a + b;
-      a = b;
-      b = c;
-      if (b > 10)
-        {
-          printf ("Die erste Fibonacci-Zahl, die größer ist als 10, lautet: %d\n", b);
-          /* Dieses printf() erfolgt von der Logik her nach der Schleife,
-             es steht aber im Quelltext _innerhalb_ der Schleife. */
-          break;
-        }
-    }
-  return 0;
-}
diff --git a/20201119/break-3.c b/20201119/break-3.c
deleted file mode 100644
index 676b6bc8506264873acb441a6b44e1632c22a257..0000000000000000000000000000000000000000
--- a/20201119/break-3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-
-/* Aufgabe: Finde die erste Fibonacci-Zahl, die größer ist als 10. */
-
-int main (void)
-{
-  int a = 0;
-  int b = 1;
-  while (b <= 10)
-    {
-      int c = a + b;
-      a = b;
-      b = c;
-    }
-  printf ("Die erste Fibonacci-Zahl, die größer ist als 10, lautet: %d\n", b);  /* nach der Schleife */
-  return 0;
-}
diff --git a/20201119/chars-1.c b/20201119/chars-1.c
deleted file mode 100644
index 7089769e0a9e70cfff426c4d0fa15c89b562cec0..0000000000000000000000000000000000000000
--- a/20201119/chars-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", '*');
-  printf ("%c\n", 71);
-  return 0;
-}
diff --git a/20201119/chars-2.c b/20201119/chars-2.c
deleted file mode 100644
index 326aa6334808f996101cea23435e8aa4d71940c3..0000000000000000000000000000000000000000
--- a/20201119/chars-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", '*');
-  printf ("%x\n", '*');
-  printf ("%c\n", 71);
-  return 0;
-}
diff --git a/20201119/chars-3.c b/20201119/chars-3.c
deleted file mode 100644
index 515341ce8681ea1596761494b53c431f698a9d5d..0000000000000000000000000000000000000000
--- a/20201119/chars-3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", '*');
-  printf ("%x\n", '*');
-  printf ("%c\n", 71);
-  printf ("%c\n", 0x65);
-  return 0;
-}
diff --git a/20201119/hp-20201119.pdf b/20201119/hp-20201119.pdf
deleted file mode 100644
index 4d3e27cc943f47546be27b9b004d3a02e0c38999..0000000000000000000000000000000000000000
Binary files a/20201119/hp-20201119.pdf and /dev/null differ
diff --git a/20201119/hp-20201119.tex b/20201119/hp-20201119.tex
deleted file mode 100644
index 0ee2c790b0281483d0c2e6a726116edb8bc64b72..0000000000000000000000000000000000000000
--- a/20201119/hp-20201119.tex
+++ /dev/null
@@ -1,1139 +0,0 @@
-% hp-20201119.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: 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{19.\ November 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}
-      \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<1->{\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
-        \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}
-
-\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 = { 19, 11, 2020 };
-      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 = 19;
-        (*d).month = 11;
-        (*d).year = 2020;
-      }¿
-    \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 = 19;
-        d->month = 11;
-        d->year = 2020;
-      }¿
-    \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
-        \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/20201119/hp-musterloesung-20201119.pdf b/20201119/hp-musterloesung-20201119.pdf
deleted file mode 100644
index 53f9bb704884eee1c02c409b2b055adeed78a1b0..0000000000000000000000000000000000000000
Binary files a/20201119/hp-musterloesung-20201119.pdf and /dev/null differ
diff --git a/20201119/hp-musterloesung-20201119.tex b/20201119/hp-musterloesung-20201119.tex
deleted file mode 100644
index f1bcd8d470eb2269f57961a2b0d3a2601a4cde11..0000000000000000000000000000000000000000
--- a/20201119/hp-musterloesung-20201119.tex
+++ /dev/null
@@ -1,281 +0,0 @@
-% hp-musterloesung-20201119.pdf - Solutions to the 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
-% 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 -- 19.\ November 2020}
-
-  \exercise{Seltsame Programme}
-
-  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201119}
-  finden Sie (unter anderem)\\
-  die Programme \gitfile{hp}{2020ws/20201119}{test-1.c},
-  \gitfile{hp}{2020ws/20201119}{test-2.c} und \gitfile{hp}{2020ws/20201119}{test-3.c}.
-
-  Was bewirken diese Programme, und warum verhalten sie sich so?
-
-  \solution
-
-  \begin{itemize}
-    \item
-      \gitfile{hp}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{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 12.\,11.\,2020).
-
-      Der Quelltext \gitfile{hp}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{loesung-2-f2.c} und \gitfile{hp}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{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}{2020ws/20201119}{loesung-2-7.c} und \gitfile{hp}{2020ws/20201119}{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}{2020ws/20201119}{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/20201119/hp-uebung-20201119.pdf b/20201119/hp-uebung-20201119.pdf
deleted file mode 100644
index 199e98fa298500294d2f22bbed6ae771ec5d2145..0000000000000000000000000000000000000000
Binary files a/20201119/hp-uebung-20201119.pdf and /dev/null differ
diff --git a/20201119/hp-uebung-20201119.tex b/20201119/hp-uebung-20201119.tex
deleted file mode 100644
index 923d5ce91ac2391fb7d87d3a38616e5b95bd8434..0000000000000000000000000000000000000000
--- a/20201119/hp-uebung-20201119.tex
+++ /dev/null
@@ -1,114 +0,0 @@
-% hp-uebung-20201119.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
-% 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 -- 19.\ November 2020}
-
-  \exercise{Seltsame Programme}
-
-  Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201119}
-  finden Sie (unter anderem)\\
-  die Programme \gitfile{hp}{2020ws/20201119}{test-1.c},
-  \gitfile{hp}{2020ws/20201119}{test-2.c} und \gitfile{hp}{2020ws/20201119}{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}{2020ws/20201119}{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 für \lstinline{IsLeapYear()}
-  Ihre eigene Funktion aus Aufgabe 1 der letzten Übung.
-
-  \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}.
-
-\end{document}
diff --git a/20201119/init-1.c b/20201119/init-1.c
deleted file mode 100644
index 9a05531f9820ada5bb72c00f2443bd6f3b2e5245..0000000000000000000000000000000000000000
--- a/20201119/init-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b = 3, 3;
-  printf ("a = %d, b = %d\n", a, b);
-  return 0;
-}
diff --git a/20201119/init-2.c b/20201119/init-2.c
deleted file mode 100644
index e62490d5aa8cad477fa1ed5dc3a2a4b618536ed3..0000000000000000000000000000000000000000
--- a/20201119/init-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b = (3, 3);
-  printf ("a = %d, b = %d\n", a, b);
-  return 0;
-}
diff --git a/20201119/init-3.c b/20201119/init-3.c
deleted file mode 100644
index 049bc7d94b12216cb5088b38345a24a9f80a201c..0000000000000000000000000000000000000000
--- a/20201119/init-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a, b = (3, 3);  /* Komma-Operator: ignoriere die erste 3, nimm die zweite */
-  /* a ist eine lokale Variable und daher uninitialisiert */
-  printf ("a = %d, b = %d\n", a, b);
-  return 0;
-}
diff --git a/20201119/loesung-2-4.c b/20201119/loesung-2-4.c
deleted file mode 100644
index d141e32582374a3b3e6955f5634191d15edb3709..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-5.c b/20201119/loesung-2-5.c
deleted file mode 100644
index 8a71934b7df24a28d11a6696e212aaccc430277f..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-6.c b/20201119/loesung-2-6.c
deleted file mode 100644
index 0605571480991d1ec73a8cec50395ddf68ae3135..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-7.c b/20201119/loesung-2-7.c
deleted file mode 100644
index 5c98286730aae146cf587b5f3401eb6eadd17aa7..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-8.c b/20201119/loesung-2-8.c
deleted file mode 100644
index e94dc80375b88fd5ff3245e8a99f76a5955b6bb8..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-f1.c b/20201119/loesung-2-f1.c
deleted file mode 100644
index 4d511c4fa7ee6a9dfb0bc2f69412eeb48745af56..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-f2.c b/20201119/loesung-2-f2.c
deleted file mode 100644
index a44edb09ffde3d3c77cfe673da862260368c33e3..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/loesung-2-f3.c b/20201119/loesung-2-f3.c
deleted file mode 100644
index dbfe5040274953c3b90d6b2da194c0c8ae64f04f..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/logo-hochschule-bochum-cvh-text-v2.pdf b/20201119/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/logo-hochschule-bochum.pdf b/20201119/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201119/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201119/pgscript.sty b/20201119/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201119/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201119/pgslides.sty b/20201119/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201119/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201119/pointers-1.c b/20201119/pointers-1.c
deleted file mode 100644
index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/pointers-10.c b/20201119/pointers-10.c
deleted file mode 100644
index 87c15939a621158c9bf85349235d11eeba76a577..0000000000000000000000000000000000000000
--- a/20201119/pointers-10.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int calc_answer (void)
-{
-  return 42;
-}
-
-int main (void)
-{
-  int answer = 137;
-  answer = calc_answer ();
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-11.c b/20201119/pointers-11.c
deleted file mode 100644
index 09beb47172938d4a259e5652571d2c30f94fef19..0000000000000000000000000000000000000000
--- a/20201119/pointers-11.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int a)
-{
-  a = 42;
-  printf ("&a = %x\n", &a);
-}
-
-int main (void)
-{
-  int answer = 137;
-  printf ("&answer = %x\n", &answer);
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-12.c b/20201119/pointers-12.c
deleted file mode 100644
index e75810bc7fa0a7e1553fa35362951d223be2e0b4..0000000000000000000000000000000000000000
--- a/20201119/pointers-12.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-  printf ("a = %x\n", a);
-  printf ("&a = %x\n", &a);
-}
-
-int main (void)
-{
-  int answer = 137;
-  printf ("&answer = %x\n", &answer);
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-2.c b/20201119/pointers-2.c
deleted file mode 100644
index 7867933ea67073e239e5b307d2c219639442be77..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/pointers-3.c b/20201119/pointers-3.c
deleted file mode 100644
index 69b7182f7df3725e3ecfb4a10d8376eeff43ad4c..0000000000000000000000000000000000000000
--- a/20201119/pointers-3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-  printf ("*a = %d\n", *a);
-  printf ("a = %d\n", a);
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-4.c b/20201119/pointers-4.c
deleted file mode 100644
index ab9f4575402b2bde8d1e9b8fd048a57a71eb1586..0000000000000000000000000000000000000000
--- a/20201119/pointers-4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-  printf ("*a = %d\n", *a);
-  printf ("a = %x\n", a);
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-5.c b/20201119/pointers-5.c
deleted file mode 100644
index f437cf432137bbf3298d038c635b74df6be0d04e..0000000000000000000000000000000000000000
--- a/20201119/pointers-5.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  *a = 42;
-  printf ("*a = %d\n", *a);
-  printf ("a = %d\n", a);
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-6.c b/20201119/pointers-6.c
deleted file mode 100644
index 8710b87defa6afd78ca08faf1a9b26c3e7c76969..0000000000000000000000000000000000000000
--- a/20201119/pointers-6.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  printf ("a = %d\n", a);
-  *a = 42;
-  printf ("*a = %d\n", *a);
-}
-
-int main (void)
-{
-  int answer;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-7.c b/20201119/pointers-7.c
deleted file mode 100644
index ea57eee75caf86654957e74b28aff69e6979ab20..0000000000000000000000000000000000000000
--- a/20201119/pointers-7.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int *a)
-{
-  printf ("a = %d\n", a);
-  *a = 42;
-  printf ("*a = %d\n", *a);
-}
-
-int main (void)
-{
-  int answer = 137;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-8.c b/20201119/pointers-8.c
deleted file mode 100644
index f253112079f1d85db4c5f823c986a35b545c77a0..0000000000000000000000000000000000000000
--- a/20201119/pointers-8.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int a)
-{
-  a = 42;
-}
-
-int main (void)
-{
-  int answer = 137;
-  calc_answer (answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/pointers-9.c b/20201119/pointers-9.c
deleted file mode 100644
index d347a74482460e2b5635562e99ea848fa0e8af55..0000000000000000000000000000000000000000
--- a/20201119/pointers-9.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void calc_answer (int a)
-{
-  a = 42;
-}
-
-int main (void)
-{
-  int answer = 137;
-  calc_answer (&answer);
-  printf ("The answer is %d.\n", answer);
-  return 0;
-}
diff --git a/20201119/strings-1.c b/20201119/strings-1.c
deleted file mode 100644
index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/strings-10.c b/20201119/strings-10.c
deleted file mode 100644
index f01f72c7803ae94d6f35f99f8777b10a0e43f5e0..0000000000000000000000000000000000000000
--- a/20201119/strings-10.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 'H', 'a', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n', 0 };
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201119/strings-11.c b/20201119/strings-11.c
deleted file mode 100644
index ced6e34e6d60e600655c4152028416be1139c583..0000000000000000000000000000000000000000
--- a/20201119/strings-11.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 'H', 'a', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n' };
-  /* Hier fehlt das Null-Symbol am Ende des Strings!
-     ==> printf() liest über das String-Ende hinaus,
-         bis es im Speicher zufällig auf eine 0 stößt.
-         Dies kann zu einem Absturz führen! */
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201119/strings-12.c b/20201119/strings-12.c
deleted file mode 100644
index b35da3453417c6087ce1a3b0db0f10d7e5070231..0000000000000000000000000000000000000000
--- a/20201119/strings-12.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *hello = "Hello, world!";
-  printf ("%s\n", hello);
-  return 0;
-}
diff --git a/20201119/strings-13.c b/20201119/strings-13.c
deleted file mode 100644
index 0165d83890b6d0bd202dec2eb62bde98f838db3f..0000000000000000000000000000000000000000
--- a/20201119/strings-13.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%s\n", "Hallo, Welt!");
-  return 0;
-}
diff --git a/20201119/strings-14.c b/20201119/strings-14.c
deleted file mode 100644
index 32e64d466014a6c8244f3297198876f1a4a48d5a..0000000000000000000000000000000000000000
--- a/20201119/strings-14.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%s\n", "Hallo, Welt!" + 4);
-  return 0;
-}
diff --git a/20201119/strings-15.c b/20201119/strings-15.c
deleted file mode 100644
index 2615531f95f77c4d5f1577eff9f8c8180a3b30ab..0000000000000000000000000000000000000000
--- a/20201119/strings-15.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Ersparnis beträgt %d%%.\n", 42);
-  return 0;
-}
diff --git a/20201119/strings-16.c b/20201119/strings-16.c
deleted file mode 100644
index 43b27266c61a8d05e62a9e5cd5881447d5300ccc..0000000000000000000000000000000000000000
--- a/20201119/strings-16.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Die Ersparnis beträgt %d%c.\n", 42, '%');
-  return 0;
-}
diff --git a/20201119/strings-17.c b/20201119/strings-17.c
deleted file mode 100644
index 3f8e223099e7183a4ecb743458ae1baaed7fdead..0000000000000000000000000000000000000000
--- a/20201119/strings-17.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Der Format-String lautet: %s\n", "%02hhx");
-  return 0;
-}
diff --git a/20201119/strings-18.c b/20201119/strings-18.c
deleted file mode 100644
index ac0ad7c70f69972cde6062738962a3b380ab1d7b..0000000000000000000000000000000000000000
--- a/20201119/strings-18.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Добрый день!\n");
-  return 0;
-}
diff --git a/20201119/strings-19.c b/20201119/strings-19.c
deleted file mode 100644
index 7f91d53741d7a56e165839108d0c25dc4701ac8f..0000000000000000000000000000000000000000
--- a/20201119/strings-19.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%s\n", "Добрый день!");
-  return 0;
-}
diff --git a/20201119/strings-2.c b/20201119/strings-2.c
deleted file mode 100644
index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/strings-20.c b/20201119/strings-20.c
deleted file mode 100644
index 17d6d120cdbee211a3316b0a2ff0f5f0e93fb7b6..0000000000000000000000000000000000000000
--- a/20201119/strings-20.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", "Д");  /* Falsch: gibt die Speicheradresse des "Д" aus. */
-  return 0;
-}
diff --git a/20201119/strings-21.c b/20201119/strings-21.c
deleted file mode 100644
index ba95961c605d7b1375f76ddca48b14442892f465..0000000000000000000000000000000000000000
--- a/20201119/strings-21.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%d\n", 'Д');  /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'Д'. */
-  return 0;
-}
diff --git a/20201119/strings-22.c b/20201119/strings-22.c
deleted file mode 100644
index 982de510faa8dcbd2bcdf285d007b3ccdb98846b..0000000000000000000000000000000000000000
--- a/20201119/strings-22.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%08x\n", 'Д');  /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'Д'. */
-  return 0;                /* Für korrekte Handhabung von UTF-8: Bibliothek verwenden.    */
-}
diff --git a/20201119/strings-23.c b/20201119/strings-23.c
deleted file mode 100644
index 4b89550c9e9572581894704b4e541346232bb569..0000000000000000000000000000000000000000
--- a/20201119/strings-23.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("%08x\n", 'ä');  /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'ä', */
-  return 0;                /* sondern die UTF-8-Kodierung für 'ä'.                        */
-                           /* Für korrekte Handhabung von UTF-8: Bibliothek verwenden.    */
-}
diff --git a/20201119/strings-3.c b/20201119/strings-3.c
deleted file mode 100644
index 5c36db92dac8129b66d1f0ff6b709534b9e1bdb3..0000000000000000000000000000000000000000
--- a/20201119/strings-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 };
-  for (char *p = hello; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20201119/strings-4.c b/20201119/strings-4.c
deleted file mode 100644
index aa189d9f4170e47899e9e7854070af0f73573517..0000000000000000000000000000000000000000
--- a/20201119/strings-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 };
-  for (char *p = hello; !*p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20201119/strings-5.c b/20201119/strings-5.c
deleted file mode 100644
index f37edf15be04770135c5b178d204638c18f7f12b..0000000000000000000000000000000000000000
--- a/20201119/strings-5.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hällou, wörldt!\n";
-  for (char *p = hello; *p; p++)
-    printf ("%x ", *p);
-  printf ("\n");
-  return 0;
-}
diff --git a/20201119/strings-6.c b/20201119/strings-6.c
deleted file mode 100644
index 3ae70e168f0a7101ffecb34e407a919dd7c19cf0..0000000000000000000000000000000000000000
--- a/20201119/strings-6.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hällou, wörldt!\n";
-  for (char *p = hello; *p; p++)
-    printf ("%hhx ", *p);
-  printf ("\n");
-  return 0;
-}
diff --git a/20201119/strings-7.c b/20201119/strings-7.c
deleted file mode 100644
index 49dfb3e2a213c46448c33ba949af5ab281018677..0000000000000000000000000000000000000000
--- a/20201119/strings-7.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hällou, wörldt!\n";
-  for (char *p = hello; *p; p++)
-    printf ("%02hhx ", *p);
-  printf ("\n");
-  return 0;
-}
diff --git a/20201119/strings-8.c b/20201119/strings-8.c
deleted file mode 100644
index 2f739c8c80d6923e9f17a184a629a37877f6131c..0000000000000000000000000000000000000000
--- a/20201119/strings-8.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hallo, Welt!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201119/strings-9.c b/20201119/strings-9.c
deleted file mode 100644
index 74f11c34440c4ed87b886ef9aad8c9a39cb70a33..0000000000000000000000000000000000000000
--- a/20201119/strings-9.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 };
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201119/test-1.c b/20201119/test-1.c
deleted file mode 100644
index 9dcb8ff47664fe804b3c9973166afe0d28b53ade..0000000000000000000000000000000000000000
--- a/20201119/test-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  return
-  printf ("Hello, world!\n"),
-  0;
-}
diff --git a/20201119/test-2.c b/20201119/test-2.c
deleted file mode 100644
index 216c924cde653228187b133b1a899765eb865584..0000000000000000000000000000000000000000
--- a/20201119/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/20201119/test-3.c b/20201119/test-3.c
deleted file mode 100644
index b8964c8308aec57ed4de30acae8c3e3d31b9fa38..0000000000000000000000000000000000000000
--- a/20201119/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/20201126/!\"\302\247$%&/().txt" "b/20201126/!\"\302\247$%&/().txt"
deleted file mode 100644
index af5626b4a114abcb82d63db7c8082c3c4756e51b..0000000000000000000000000000000000000000
--- "a/20201126/!\"\302\247$%&/().txt"
+++ /dev/null
@@ -1 +0,0 @@
-Hello, world!
diff --git a/20201126/aufgabe-1.c b/20201126/aufgabe-1.c
deleted file mode 100644
index ad9d80416bad5c7c0edf9c9d4f175146c92a2755..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/aufgabe-2-1.c b/20201126/aufgabe-2-1.c
deleted file mode 100644
index e56af8cdd1c1abcac992605475472612878b786d..0000000000000000000000000000000000000000
--- a/20201126/aufgabe-2-1.c
+++ /dev/null
@@ -1,6 +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/20201126/aufgabe-2-2.c b/20201126/aufgabe-2-2.c
deleted file mode 100644
index 9d3e005456a7316340a5c5d404e7d6f911487771..0000000000000000000000000000000000000000
--- a/20201126/aufgabe-2-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-char *f = "char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
-
-int main (void)
-{
-  printf (f, 34, f, 34, 10);
-  return 0;
-}
diff --git a/20201126/aufgabe-2.c b/20201126/aufgabe-2.c
deleted file mode 100644
index dc58b6e8ee4a7a023654aa0eb3a9715a5b9f75cf..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/aufgabe-3.c b/20201126/aufgabe-3.c
deleted file mode 100644
index cd80c21b95b5a4c91a43a8b3e849f5e12db183c7..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/case-convert-1.c b/20201126/case-convert-1.c
deleted file mode 100644
index 014847ef707d757d7a7a3aec8da33bc5e215a987..0000000000000000000000000000000000000000
--- a/20201126/case-convert-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'f';
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-2.c b/20201126/case-convert-2.c
deleted file mode 100644
index 3369266d66046b658726e9df95e965c28dd19770..0000000000000000000000000000000000000000
--- a/20201126/case-convert-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'f';
-  ch -= 32;
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-3.c b/20201126/case-convert-3.c
deleted file mode 100644
index 67666849149fc37220cc793c4f266b2a05ea2983..0000000000000000000000000000000000000000
--- a/20201126/case-convert-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'f';
-  ch = ch - 'f' + 'F';
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-4.c b/20201126/case-convert-4.c
deleted file mode 100644
index 06648d1f097adfed6bd3cc7246b59f3f958a6a70..0000000000000000000000000000000000000000
--- a/20201126/case-convert-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'f';
-  ch += 'F' - 'f';
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-5.c b/20201126/case-convert-5.c
deleted file mode 100644
index 5718dda862fea32003090f38d446c3f3a74bdc93..0000000000000000000000000000000000000000
--- a/20201126/case-convert-5.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'f';
-  ch += 'A' - 'a';
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-6.c b/20201126/case-convert-6.c
deleted file mode 100644
index 1f7960abb162cb218ad44643cacbacc09e250e17..0000000000000000000000000000000000000000
--- a/20201126/case-convert-6.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char ch = 'G';
-  ch += 'a' - 'A';
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/case-convert-7.c b/20201126/case-convert-7.c
deleted file mode 100644
index 0133886c5c7bd30abb6ba9f7e0aed96dee765b2f..0000000000000000000000000000000000000000
--- a/20201126/case-convert-7.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-#include <ctype.h>
-
-int main (void)
-{
-  char ch = 'G';
-  ch = tolower (ch);
-  printf ("%c\n", ch);
-  return 0;
-}
diff --git a/20201126/fhello-1.c b/20201126/fhello-1.c
deleted file mode 100644
index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/fhello-10.c b/20201126/fhello-10.c
deleted file mode 100644
index 78247d9705598987ddb185d5fc216fe4bacf6fea..0000000000000000000000000000000000000000
--- a/20201126/fhello-10.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/bin/bash", "w");
-  if (!f)
-    error (errno, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20201126/fhello-2.c b/20201126/fhello-2.c
deleted file mode 100644
index 2acae5f3218fef4441eca339682c0d8076e4e18d..0000000000000000000000000000000000000000
--- a/20201126/fhello-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("fhello.txt", "a");  /* "a" = "append", "w" = "(over)write" */
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20201126/fhello-3.c b/20201126/fhello-3.c
deleted file mode 100644
index 50afa600ce12073f7646a0548807b6472bc3b11e..0000000000000000000000000000000000000000
--- a/20201126/fhello-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().txt", "w");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20201126/fhello-4.c b/20201126/fhello-4.c
deleted file mode 100644
index 7bda3500fb3e652126b90e8ba3daea29a7dce026..0000000000000000000000000000000000000000
--- a/20201126/fhello-4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().txt", "w");
-  if (f != NULL)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  return 0;
-}
diff --git a/20201126/fhello-5.c b/20201126/fhello-5.c
deleted file mode 100644
index 0445ee2006464b73ab44f95dce0b60324391834c..0000000000000000000000000000000000000000
--- a/20201126/fhello-5.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().txt", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  return 0;
-}
diff --git a/20201126/fhello-6.c b/20201126/fhello-6.c
deleted file mode 100644
index a479c4694d2d370c5182d993c40ee8b4e73c4eb6..0000000000000000000000000000000000000000
--- a/20201126/fhello-6.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().txt", "w");
-  if (f)
-    {
-      fprintf (f, "Hello, world!\n");
-      fclose (f);
-    }
-  else
-    fprintf (stderr, "error #%d\n", errno);
-  return 0;
-}
diff --git a/20201126/fhello-7.c b/20201126/fhello-7.c
deleted file mode 100644
index 96a6610279c9a8bb6422aad12e96a33759fe6cd5..0000000000000000000000000000000000000000
--- a/20201126/fhello-7.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().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/20201126/fhello-8.c b/20201126/fhello-8.c
deleted file mode 100644
index dc2ae6dea521671443cec60ded691ac360bc7a36..0000000000000000000000000000000000000000
--- a/20201126/fhello-8.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("!\"§$%&/().txt", "w");
-  if (f == NULL)
-    error (1, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20201126/fhello-9.c b/20201126/fhello-9.c
deleted file mode 100644
index eaf23c4c77267d20d0b97fe46fa552b748df2c33..0000000000000000000000000000000000000000
--- a/20201126/fhello-9.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <error.h>
-
-int main (void)
-{
-  FILE *f = fopen ("/bin/bash", "w");
-  if (!f)
-    error (1, errno, "cannot open file");
-  fprintf (f, "Hello, world!\n");
-  fclose (f);
-  return 0;
-}
diff --git a/20201126/fhello.txt b/20201126/fhello.txt
deleted file mode 100644
index 95e75d98dbaf42c1efc9be0405e079f97aa24888..0000000000000000000000000000000000000000
--- a/20201126/fhello.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Hello, world!
-Hello, world!
diff --git a/20201126/hp-20201126.pdf b/20201126/hp-20201126.pdf
deleted file mode 100644
index 2959fd2fd51e46a31144dde6e7d15453ce89b729..0000000000000000000000000000000000000000
Binary files a/20201126/hp-20201126.pdf and /dev/null differ
diff --git a/20201126/hp-20201126.tex b/20201126/hp-20201126.tex
deleted file mode 100644
index 4c7a8e88b1e7826dc63f339b4199c9346090b1ae..0000000000000000000000000000000000000000
--- a/20201126/hp-20201126.tex
+++ /dev/null
@@ -1,773 +0,0 @@
-% hp-20201126.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: 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{26.\ November 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}
-      \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?
-
-      \smallskip
-
-      \begin{lstlisting}[gobble=8]
-        printf ("%d\n", '*');
-      \end{lstlisting}
-
-      \smallskip
-
-      (normalerweise: ASCII)
-    \medskip
-    \item
-      Ist \lstinline{char ch} ein Großbuchstabe?\\[-\smallskipamount]
-      \begin{lstlisting}[gobble=8]
-        if (ch >= 'A' && ch <= 'Z')
-          ...
-      \end{lstlisting}
-    \medskip
-    \item
-      Groß- in Kleinbuchstaben umwandeln\\[-\smallskipamount]
-      \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 = { 16, 11, 2020 };
-      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 = 26;
-        (*d).month = 11;
-        (*d).year = 2020;
-      }¿
-    \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 = 26;
-        d->month = 11;
-        d->year = 2020;
-      }¿
-    \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/20201126/hp-musterloesung-20201126.pdf b/20201126/hp-musterloesung-20201126.pdf
deleted file mode 100644
index 4739320734aabdfa9557d77aa213fea5b04f515e..0000000000000000000000000000000000000000
Binary files a/20201126/hp-musterloesung-20201126.pdf and /dev/null differ
diff --git a/20201126/hp-musterloesung-20201126.tex b/20201126/hp-musterloesung-20201126.tex
deleted file mode 100644
index f885398763f9073f0f4a58462ff405342bdaf001..0000000000000000000000000000000000000000
--- a/20201126/hp-musterloesung-20201126.tex
+++ /dev/null
@@ -1,414 +0,0 @@
-% hp-musterloesung-20201126.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: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 26.\ November 2020}
-
-  \exercise{Strings}
-
-  Strings werden in der Programmiersprache C
-  durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{loesung-2x.c}
-
-  \end{itemize}
-
-  \exercise{Fehlerhaftes Primzahl-Programm}
-
-  \begin{minipage}[t]{5.5cm}
-    Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{loesung-2-4.c}.
-
-  \bigskip
-
-  Nach der Korrektur dieses Fehlers verhält sich das Programm korrekt.
-
-  Die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-4.c} enthält somit das korrigierte Programm.
-
-\end{document}
diff --git a/20201126/hp-uebung-20201126.pdf b/20201126/hp-uebung-20201126.pdf
deleted file mode 100644
index 271787494f648cfbc71bbcf7b195bc60dda2eb83..0000000000000000000000000000000000000000
Binary files a/20201126/hp-uebung-20201126.pdf and /dev/null differ
diff --git a/20201126/hp-uebung-20201126.tex b/20201126/hp-uebung-20201126.tex
deleted file mode 100644
index 9ca341764b4364160bdfd75783fd46d17188d85d..0000000000000000000000000000000000000000
--- a/20201126/hp-uebung-20201126.tex
+++ /dev/null
@@ -1,127 +0,0 @@
-% hp-uebung-20201126.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: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\thispagestyle{empty}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 26.\ November 2020}
-
-  \exercise{Strings}
-
-  Strings werden in der Programmiersprache C
-  durch Zeiger auf \lstinline{char}-Variable realisiert.
-
-  Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2020ws/20201126}{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}{2020ws/20201126}{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}{2020ws/20201126}{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/20201126/loesung-1.c b/20201126/loesung-1.c
deleted file mode 100644
index 29a2b7f234ea5c31b06780e9dd461dff95dd33a3..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-2.c b/20201126/loesung-2.c
deleted file mode 100644
index 6346384a81d62e7e687f4db99be3ba8fe4020744..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-2x.c b/20201126/loesung-2x.c
deleted file mode 100644
index fcc65e153ddf009f55af118278774cd202f7c316..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-3-1.c b/20201126/loesung-3-1.c
deleted file mode 100644
index 248883b772ca68d498ae4dc080e83899eb715570..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-3-2.c b/20201126/loesung-3-2.c
deleted file mode 100644
index 0cc3db639099eab0040c568acbd46987eb599645..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-3-3.c b/20201126/loesung-3-3.c
deleted file mode 100644
index af2694c1ad2f710d79d7913b9dcfc7348be96115..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/loesung-3-4.c b/20201126/loesung-3-4.c
deleted file mode 100644
index 770d92706cc68f64147e5efd443880ac3d875495..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/logo-hochschule-bochum-cvh-text-v2.pdf b/20201126/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/logo-hochschule-bochum.pdf b/20201126/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201126/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201126/pgscript.sty b/20201126/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201126/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201126/pgslides.sty b/20201126/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201126/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201126/printf-shell-1.txt b/20201126/printf-shell-1.txt
deleted file mode 100644
index ce393366b481a5c51a936c9b24fe25225c497787..0000000000000000000000000000000000000000
--- a/20201126/printf-shell-1.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201126> printf "%d\n" "*"
-bash: printf: *: Ungültige Zahl.
-0
-cassini/home/peter/bo/2020ws/hp/20201126> printf "%d\n" "'*'"
-42
-cassini/home/peter/bo/2020ws/hp/20201126> printf "%c\n" "71"
-7
-cassini/home/peter/bo/2020ws/hp/20201126>
diff --git a/20201126/strings-1.c b/20201126/strings-1.c
deleted file mode 100644
index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/strings-10.c b/20201126/strings-10.c
deleted file mode 100644
index 4eeff0a580144625c15a6891d4286cf3da8d5f77..0000000000000000000000000000000000000000
--- a/20201126/strings-10.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  hello[2] = 'a';
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-11.c b/20201126/strings-11.c
deleted file mode 100644
index 10e25acce870c66d065dc0015eeba501ad86e0a7..0000000000000000000000000000000000000000
--- a/20201126/strings-11.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  hello[1] = 'a';
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-12.c b/20201126/strings-12.c
deleted file mode 100644
index ce49cd0f83ac1e365fd65bb6062aeb9232f18ed3..0000000000000000000000000000000000000000
--- a/20201126/strings-12.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  hello[1] = 97;
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-13.c b/20201126/strings-13.c
deleted file mode 100644
index dc6b7ca9a467d92f6862d273006873c26bcf122a..0000000000000000000000000000000000000000
--- a/20201126/strings-13.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *hello = "Hello!\n";
-  printf ("%s", hello);
-  hello[1] = 'a';
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-14.c b/20201126/strings-14.c
deleted file mode 100644
index 763459bc896426c4814d752938c2d5bbd00dca9a..0000000000000000000000000000000000000000
--- a/20201126/strings-14.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *hello = "Hello!\n";
-  printf ("%s", hello);
-  hello = "Hallo?\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-15.c b/20201126/strings-15.c
deleted file mode 100644
index 35197e386606fdf120f375fcf078be814ce7b633..0000000000000000000000000000000000000000
--- a/20201126/strings-15.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *hello = "Hello!\n";
-  printf ("%s", hello);
-  hello = "Hallo, Welt!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-16.c b/20201126/strings-16.c
deleted file mode 100644
index 64abcdc7574cfbe0424643a2c4076fdd448f53fd..0000000000000000000000000000000000000000
--- a/20201126/strings-16.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  hello = "Hallo, Welt!\n";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-17.c b/20201126/strings-17.c
deleted file mode 100644
index b0d9dcebb6acd1df56fc3b1314a6f6d8cf7a7a04..0000000000000000000000000000000000000000
--- a/20201126/strings-17.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  strcpy (hello, "Hallo, Welt!\n");  /* Achtung: Dies kann einen Absturz bewirken! */
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-2.c b/20201126/strings-2.c
deleted file mode 100644
index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000
--- a/20201126/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/20201126/strings-3.c b/20201126/strings-3.c
deleted file mode 100644
index 8da904190d58e16b20d84e19a41e639893831f5e..0000000000000000000000000000000000000000
--- a/20201126/strings-3.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10 };
-  for (char *p = hello; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20201126/strings-4.c b/20201126/strings-4.c
deleted file mode 100644
index 5c36db92dac8129b66d1f0ff6b709534b9e1bdb3..0000000000000000000000000000000000000000
--- a/20201126/strings-4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 };
-  for (char *p = hello; *p; p++)
-    printf ("%c", *p);
-  return 0;
-}
diff --git a/20201126/strings-5.c b/20201126/strings-5.c
deleted file mode 100644
index 74f11c34440c4ed87b886ef9aad8c9a39cb70a33..0000000000000000000000000000000000000000
--- a/20201126/strings-5.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 };
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-6.c b/20201126/strings-6.c
deleted file mode 100644
index 75c2a1cc5802891944f08a18056bb88194960fac..0000000000000000000000000000000000000000
--- a/20201126/strings-6.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = { 51, 50, 49, 48, 10, 0 };
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/strings-7.c b/20201126/strings-7.c
deleted file mode 100644
index 68227c25325d9699430cacc3d071c5dad629fb40..0000000000000000000000000000000000000000
--- a/20201126/strings-7.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/20201126/strings-8.c b/20201126/strings-8.c
deleted file mode 100644
index c75e8485434dd0f3578ad93e7c574f466424e544..0000000000000000000000000000000000000000
--- a/20201126/strings-8.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/20201126/strings-9.c b/20201126/strings-9.c
deleted file mode 100644
index 5db41cf82ce518086b515eadca849ee76d87dc02..0000000000000000000000000000000000000000
--- a/20201126/strings-9.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello!\n";
-  printf ("%s", hello);
-  hello[2] = "a";
-  printf ("%s", hello);
-  return 0;
-}
diff --git a/20201126/structs-0.c b/20201126/structs-0.c
deleted file mode 100644
index c597fc0612ca99a9d3d258310326bbee79f4f258..0000000000000000000000000000000000000000
--- a/20201126/structs-0.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-char day, month;
-int year;
-
-int main (void)
-{
-  day = 26;
-  month = 11;
-  year = 2020;
-  printf ("%d.%d.%d\n", day, month, year);
-  return 0;
-}
diff --git a/20201126/structs-1.c b/20201126/structs-1.c
deleted file mode 100644
index 1d71fbad0842877465d396b725b1f9626e0d9eb4..0000000000000000000000000000000000000000
--- a/20201126/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 = { 26, 11, 2020 };
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/20201126/structs-2.c b/20201126/structs-2.c
deleted file mode 100644
index e9d0986ccdf4a7106e59c0ee30eb1bfcd779e255..0000000000000000000000000000000000000000
--- a/20201126/structs-2.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 = 26;
-  (*d).month = 11;
-  (*d).year = 2020;
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  printf ("%d.%d.%d\n", today.day, today.month, today.year);
-  return 0;
-}
diff --git a/20201126/structs-3.c b/20201126/structs-3.c
deleted file mode 100644
index 6ed3133cc2097f3b7682588d2cef1b7aafeed692..0000000000000000000000000000000000000000
--- a/20201126/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 = 26;
-  (*d).month = 11;
-  (*d).year = 2020;
-}
-
-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/20201126/structs-4.c b/20201126/structs-4.c
deleted file mode 100644
index 390ce938ef8fd579b860b96303264b7303e67123..0000000000000000000000000000000000000000
--- a/20201126/structs-4.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 = 26;
-  d->month = 11;
-  d->year = 2020;
-}
-
-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/20201126/structs-5.c b/20201126/structs-5.c
deleted file mode 100644
index d48a32b38c32a57265042e3029aee6bd14467dae..0000000000000000000000000000000000000000
--- a/20201126/structs-5.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  char day, month;
-  int year;
-  char *day_of_week;
-}
-date;
-
-void set_date (date *d)
-{
-  d->day = 26;
-  d->month = 11;
-  d->year = 2020;
-  d->day_of_week = "Thu";
-}
-
-void print_date (date *d)
-{
-  printf ("%s, %d.%d.%d\n", d->day_of_week, d->day, d->month, d->year);
-}
-
-int main (void)
-{
-  date today;
-  set_date (&today);
-  print_date (&today);
-  return 0;
-}
diff --git a/20201126/test-1.txt b/20201126/test-1.txt
deleted file mode 100644
index aa4dca97b969d32af064e9bf480c1f861caea227..0000000000000000000000000000000000000000
--- a/20201126/test-1.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201126> cat
-Hallo?
-Hallo?
-Hallo.
-Hallo.
-cassini/home/peter/bo/2020ws/hp/20201126> cat > test.txt
-Dies ist ein Test.
-cassini/home/peter/bo/2020ws/hp/20201126> cat test.txt
-Dies ist ein Test.
-cassini/home/peter/bo/2020ws/hp/20201126>
diff --git a/20201126/test.txt b/20201126/test.txt
deleted file mode 100644
index d7e5cff47f0303c2d892d3e790e00552759b639c..0000000000000000000000000000000000000000
--- a/20201126/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-Dies ist ein Test.
diff --git a/20201203/aufgabe-1.c b/20201203/aufgabe-1.c
deleted file mode 100644
index 632b4b796ae2f4060878a8870b9e7e55e5f064b9..0000000000000000000000000000000000000000
--- a/20201203/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/20201203/aufgabe-1c.c b/20201203/aufgabe-1c.c
deleted file mode 100644
index 9b6e7ab2ecfbddc16121acd229a13745182190c2..0000000000000000000000000000000000000000
--- a/20201203/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/20201203/fibonacci-1.c b/20201203/fibonacci-1.c
deleted file mode 100644
index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-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/20201203/fibonacci-10.c b/20201203/fibonacci-10.c
deleted file mode 100644
index 5f5da72d082bc53737e63a29a3e027243adccba2..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-10.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 60
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  char carry = 0;
-  for (int i = 0; i < DIGITS; i++)
-    {
-      c[i] = a[i] + b[i] + carry;
-      if (c[i] > 9)
-        {
-          carry = 1;
-          c[i] -= 10;
-        }
-      else
-        carry = 0;
-    }
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 200; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-11.c b/20201203/fibonacci-11.c
deleted file mode 100644
index f952267a7028434ec5e35b33541659a3be3aeef9..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-11.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 20000
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  char carry = 0;
-  for (int i = 0; i < DIGITS; i++)
-    {
-      c[i] = a[i] + b[i] + carry;
-      if (c[i] > 9)
-        {
-          carry = 1;
-          c[i] -= 10;
-        }
-      else
-        carry = 0;
-    }
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 10000; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-2.c b/20201203/fibonacci-2.c
deleted file mode 100644
index dc1673c6fd2b034f3c0651f33bb2bcc4d7589720..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-void add (int *a, int *b, int *c)
-{
-  *c = *a + *b;
-}
-
-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;
-      add (&f0, &f1, &f2);
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-3.c b/20201203/fibonacci-3.c
deleted file mode 100644
index be44c777b18d30b24c566db20012324659f8558c..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-typedef int number;
-
-void add (number *a, number *b, number *c)
-{
-  *c = *a + *b;
-}
-
-int main (void)
-{
-  number f0 = 0;
-  number f1 = 1;
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %d\n", i, f0);
-      number f2;
-      add (&f0, &f1, &f2);
-      f0 = f1;
-      f1 = f2;
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-4.c b/20201203/fibonacci-4.c
deleted file mode 100644
index 0781697c8a4a1bfdb512cfaebe06c7b0465f47c6..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-4.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (number *a, number *b, number *c)
-{
-  c[0] = a[0] + b[0];
-}
-
-void copy (number *a, number *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %d\n", i, f0);
-      number f2;
-      add (&f0, &f1, &f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-5.c b/20201203/fibonacci-5.c
deleted file mode 100644
index 00ff7b3746229002cd685e6b56fa7a87a3220b7e..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-5.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  c[0] = a[0] + b[0];
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = %d\n", i, f0);
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-6.c b/20201203/fibonacci-6.c
deleted file mode 100644
index f5aa3f8bfa60ae86b9d918be90d848ff042cb5e6..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-6.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  c[0] = a[0] + b[0];
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-7.c b/20201203/fibonacci-7.c
deleted file mode 100644
index 05e8e9edaf2ac10512ecd2ef9d703c3f0a8a46ed..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-7.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  c[0] = a[0] + b[0];
-  for (int i = 1; i < DIGITS; i++)
-    c[i] = 0;
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-8.c b/20201203/fibonacci-8.c
deleted file mode 100644
index e76226b5f351a551fea7888081491c6f2aa70d6f..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-8.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  char carry;
-  c[0] = a[0] + b[0];
-  if (c[0] > 9)
-    {
-      carry = 1;
-      c[0] -= 10;
-    }
-  else
-    carry = 0;
-  c[1] = a[1] + b[1] + carry;
-  if (c[0] > 9)
-    {
-      carry = 1;
-      c[1] -= 10;
-    }
-  else
-    carry = 0;
-  c[2] = a[2] + b[2] + carry;
-  if (c[2] > 9)
-    {
-      carry = 1;
-      c[2] -= 10;
-    }
-  else
-    carry = 0;
-  for (int i = 3; i < DIGITS; i++)
-    c[i] = 0;
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/fibonacci-9.c b/20201203/fibonacci-9.c
deleted file mode 100644
index b73982f7195cbc00377caff254920744826e054f..0000000000000000000000000000000000000000
--- a/20201203/fibonacci-9.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <stdio.h>
-
-#define DIGITS 42
-
-typedef char number[DIGITS];
-
-void add (char *a, char *b, char *c)
-{
-  char carry = 0;
-  for (int i = 0; i < DIGITS; i++)
-    {
-      c[i] = a[i] + b[i] + carry;
-      if (c[i] > 9)
-        {
-          carry = 1;
-          c[i] -= 10;
-        }
-      else
-        carry = 0;
-    }
-}
-
-void copy (char *a, char *b)
-{
-  for (int i = 0; i < DIGITS; i++)
-    b[i] = a[i];
-}
-
-void print (char *a)
-{
-  int i = DIGITS - 1;
-  while (i > 0 && a[i] == 0)
-    i--;
-  while (i >= 0)
-    {
-      printf ("%d", a[i]);
-      i--;
-    }
-}
-
-int main (void)
-{
-  number f0 = { 0 };
-  number f1 = { 1 };
-  for (int i = 0; i < 50; i++)
-    {
-      printf ("f[%d] = ", i);
-      print (f0);
-      printf ("\n");
-      number f2;
-      add (f0, f1, f2);
-      copy (f1, f0);
-      copy (f2, f1);
-    }
-  return 0;
-}
diff --git a/20201203/functions-1.c b/20201203/functions-1.c
deleted file mode 100644
index 306c83a358fa5cae65e0fde2c2a5aecbbdab17a0..0000000000000000000000000000000000000000
--- a/20201203/functions-1.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-void print (x)
-  int x;
-{
-  printf ("%d\n", x);
-}
-
-int main (void)
-{
-  print (42);
-  return 0;
-}
diff --git a/20201203/functions-2.c b/20201203/functions-2.c
deleted file mode 100644
index 135f7b3dd22e34a71fdfbc9b1f2cb971fda1f2f7..0000000000000000000000000000000000000000
--- a/20201203/functions-2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-void print (x)
-  int x;
-{
-  printf ("%d\n", x);
-}
-
-int main (void)
-{
-  print ("42");
-  return 0;
-}
diff --git a/20201203/functions-3.c b/20201203/functions-3.c
deleted file mode 100644
index 0522e8744ee5d3fe18f7acaaa192e2e052fed81b..0000000000000000000000000000000000000000
--- a/20201203/functions-3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-void print (x)
-  int x;
-{
-  printf ("%d\n", x);
-}
-
-int main (void)
-{
-  print (atoi ("42"));
-  return 0;
-}
diff --git a/20201203/functions-4.c b/20201203/functions-4.c
deleted file mode 100644
index af1d7f7407daebed1373459b8e9a2dd0811f49de..0000000000000000000000000000000000000000
--- a/20201203/functions-4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-
-void print (int x)
-{
-  printf ("%d\n", x);
-}
-
-int main (void)
-{
-  print ("42");
-  return 0;
-}
diff --git a/20201203/hp-20201203.pdf b/20201203/hp-20201203.pdf
deleted file mode 100644
index f9e869fd8789e1bc161d0f82273adc086f41f242..0000000000000000000000000000000000000000
Binary files a/20201203/hp-20201203.pdf and /dev/null differ
diff --git a/20201203/hp-20201203.tex b/20201203/hp-20201203.tex
deleted file mode 100644
index 7e6f6ed9848e6524864e2e4d79b0ba66ec653ded..0000000000000000000000000000000000000000
--- a/20201203/hp-20201203.tex
+++ /dev/null
@@ -1,1788 +0,0 @@
-% hp-20201203.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: Parameter des Hauptprogramms, String-Operationen
-
-\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{3.\ Dezember 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}
-      \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<1->{ und deren Nachbarn}.
-
-%  \bigskip
-%  \pause
-%  \pause
-
-  \begin{onlyenv}<1>
-    \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}<2>
-    \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}<3>
-    \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}<4>
-    \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}<5>
-    \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}<6->
-    \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<1->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen.
-%      \pause
-%      \pause
-      \item
-        \only<1-2>{\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<1->{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>
-    \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}<2>
-    \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}<3>
-    \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}<4>
-    \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}<5>
-%    \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{-2.5cm}\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<1->{,\\
-        also ein Zeiger auf \lstinline{char}s}\only<1->{\\
-        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}?
-      \begin{lstlisting}[gobble=8]
-        printf ("%d\n", '*');
-        printf ("%c\n", 71);
-      \end{lstlisting}
-    \medskip
-    \item
-      Ist \lstinline{char ch} ein Großbuchstabe?
-      \begin{lstlisting}[gobble=8]
-        if (ch >= 'A' && ch <= 'Z')
-          ...
-      \end{lstlisting}
-    \smallskip
-    \item
-      Groß- in Kleinbuchstaben umwandeln
-      \begin{lstlisting}[gobble=8]
-        ch += 'a' - 'A';
-      \end{lstlisting}
-  \end{itemize}
-  \vspace*{-1cm}
-\end{frame}
-
-\subsection{Strukturen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      int main (void)
-      {
-        date today = { 3, 12, 2020 };
-        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 = 3;
-        (*d).month = 12;
-        (*d).year = 2020;
-      }¿
-    \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 = 3;
-        d->month = 12;
-        d->year = 2020;
-      }¿
-    \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
-
-  \vspace*{-0.4cm}
-  \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
-
-  \vspace*{-0.4cm}
-  \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}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \vspace*{-0.4cm}
-  \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}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \vspace*{-0.4cm}
-  \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*{-3cm}
-      \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*{-2cm}
-      \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}
-      \begin{onlyenv}<5>
-        \begin{picture}(0,0)(0.3,0.3)
-          \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{onlyenv}
-    \pause
-    \pause
-    \item
-      Auf manchen Plattformen kommt es auf die Reihenfolge an:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -O $(pkg-config --cflags) \
-               hello-gtk.c $(pkg-config --libs) \
-               -o hello-gtk¿
-      \end{lstlisting}
-      (Backslash = "`Es geht in der nächsten Zeile weiter."')
-  \end{itemize}
-
-\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)(-0.07,0.2)
-    \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)(-0.07,0.2)
-    \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}
-
-\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}
-
-\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}
-
-\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}
-
-  \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}
-
-\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}
-
-\fi
-
-\end{document}
diff --git a/20201203/hp-musterloesung-20201203.pdf b/20201203/hp-musterloesung-20201203.pdf
deleted file mode 100644
index b4e1a8c2a0acc02a5385f0053cecc5810c168bc9..0000000000000000000000000000000000000000
Binary files a/20201203/hp-musterloesung-20201203.pdf and /dev/null differ
diff --git a/20201203/hp-musterloesung-20201203.tex b/20201203/hp-musterloesung-20201203.tex
deleted file mode 100644
index b2208917afca84821c8020490e76241a781c8323..0000000000000000000000000000000000000000
--- a/20201203/hp-musterloesung-20201203.tex
+++ /dev/null
@@ -1,212 +0,0 @@
-% hp-musterloesung-20201203.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: Arrays mit Zahlen, Datum-Bibliothek
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 3.\ Dezember 2020}
-
-  \exercise{Arrays mit Zahlen}
-
-  \begin{minipage}[t]{0.4\textwidth}
-    Wir betrachten das folgende Programm\\
-    (Datei: \gitfile{hp}{2020ws/20201203}{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}{2020ws/20201203}{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}{2020ws/20201203}{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}{2020ws/20201203}{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-2020ws.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/20201203/hp-uebung-20201203.pdf b/20201203/hp-uebung-20201203.pdf
deleted file mode 100644
index f6a2d288e3db1714dcfa52b366e0dda929cafe80..0000000000000000000000000000000000000000
Binary files a/20201203/hp-uebung-20201203.pdf and /dev/null differ
diff --git a/20201203/hp-uebung-20201203.tex b/20201203/hp-uebung-20201203.tex
deleted file mode 100644
index f1b3659cd4ec6e8beb192a2a199e400d4870be07..0000000000000000000000000000000000000000
--- a/20201203/hp-uebung-20201203.tex
+++ /dev/null
@@ -1,152 +0,0 @@
-% hp-uebung-20201203.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: Arrays mit Zahlen, Datum-Bibliothek
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\thispagestyle{empty}
-
-\begin{document}
-
-  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 3.\ Dezember 2020}
-
-  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}{2020ws/20201203}{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}{2020ws/20201203}{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/20201203/integers-1.c b/20201203/integers-1.c
deleted file mode 100644
index 60a31e32ec67a7ec20672fec06578f2af4e2d7bd..0000000000000000000000000000000000000000
--- a/20201203/integers-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 42;
-  int b = 137;
-  printf ("%d\n", a + b);
-  return 0;
-}
diff --git a/20201203/integers-2.c b/20201203/integers-2.c
deleted file mode 100644
index c90e0174b5336da4b10508bd88c1984d2e98f394..0000000000000000000000000000000000000000
--- a/20201203/integers-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  int a = 1500000000;
-  int b = 1500000000;
-  printf ("%d\n", a + b);
-  return 0;
-}
diff --git a/20201203/integers-2.s b/20201203/integers-2.s
deleted file mode 100644
index 28aa51f20b321095c66e3bfe9dc645f768be739e..0000000000000000000000000000000000000000
--- a/20201203/integers-2.s
+++ /dev/null
@@ -1,26 +0,0 @@
-	.file	"integers-2.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	movl	$-1294967296, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201203/loesung-2.c b/20201203/loesung-2.c
deleted file mode 100644
index 151c965980df79b5d0e04188f7bf6ac7a3b836a9..0000000000000000000000000000000000000000
--- a/20201203/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/20201203/logo-hochschule-bochum-cvh-text-v2.pdf b/20201203/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201203/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/20201203/logo-hochschule-bochum.pdf b/20201203/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201203/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201203/main-params-1.c b/20201203/main-params-1.c
deleted file mode 100644
index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000
--- a/20201203/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/20201203/main-params-10.c b/20201203/main-params-10.c
deleted file mode 100644
index 01909d2df3074e1ba1be80a7bb9a7815fffb6b62..0000000000000000000000000000000000000000
--- a/20201203/main-params-10.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (char **y, int x)
-{
-  printf ("x = %d\n", x);
-  int i = 0;
-  char **s = y;
-  while (*s)
-    printf ("y[%d] = \"%s\"\n", i++, *s++);
-  return 0;
-}
diff --git a/20201203/main-params-2.c b/20201203/main-params-2.c
deleted file mode 100644
index 242aa8abb5f3af0ea60aeba94edb978388ea4c4d..0000000000000000000000000000000000000000
--- a/20201203/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]; i++)
-    printf ("argv[%d] = \"%s\"\n", i, argv[i]);
-  return 0;
-}
diff --git a/20201203/main-params-3.c b/20201203/main-params-3.c
deleted file mode 100644
index 78d0e6aebb012d6401a0f44497d66a85be32dc0b..0000000000000000000000000000000000000000
--- a/20201203/main-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 **s argv; *s; s++)
-    printf ("argv[%d] = \"%s\"\n", i, *s);
-  return 0;
-}
diff --git a/20201203/main-params-4.c b/20201203/main-params-4.c
deleted file mode 100644
index 9b68f005f9eb7b8da9fae0783ae36831051732ad..0000000000000000000000000000000000000000
--- a/20201203/main-params-4.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  int i = 0;
-  for (char **s = argv; *s; s++)
-    printf ("argv[%d] = \"%s\"\n", i, *s);
-  return 0;
-}
diff --git a/20201203/main-params-5.c b/20201203/main-params-5.c
deleted file mode 100644
index f2e68bc84bf46b3d62774e6f768e2c8bcab3a01b..0000000000000000000000000000000000000000
--- a/20201203/main-params-5.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (int argc, char **argv)
-{
-  printf ("argc = %d\n", argc);
-  int i = 0;
-  char **s = argv;
-  while (*s)
-    printf ("argv[%d] = \"%s\"\n", i++, *s++);
-  return 0;
-}
diff --git a/20201203/main-params-6.c b/20201203/main-params-6.c
deleted file mode 100644
index 9555a8f5207b63c81d2a2a212aee3594fb400aab..0000000000000000000000000000000000000000
--- a/20201203/main-params-6.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-int main (int x, char **y)
-{
-  printf ("x = %d\n", x);
-  int i = 0;
-  char **s = y;
-  while (*s)
-    printf ("y[%d] = \"%s\"\n", i++, *s++);
-  return 0;
-}
diff --git a/20201203/main-params-7.c b/20201203/main-params-7.c
deleted file mode 100644
index 0ab2c3061f17634df91f75d7cbbed80e655e8b99..0000000000000000000000000000000000000000
--- a/20201203/main-params-7.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (int x)
-{
-  printf ("x = %d\n", x);
-  return 0;
-}
diff --git a/20201203/main-params-8.c b/20201203/main-params-8.c
deleted file mode 100644
index b5dd4e21346d723f4a535b88f4c523153b0dd0fa..0000000000000000000000000000000000000000
--- a/20201203/main-params-8.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (int x, char **y)
-{
-  printf ("x = %d\n", x);
-  return 0;
-}
diff --git a/20201203/main-params-9.c b/20201203/main-params-9.c
deleted file mode 100644
index d742f43eb354c75e23ced8d86e5e6a60c6a97d1a..0000000000000000000000000000000000000000
--- a/20201203/main-params-9.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (int x, char **)
-{
-  printf ("x = %d\n", x);
-  return 0;
-}
diff --git a/20201203/main-params-link b/20201203/main-params-link
deleted file mode 120000
index 05db77323d41949eaf431b8d4e6adc1920e28a90..0000000000000000000000000000000000000000
--- a/20201203/main-params-link
+++ /dev/null
@@ -1 +0,0 @@
-main-params-1
\ No newline at end of file
diff --git a/20201203/pgscript.sty b/20201203/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201203/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201203/pgslides.sty b/20201203/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201203/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201203/setup-loop-1.c b/20201203/setup-loop-1.c
deleted file mode 100644
index 60589366d54356fee895299ccfc9dfd354103790..0000000000000000000000000000000000000000
--- a/20201203/setup-loop-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-void setup (void)
-{
-  printf ("Arduino wird initialisiert.\n");
-}
-
-void loop (void)
-{
-  printf ("Arduino läuft.\n");
-}
-
-int main (void)
-{
-  return 0;
-}
diff --git a/20201203/setup-loop-2.c b/20201203/setup-loop-2.c
deleted file mode 100644
index f3689d0eb46a77745d1f0d5bb0d4cbc5e4f70453..0000000000000000000000000000000000000000
--- a/20201203/setup-loop-2.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-
-void setup (void)
-{
-  printf ("Arduino wird initialisiert.\n");
-}
-
-void loop (void)
-{
-  printf ("Arduino läuft.\n");
-}
-
-int main (void)
-{
-  setup ();
-  while (1)
-    loop ();
-  return 0;
-}
diff --git a/20201203/spaces-1.txt b/20201203/spaces-1.txt
deleted file mode 100644
index f2d1ba4e270e93cf6765ae84fa9267b2d55c57d1..0000000000000000000000000000000000000000
--- a/20201203/spaces-1.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 a b " " c
-x = 5
-y[0] = "./main-params-6"
-y[1] = "a"
-y[2] = "b"
-y[3] = " "
-y[4] = "c"
-cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 Dies\ ist ein\ Test
-x = 3
-y[0] = "./main-params-6"
-y[1] = "Dies ist"
-y[2] = "ein Test"
-cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 "Dies ist" "ein Test"
-x = 3
-y[0] = "./main-params-6"
-y[1] = "Dies ist"
-y[2] = "ein Test"
-cassini/home/peter/bo/2020ws/hp/20201203>
diff --git a/20201203/string-operations-1.c b/20201203/string-operations-1.c
deleted file mode 100644
index 92163074ea985f03c6611b60ac033a212925aa47..0000000000000000000000000000000000000000
--- a/20201203/string-operations-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/20201203/string-operations-10.c b/20201203/string-operations-10.c
deleted file mode 100644
index ff4e43799c4546102a9b9e31bac29228a43b7c7e..0000000000000000000000000000000000000000
--- a/20201203/string-operations-10.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *zacharias = "Zacharias";
-  char *anton = "Anton";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  char anton1[] = "Anton";
-  char anton2[] = "Anton";
-
-  if (anton1 < anton2)   /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */
-    printf ("%d\n", -1);
-  else if (anton1 > anton2)
-    printf ("%d\n", 1);
-  else
-    printf ("%d\n", 0);
-  printf ("%d\n", strcmp (anton1, anton2));
-
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20201203/string-operations-11.c b/20201203/string-operations-11.c
deleted file mode 100644
index 7966ffe8a9c2a2545d69c8e0351c46dff6a44c7f..0000000000000000000000000000000000000000
--- a/20201203/string-operations-11.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/20201203/string-operations-12.c b/20201203/string-operations-12.c
deleted file mode 100644
index c95d341a5fda4da887f664a8d65a62a75623f0be..0000000000000000000000000000000000000000
--- a/20201203/string-operations-12.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[6] = "Huber ";  /* Kein Platz für das Null-Symbol --> String ohne Null-Symbol! */
-  strcat (buffer, anton);     /* Pufferüberlauf */
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20201203/string-operations-13.c b/20201203/string-operations-13.c
deleted file mode 100644
index 0d14e9196c604198cdf382237c8cd1262f3bfdfb..0000000000000000000000000000000000000000
--- a/20201203/string-operations-13.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[] = "Huber ";
-  strcat (buffer, anton);     /* Pufferüberlauf */
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20201203/string-operations-14.c b/20201203/string-operations-14.c
deleted file mode 100644
index e867f6a0d069a7980100d7185f60e780fd1c8d51..0000000000000000000000000000000000000000
--- a/20201203/string-operations-14.c
+++ /dev/null
@@ -1,21 +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 ";
-  for (int i = 0; i < 5; i++)
-    strcat (buffer, anton);     /* Pufferüberlauf */
-  printf ("%s\n", buffer);
-
-  return 0;
-}
diff --git a/20201203/string-operations-15.c b/20201203/string-operations-15.c
deleted file mode 100644
index a7c37b16a1ff44e2d54ea4a6f81f3f0cc58a6236..0000000000000000000000000000000000000000
--- a/20201203/string-operations-15.c
+++ /dev/null
@@ -1,21 +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 ";
-  for (int i = 0; i < 5; i++)
-    strncat (buffer, anton, 100);  /* Ebenfalls Puffer-überlauf, da sich die 100 auf die */
-  printf ("%s\n", buffer);         /* maximale Länge von "anton" bezieht.                */
-
-  return 0;
-}
diff --git a/20201203/string-operations-16.c b/20201203/string-operations-16.c
deleted file mode 100644
index 8101ccfc1de8242f1155164746688f9163b5a338..0000000000000000000000000000000000000000
--- a/20201203/string-operations-16.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/20201203/string-operations-17.c b/20201203/string-operations-17.c
deleted file mode 100644
index efaddc2869a0ae7be93ec383d7925f5796cfe5a9..0000000000000000000000000000000000000000
--- a/20201203/string-operations-17.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[10] = "";
-  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/20201203/string-operations-18.c b/20201203/string-operations-18.c
deleted file mode 100644
index 5ccb1083403a0be3f9d46cd58f5d3b5e89612210..0000000000000000000000000000000000000000
--- a/20201203/string-operations-18.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char buffer[10] = "";
-  snprintf (buffer, 10, "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/20201203/string-operations-19.c b/20201203/string-operations-19.c
deleted file mode 100644
index e1c1e84fba7eade92c2a0c818104de31b24c5f61..0000000000000000000000000000000000000000
--- a/20201203/string-operations-19.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/20201203/string-operations-2.c b/20201203/string-operations-2.c
deleted file mode 100644
index dbeea54f286116d282611b914f61f6e42f5899b9..0000000000000000000000000000000000000000
--- a/20201203/string-operations-2.c
+++ /dev/null
@@ -1,23 +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/20201203/string-operations-3.c b/20201203/string-operations-3.c
deleted file mode 100644
index 2f1b5349cafe5796c721ffcd1f573d342a8cffc5..0000000000000000000000000000000000000000
--- a/20201203/string-operations-3.c
+++ /dev/null
@@ -1,23 +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 + 16);
-  printf ("%zd\n", strlen (hello + 16));
-
-/*
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-*/
-
-  return 0;
-}
diff --git a/20201203/string-operations-4.c b/20201203/string-operations-4.c
deleted file mode 100644
index dee5c1d23f8ac24fa91725e05af62b0b79dc0c9b..0000000000000000000000000000000000000000
--- a/20201203/string-operations-4.c
+++ /dev/null
@@ -1,23 +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 + 16000000);
-  printf ("%zd\n", strlen (hello + 16000000));
-
-/*
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-*/
-
-  return 0;
-}
diff --git a/20201203/string-operations-5.c b/20201203/string-operations-5.c
deleted file mode 100644
index 2d15ca233f94e1aa63cf17d8a6906391f3b64017..0000000000000000000000000000000000000000
--- a/20201203/string-operations-5.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 + 16000000);
-  printf ("%zd\n", strlen (hello + 16000000));
-*/
-
-  hello[5] = 0;
-  printf ("%s\n", hello);
-  printf ("%zd\n", strlen (hello));
-
-  return 0;
-}
diff --git a/20201203/string-operations-6.c b/20201203/string-operations-6.c
deleted file mode 100644
index 95e826860f223ebd5f3819c56934eedadcd3d0d4..0000000000000000000000000000000000000000
--- a/20201203/string-operations-6.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/20201203/string-operations-7.c b/20201203/string-operations-7.c
deleted file mode 100644
index f668bc669252fa8f694295d155435022da938db0..0000000000000000000000000000000000000000
--- a/20201203/string-operations-7.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/20201203/string-operations-8.c b/20201203/string-operations-8.c
deleted file mode 100644
index f4d4f74f865912424930f354ea83eaf29e62f458..0000000000000000000000000000000000000000
--- a/20201203/string-operations-8.c
+++ /dev/null
@@ -1,27 +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 < zacharias)   /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */
-    printf ("%d\n", -1);
-  else if (anton > zacharias)
-    printf ("%d\n", 1);
-  else
-    printf ("%d\n", 0);
-
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20201203/string-operations-8.s b/20201203/string-operations-8.s
deleted file mode 100644
index e5e78f9cba272c4c47b1217ef891a144fbf8c4a9..0000000000000000000000000000000000000000
--- a/20201203/string-operations-8.s
+++ /dev/null
@@ -1,65 +0,0 @@
-	.file	"string-operations-8.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-.LC1:
-	.string	"Anton"
-.LC2:
-	.string	"Zacharias"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	movl	$-1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	leaq	.LC1(%rip), %rdx
-	leaq	.LC2(%rip), %rax
-	cmpq	%rax, %rdx
-	jb	.L6
-	leaq	.LC1(%rip), %rdx
-	leaq	.LC2(%rip), %rax
-	cmpq	%rax, %rdx
-	jbe	.L4
-	movl	$1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-.L3:
-	movl	$0, %eax
-	addq	$8, %rsp
-	.cfi_remember_state
-	.cfi_def_cfa_offset 8
-	ret
-.L6:
-	.cfi_restore_state
-	movl	$-1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	jmp	.L3
-.L4:
-	movl	$0, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	jmp	.L3
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201203/string-operations-9.c b/20201203/string-operations-9.c
deleted file mode 100644
index 74802a1e370dafff8f40712fa623c28d4853dd66..0000000000000000000000000000000000000000
--- a/20201203/string-operations-9.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-int main (void)
-{
-  char *zacharias = "Zacharias";
-  char *anton = "Anton";
-
-  printf ("%d\n", strcmp (anton, zacharias));
-  printf ("%d\n", strcmp (zacharias, anton));
-  printf ("%d\n", strcmp (anton, anton));
-
-  if (anton < zacharias)   /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */
-    printf ("%d\n", -1);
-  else if (anton > zacharias)
-    printf ("%d\n", 1);
-  else
-    printf ("%d\n", 0);
-
-/*
-  char buffer[100] = "Huber ";
-  strcat (buffer, anton);
-  printf ("%s\n", buffer);
-*/
-
-  return 0;
-}
diff --git a/20201203/string-operations-9.s b/20201203/string-operations-9.s
deleted file mode 100644
index 09a5ead8fb0c2e535840d6effd0fc34ebd8fb8d2..0000000000000000000000000000000000000000
--- a/20201203/string-operations-9.s
+++ /dev/null
@@ -1,65 +0,0 @@
-	.file	"string-operations-9.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-.LC1:
-	.string	"Anton"
-.LC2:
-	.string	"Zacharias"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16
-	movl	$-1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	movl	$0, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	leaq	.LC1(%rip), %rdx
-	leaq	.LC2(%rip), %rax
-	cmpq	%rax, %rdx
-	jb	.L6
-	leaq	.LC1(%rip), %rdx
-	leaq	.LC2(%rip), %rax
-	cmpq	%rax, %rdx
-	jbe	.L4
-	movl	$1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-.L3:
-	movl	$0, %eax
-	addq	$8, %rsp
-	.cfi_remember_state
-	.cfi_def_cfa_offset 8
-	ret
-.L6:
-	.cfi_restore_state
-	movl	$-1, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	jmp	.L3
-.L4:
-	movl	$0, %esi
-	leaq	.LC0(%rip), %rdi
-	movl	$0, %eax
-	call	printf@PLT
-	jmp	.L3
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20201203/strings-1.c b/20201203/strings-1.c
deleted file mode 100644
index 396e2c16fb8695f38c95b40e947a83975c0ccd84..0000000000000000000000000000000000000000
--- a/20201203/strings-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Es heißt: \"Hello, world!\"\n");
-  return 0;
-}
diff --git a/20201203/strings-2.c b/20201203/strings-2.c
deleted file mode 100644
index 5cbeb48d81fc636b126b900209324843c46ae5e9..0000000000000000000000000000000000000000
--- a/20201203/strings-2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Es heißt: %cHello, world!%c\n", 34, 34);
-  return 0;
-}
diff --git a/20201203/strings-3.c b/20201203/strings-3.c
deleted file mode 100644
index 4d1d3bd31762299b8dbc171abc47535e6fe202bc..0000000000000000000000000000000000000000
--- a/20201203/strings-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Es heißt: "Hello, world!"\n", 34, 34);
-  return 0;
-}
diff --git a/20201210/answer.c b/20201210/answer.c
deleted file mode 100644
index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000
--- a/20201210/answer.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "answer.h"
-
-int answer (void)
-{
-  return 23;
-}
diff --git a/20201210/answer.h b/20201210/answer.h
deleted file mode 100644
index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000
--- a/20201210/answer.h
+++ /dev/null
@@ -1 +0,0 @@
-extern int answer (void);
diff --git a/20201210/aufgabe-2.c b/20201210/aufgabe-2.c
deleted file mode 100644
index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/aufgabe-3.c b/20201210/aufgabe-3.c
deleted file mode 100644
index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-1.c b/20201210/gtk-1.c
deleted file mode 100644
index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-2.c b/20201210/gtk-2.c
deleted file mode 100644
index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-3.c b/20201210/gtk-3.c
deleted file mode 100644
index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-3a.c b/20201210/gtk-3a.c
deleted file mode 100644
index a414b65cdf090099634b72b17f1ccde78ec86bcb..0000000000000000000000000000000000000000
--- a/20201210/gtk-3a.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <gtk/gtk.h>
-
-GtkWidget *button;
-
-void hide_button (void)
-{
-  gtk_widget_hide (button);
-}
-
-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);
-  button = gtk_button_new_with_label ("Quit");
-  g_signal_connect (button, "clicked", G_CALLBACK (hide_button), NULL);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20201210/gtk-3b.c b/20201210/gtk-3b.c
deleted file mode 100644
index c9e5aa19ca26ba5d2f2d490e21176353fd83000f..0000000000000000000000000000000000000000
--- a/20201210/gtk-3b.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <gtk/gtk.h>
-
-void hide_button (GtkWidget *button)
-{
-  gtk_widget_hide (button);
-}
-
-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 (hide_button), button);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20201210/gtk-3c.c b/20201210/gtk-3c.c
deleted file mode 100644
index 0c00089967a5575987cd04c89668d8fc6c02bec1..0000000000000000000000000000000000000000
--- a/20201210/gtk-3c.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_widget_hide), button);
-  gtk_container_add (GTK_CONTAINER (window), button);
-  gtk_widget_show (button);
-  gtk_widget_show (window);
-  gtk_main ();
-  return 0;
-}
diff --git a/20201210/gtk-4.c b/20201210/gtk-4.c
deleted file mode 100644
index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-5.c b/20201210/gtk-5.c
deleted file mode 100644
index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-5a.c b/20201210/gtk-5a.c
deleted file mode 100644
index 5386a44255235d40bae6be87c0c9251a8c766fb6..0000000000000000000000000000000000000000
--- a/20201210/gtk-5a.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/20201210/gtk-6.c b/20201210/gtk-6.c
deleted file mode 100644
index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-7.c b/20201210/gtk-7.c
deleted file mode 100644
index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/gtk-8.c b/20201210/gtk-8.c
deleted file mode 100644
index 80e5747c13d94699d4883018a5b2457fed9885cb..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/hello-1.E b/20201210/hello-1.E
deleted file mode 100644
index bba2a7fe853f3ead309fa27d02789911adacb2a1..0000000000000000000000000000000000000000
--- a/20201210/hello-1.E
+++ /dev/null
@@ -1,815 +0,0 @@
-# 1 "hello-1.c"
-# 1 "<built-in>"
-# 1 "<command-line>"
-# 31 "<command-line>"
-# 1 "/usr/include/stdc-predef.h" 1 3 4
-# 32 "<command-line>" 2
-# 1 "hello-1.c"
-# 1 "/usr/include/stdio.h" 1 3 4
-# 27 "/usr/include/stdio.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4
-# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4
-# 1 "/usr/include/features.h" 1 3 4
-# 424 "/usr/include/features.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
-# 442 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
-# 443 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/long-double.h" 1 3 4
-# 444 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
-# 425 "/usr/include/features.h" 2 3 4
-# 448 "/usr/include/features.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
-# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
-# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
-# 449 "/usr/include/features.h" 2 3 4
-# 34 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 2 3 4
-# 28 "/usr/include/stdio.h" 2 3 4
-
-
-
-
-
-# 1 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 1 3 4
-# 216 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 3 4
-
-# 216 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 3 4
-typedef long unsigned int size_t;
-# 34 "/usr/include/stdio.h" 2 3 4
-
-
-# 1 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h" 1 3 4
-# 40 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h" 3 4
-typedef __builtin_va_list __gnuc_va_list;
-# 37 "/usr/include/stdio.h" 2 3 4
-
-# 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 4
-# 27 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
-# 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
-
-
-typedef unsigned char __u_char;
-typedef unsigned short int __u_short;
-typedef unsigned int __u_int;
-typedef unsigned long int __u_long;
-
-
-typedef signed char __int8_t;
-typedef unsigned char __uint8_t;
-typedef signed short int __int16_t;
-typedef unsigned short int __uint16_t;
-typedef signed int __int32_t;
-typedef unsigned int __uint32_t;
-
-typedef signed long int __int64_t;
-typedef unsigned long int __uint64_t;
-
-
-
-
-
-
-typedef __int8_t __int_least8_t;
-typedef __uint8_t __uint_least8_t;
-typedef __int16_t __int_least16_t;
-typedef __uint16_t __uint_least16_t;
-typedef __int32_t __int_least32_t;
-typedef __uint32_t __uint_least32_t;
-typedef __int64_t __int_least64_t;
-typedef __uint64_t __uint_least64_t;
-
-
-
-typedef long int __quad_t;
-typedef unsigned long int __u_quad_t;
-
-
-
-
-
-
-
-typedef long int __intmax_t;
-typedef unsigned long int __uintmax_t;
-# 140 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/typesizes.h" 1 3 4
-# 141 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
-
-
-typedef unsigned long int __dev_t;
-typedef unsigned int __uid_t;
-typedef unsigned int __gid_t;
-typedef unsigned long int __ino_t;
-typedef unsigned long int __ino64_t;
-typedef unsigned int __mode_t;
-typedef unsigned long int __nlink_t;
-typedef long int __off_t;
-typedef long int __off64_t;
-typedef int __pid_t;
-typedef struct { int __val[2]; } __fsid_t;
-typedef long int __clock_t;
-typedef unsigned long int __rlim_t;
-typedef unsigned long int __rlim64_t;
-typedef unsigned int __id_t;
-typedef long int __time_t;
-typedef unsigned int __useconds_t;
-typedef long int __suseconds_t;
-
-typedef int __daddr_t;
-typedef int __key_t;
-
-
-typedef int __clockid_t;
-
-
-typedef void * __timer_t;
-
-
-typedef long int __blksize_t;
-
-
-
-
-typedef long int __blkcnt_t;
-typedef long int __blkcnt64_t;
-
-
-typedef unsigned long int __fsblkcnt_t;
-typedef unsigned long int __fsblkcnt64_t;
-
-
-typedef unsigned long int __fsfilcnt_t;
-typedef unsigned long int __fsfilcnt64_t;
-
-
-typedef long int __fsword_t;
-
-typedef long int __ssize_t;
-
-
-typedef long int __syscall_slong_t;
-
-typedef unsigned long int __syscall_ulong_t;
-
-
-
-typedef __off64_t __loff_t;
-typedef char *__caddr_t;
-
-
-typedef long int __intptr_t;
-
-
-typedef unsigned int __socklen_t;
-
-
-
-
-typedef int __sig_atomic_t;
-# 39 "/usr/include/stdio.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h" 1 3 4
-
-
-
-
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h" 1 3 4
-# 13 "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h" 3 4
-typedef struct
-{
-  int __count;
-  union
-  {
-    unsigned int __wch;
-    char __wchb[4];
-  } __value;
-} __mbstate_t;
-# 6 "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h" 2 3 4
-
-
-
-
-typedef struct _G_fpos_t
-{
-  __off_t __pos;
-  __mbstate_t __state;
-} __fpos_t;
-# 40 "/usr/include/stdio.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h" 1 3 4
-# 10 "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h" 3 4
-typedef struct _G_fpos64_t
-{
-  __off64_t __pos;
-  __mbstate_t __state;
-} __fpos64_t;
-# 41 "/usr/include/stdio.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/__FILE.h" 1 3 4
-
-
-
-struct _IO_FILE;
-typedef struct _IO_FILE __FILE;
-# 42 "/usr/include/stdio.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/FILE.h" 1 3 4
-
-
-
-struct _IO_FILE;
-
-
-typedef struct _IO_FILE FILE;
-# 43 "/usr/include/stdio.h" 2 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h" 1 3 4
-# 35 "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h" 3 4
-struct _IO_FILE;
-struct _IO_marker;
-struct _IO_codecvt;
-struct _IO_wide_data;
-
-
-
-
-typedef void _IO_lock_t;
-
-
-
-
-
-struct _IO_FILE
-{
-  int _flags;
-
-
-  char *_IO_read_ptr;
-  char *_IO_read_end;
-  char *_IO_read_base;
-  char *_IO_write_base;
-  char *_IO_write_ptr;
-  char *_IO_write_end;
-  char *_IO_buf_base;
-  char *_IO_buf_end;
-
-
-  char *_IO_save_base;
-  char *_IO_backup_base;
-  char *_IO_save_end;
-
-  struct _IO_marker *_markers;
-
-  struct _IO_FILE *_chain;
-
-  int _fileno;
-  int _flags2;
-  __off_t _old_offset;
-
-
-  unsigned short _cur_column;
-  signed char _vtable_offset;
-  char _shortbuf[1];
-
-  _IO_lock_t *_lock;
-
-
-
-
-
-
-
-  __off64_t _offset;
-
-  struct _IO_codecvt *_codecvt;
-  struct _IO_wide_data *_wide_data;
-  struct _IO_FILE *_freeres_list;
-  void *_freeres_buf;
-  size_t __pad5;
-  int _mode;
-
-  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
-};
-# 44 "/usr/include/stdio.h" 2 3 4
-# 52 "/usr/include/stdio.h" 3 4
-typedef __gnuc_va_list va_list;
-# 63 "/usr/include/stdio.h" 3 4
-typedef __off_t off_t;
-# 77 "/usr/include/stdio.h" 3 4
-typedef __ssize_t ssize_t;
-
-
-
-
-
-
-typedef __fpos_t fpos_t;
-# 133 "/usr/include/stdio.h" 3 4
-# 1 "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h" 1 3 4
-# 134 "/usr/include/stdio.h" 2 3 4
-
-
-
-extern FILE *stdin;
-extern FILE *stdout;
-extern FILE *stderr;
-
-
-
-
-
-
-extern int remove (const char *__filename) __attribute__ ((__nothrow__ , __leaf__));
-
-extern int rename (const char *__old, const char *__new) __attribute__ ((__nothrow__ , __leaf__));
-
-
-
-extern int renameat (int __oldfd, const char *__old, int __newfd,
-       const char *__new) __attribute__ ((__nothrow__ , __leaf__));
-# 173 "/usr/include/stdio.h" 3 4
-extern FILE *tmpfile (void) ;
-# 187 "/usr/include/stdio.h" 3 4
-extern char *tmpnam (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-
-extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
-# 204 "/usr/include/stdio.h" 3 4
-extern char *tempnam (const char *__dir, const char *__pfx)
-     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
-
-
-
-
-
-
-
-extern int fclose (FILE *__stream);
-
-
-
-
-extern int fflush (FILE *__stream);
-# 227 "/usr/include/stdio.h" 3 4
-extern int fflush_unlocked (FILE *__stream);
-# 246 "/usr/include/stdio.h" 3 4
-extern FILE *fopen (const char *__restrict __filename,
-      const char *__restrict __modes) ;
-
-
-
-
-extern FILE *freopen (const char *__restrict __filename,
-        const char *__restrict __modes,
-        FILE *__restrict __stream) ;
-# 279 "/usr/include/stdio.h" 3 4
-extern FILE *fdopen (int __fd, const char *__modes) __attribute__ ((__nothrow__ , __leaf__)) ;
-# 292 "/usr/include/stdio.h" 3 4
-extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
-  __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-
-extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-
-
-extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));
-
-
-
-extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
-      int __modes, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
-
-
-
-
-extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
-         size_t __size) __attribute__ ((__nothrow__ , __leaf__));
-
-
-extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
-
-
-
-
-
-
-
-extern int fprintf (FILE *__restrict __stream,
-      const char *__restrict __format, ...);
-
-
-
-
-extern int printf (const char *__restrict __format, ...);
-
-extern int sprintf (char *__restrict __s,
-      const char *__restrict __format, ...) __attribute__ ((__nothrow__));
-
-
-
-
-
-extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
-       __gnuc_va_list __arg);
-
-
-
-
-extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);
-
-extern int vsprintf (char *__restrict __s, const char *__restrict __format,
-       __gnuc_va_list __arg) __attribute__ ((__nothrow__));
-
-
-
-extern int snprintf (char *__restrict __s, size_t __maxlen,
-       const char *__restrict __format, ...)
-     __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4)));
-
-extern int vsnprintf (char *__restrict __s, size_t __maxlen,
-        const char *__restrict __format, __gnuc_va_list __arg)
-     __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0)));
-# 379 "/usr/include/stdio.h" 3 4
-extern int vdprintf (int __fd, const char *__restrict __fmt,
-       __gnuc_va_list __arg)
-     __attribute__ ((__format__ (__printf__, 2, 0)));
-extern int dprintf (int __fd, const char *__restrict __fmt, ...)
-     __attribute__ ((__format__ (__printf__, 2, 3)));
-
-
-
-
-
-
-
-extern int fscanf (FILE *__restrict __stream,
-     const char *__restrict __format, ...) ;
-
-
-
-
-extern int scanf (const char *__restrict __format, ...) ;
-
-extern int sscanf (const char *__restrict __s,
-     const char *__restrict __format, ...) __attribute__ ((__nothrow__ , __leaf__));
-# 409 "/usr/include/stdio.h" 3 4
-extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) __asm__ ("" "__isoc99_fscanf")
-
-                               ;
-extern int scanf (const char *__restrict __format, ...) __asm__ ("" "__isoc99_scanf")
-                              ;
-extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __asm__ ("" "__isoc99_sscanf") __attribute__ ((__nothrow__ , __leaf__))
-
-                      ;
-# 434 "/usr/include/stdio.h" 3 4
-extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
-      __gnuc_va_list __arg)
-     __attribute__ ((__format__ (__scanf__, 2, 0))) ;
-
-
-
-
-
-extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
-     __attribute__ ((__format__ (__scanf__, 1, 0))) ;
-
-
-extern int vsscanf (const char *__restrict __s,
-      const char *__restrict __format, __gnuc_va_list __arg)
-     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__format__ (__scanf__, 2, 0)));
-# 457 "/usr/include/stdio.h" 3 4
-extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vfscanf")
-
-
-
-     __attribute__ ((__format__ (__scanf__, 2, 0))) ;
-extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vscanf")
-
-     __attribute__ ((__format__ (__scanf__, 1, 0))) ;
-extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vsscanf") __attribute__ ((__nothrow__ , __leaf__))
-
-
-
-     __attribute__ ((__format__ (__scanf__, 2, 0)));
-# 491 "/usr/include/stdio.h" 3 4
-extern int fgetc (FILE *__stream);
-extern int getc (FILE *__stream);
-
-
-
-
-
-extern int getchar (void);
-
-
-
-
-
-
-extern int getc_unlocked (FILE *__stream);
-extern int getchar_unlocked (void);
-# 516 "/usr/include/stdio.h" 3 4
-extern int fgetc_unlocked (FILE *__stream);
-# 527 "/usr/include/stdio.h" 3 4
-extern int fputc (int __c, FILE *__stream);
-extern int putc (int __c, FILE *__stream);
-
-
-
-
-
-extern int putchar (int __c);
-# 543 "/usr/include/stdio.h" 3 4
-extern int fputc_unlocked (int __c, FILE *__stream);
-
-
-
-
-
-
-
-extern int putc_unlocked (int __c, FILE *__stream);
-extern int putchar_unlocked (int __c);
-
-
-
-
-
-
-extern int getw (FILE *__stream);
-
-
-extern int putw (int __w, FILE *__stream);
-
-
-
-
-
-
-
-extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
-     ;
-# 609 "/usr/include/stdio.h" 3 4
-extern __ssize_t __getdelim (char **__restrict __lineptr,
-                             size_t *__restrict __n, int __delimiter,
-                             FILE *__restrict __stream) ;
-extern __ssize_t getdelim (char **__restrict __lineptr,
-                           size_t *__restrict __n, int __delimiter,
-                           FILE *__restrict __stream) ;
-
-
-
-
-
-
-
-extern __ssize_t getline (char **__restrict __lineptr,
-                          size_t *__restrict __n,
-                          FILE *__restrict __stream) ;
-
-
-
-
-
-
-
-extern int fputs (const char *__restrict __s, FILE *__restrict __stream);
-
-
-
-
-
-extern int puts (const char *__s);
-
-
-
-
-
-
-extern int ungetc (int __c, FILE *__stream);
-
-
-
-
-
-
-extern size_t fread (void *__restrict __ptr, size_t __size,
-       size_t __n, FILE *__restrict __stream) ;
-
-
-
-
-extern size_t fwrite (const void *__restrict __ptr, size_t __size,
-        size_t __n, FILE *__restrict __s);
-# 679 "/usr/include/stdio.h" 3 4
-extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
-         size_t __n, FILE *__restrict __stream) ;
-extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
-          size_t __n, FILE *__restrict __stream);
-
-
-
-
-
-
-
-extern int fseek (FILE *__stream, long int __off, int __whence);
-
-
-
-
-extern long int ftell (FILE *__stream) ;
-
-
-
-
-extern void rewind (FILE *__stream);
-# 713 "/usr/include/stdio.h" 3 4
-extern int fseeko (FILE *__stream, __off_t __off, int __whence);
-
-
-
-
-extern __off_t ftello (FILE *__stream) ;
-# 737 "/usr/include/stdio.h" 3 4
-extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
-
-
-
-
-extern int fsetpos (FILE *__stream, const fpos_t *__pos);
-# 763 "/usr/include/stdio.h" 3 4
-extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
-
-extern int feof (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-extern int ferror (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
-extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-
-
-
-
-extern void perror (const char *__s);
-
-
-
-
-
-# 1 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 1 3 4
-# 26 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 3 4
-extern int sys_nerr;
-extern const char *const sys_errlist[];
-# 788 "/usr/include/stdio.h" 2 3 4
-
-
-
-
-extern int fileno (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-
-
-extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-# 806 "/usr/include/stdio.h" 3 4
-extern FILE *popen (const char *__command, const char *__modes) ;
-
-
-
-
-
-extern int pclose (FILE *__stream);
-
-
-
-
-
-extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__));
-# 846 "/usr/include/stdio.h" 3 4
-extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
-
-
-
-extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
-
-
-extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
-# 864 "/usr/include/stdio.h" 3 4
-extern int __uflow (FILE *);
-extern int __overflow (FILE *, int);
-
-
-
-
-# 1 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 1 3 4
-# 38 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 3 4
-extern __inline __attribute__ ((__gnu_inline__)) int
-vprintf (const char *__restrict __fmt, __gnuc_va_list __arg)
-{
-  return vfprintf (stdout, __fmt, __arg);
-}
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-getchar (void)
-{
-  return getc (stdin);
-}
-
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-fgetc_unlocked (FILE *__fp)
-{
-  return (__builtin_expect (((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end), 0) ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++);
-}
-
-
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-getc_unlocked (FILE *__fp)
-{
-  return (__builtin_expect (((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end), 0) ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++);
-}
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-getchar_unlocked (void)
-{
-  return (__builtin_expect (((stdin)->_IO_read_ptr >= (stdin)->_IO_read_end), 0) ? __uflow (stdin) : *(unsigned char *) (stdin)->_IO_read_ptr++);
-}
-
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-putchar (int __c)
-{
-  return putc (__c, stdout);
-}
-
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-fputc_unlocked (int __c, FILE *__stream)
-{
-  return (__builtin_expect (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end), 0) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c)));
-}
-
-
-
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-putc_unlocked (int __c, FILE *__stream)
-{
-  return (__builtin_expect (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end), 0) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c)));
-}
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-putchar_unlocked (int __c)
-{
-  return (__builtin_expect (((stdout)->_IO_write_ptr >= (stdout)->_IO_write_end), 0) ? __overflow (stdout, (unsigned char) (__c)) : (unsigned char) (*(stdout)->_IO_write_ptr++ = (__c)));
-}
-# 127 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 3 4
-extern __inline __attribute__ ((__gnu_inline__)) int
-__attribute__ ((__nothrow__ , __leaf__)) feof_unlocked (FILE *__stream)
-{
-  return (((__stream)->_flags & 0x0010) != 0);
-}
-
-
-extern __inline __attribute__ ((__gnu_inline__)) int
-__attribute__ ((__nothrow__ , __leaf__)) ferror_unlocked (FILE *__stream)
-{
-  return (((__stream)->_flags & 0x0020) != 0);
-}
-# 871 "/usr/include/stdio.h" 2 3 4
-# 879 "/usr/include/stdio.h" 3 4
-
-# 2 "hello-1.c" 2
-
-
-# 3 "hello-1.c"
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201210/hello-1.c b/20201210/hello-1.c
deleted file mode 100644
index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000
--- a/20201210/hello-1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201210/hello-2.c b/20201210/hello-2.c
deleted file mode 100644
index 1f2dbb2b8aa8984b4401f3f8425662a0171184c1..0000000000000000000000000000000000000000
--- a/20201210/hello-2.c
+++ /dev/null
@@ -1,5 +0,0 @@
-int main (void)
-{
-  printf ("Hello, world!\n");
-  return 0;
-}
diff --git a/20201210/hello-3.c b/20201210/hello-3.c
deleted file mode 100644
index 304452b8c501faf03fbd0afaa267e6ef0172807e..0000000000000000000000000000000000000000
--- a/20201210/hello-3.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/20201210/hello-gtk.c b/20201210/hello-gtk.c
deleted file mode 100644
index 016867d41e42de57390a21653de467c061e5ded0..0000000000000000000000000000000000000000
--- a/20201210/hello-gtk.c
+++ /dev/null
@@ -1,23 +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);
-  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;
-}
diff --git a/20201210/hexe.h b/20201210/hexe.h
deleted file mode 100644
index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000
--- a/20201210/hexe.h
+++ /dev/null
@@ -1 +0,0 @@
-eine kleine Hexe.
diff --git a/20201210/higher-math-1.c b/20201210/higher-math-1.c
deleted file mode 100644
index 8bd228547b9dde9c5df71c45330df591b5fb593d..0000000000000000000000000000000000000000
--- a/20201210/higher-math-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4
-
-int main (void)
-{
-  printf ("3 * 4 = %d\n", 3 * VIER);
-}
diff --git a/20201210/higher-math-2.c b/20201210/higher-math-2.c
deleted file mode 100644
index 784c63b156f8881bec9133910c7fe6c524b3004c..0000000000000000000000000000000000000000
--- a/20201210/higher-math-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-
-#define N 4
-
-int prime[N] = { 2, 3, 5, 7 };
-
-int main (void)
-{
-  for (int i = 0; i < N; i++)
-    printf ("prime[%d] = %d\n", i, prime[i]);
-}
diff --git a/20201210/higher-math-3.c b/20201210/higher-math-3.c
deleted file mode 100644
index 4292be39ab64d0dd538f533ba82a3a4cdf0a046c..0000000000000000000000000000000000000000
--- a/20201210/higher-math-3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-#define VIER 4;
-
-int main (void)
-{
-  printf ("3 * 4 = %d\n", 3 * VIER);
-}
diff --git a/20201210/higher-math-4.c b/20201210/higher-math-4.c
deleted file mode 100644
index 99edb16ca410f6a10ae8b8c65c5b6bb9c80146e2..0000000000000000000000000000000000000000
--- a/20201210/higher-math-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-#define VIER 2 + 2
-
-int main (void)
-{
-  printf ("3 * 4 = %d\n", 3 * VIER);
-}
diff --git a/20201210/higher-math-5.c b/20201210/higher-math-5.c
deleted file mode 100644
index 3eba14e088add18642af9e3bd810a57460d88729..0000000000000000000000000000000000000000
--- a/20201210/higher-math-5.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-#define VIER (2 + 2)
-
-int main (void)
-{
-  printf ("3 * 4 = %d\n", 3 * VIER);
-}
diff --git a/20201210/hp-20201210.pdf b/20201210/hp-20201210.pdf
deleted file mode 100644
index f953230f19ab3cd0678eacb4d6ee9b102decc220..0000000000000000000000000000000000000000
Binary files a/20201210/hp-20201210.pdf and /dev/null differ
diff --git a/20201210/hp-20201210.tex b/20201210/hp-20201210.tex
deleted file mode 100644
index 9e8407703a644366ac8af831ed7de4b56021f9b7..0000000000000000000000000000000000000000
--- a/20201210/hp-20201210.tex
+++ /dev/null
@@ -1,1423 +0,0 @@
-% hp-20201210.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: Präprozessor, Bibliotheken einbinden und verwenden
-
-\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{10.\ Dezember 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}
-      \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}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{1}
-\section{Einführung in C}
-\setcounter{subsection}{12}
-\subsection{Strukturen}
-
-\begin{frame}[fragile]
-  \showsubsection
-
-  \begin{minipage}[b]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡#include <stdio.h>
-
-      typedef struct
-      {
-        char day, month;
-        int year;
-      }
-      date;
-
-      int main (void)
-      {
-        date today = { 3, 12, 2020 };
-        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 = 3;
-        (*d).month = 12;
-        (*d).year = 2020;
-      }¿
-    \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 = 3;
-        d->month = 12;
-        d->year = 2020;
-      }¿
-    \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}
-
-\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
-
-  \vspace*{-0.4cm}
-  \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
-
-  \vspace*{-0.4cm}
-  \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}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \vspace*{-0.4cm}
-  \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}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \vspace*{-0.4cm}
-  \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}
-
-\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}
-      \begin{itemize}
-        \color{red}
-        \item[3.1] Der Präprozessor
-        \item[3.2] Bibliotheken einbinden
-        \item[3.3] Bibliotheken verwenden
-        \item[3.4] Projekt organisieren: make
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{4}] \textbf{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\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*{-3cm}
-      \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*{-2cm}
-      \end{onlyenv}
-      \begin{onlyenv}<5->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs
-                 gtk+-3.0 -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<5>
-        \begin{picture}(0,0)(0.3,0.3)
-          \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{onlyenv}
-    \pause
-    \pause
-    \item
-      Auf manchen Plattformen kommt es auf die Reihenfolge an:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \
-               hello-gtk.c $(pkg-config --libs gtk+-3.0) \
-               -o hello-gtk¿
-      \end{lstlisting}
-      (Backslash = "`Es geht in der nächsten Zeile weiter."')
-  \end{itemize}
-
-\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)(-0.07,0.2)
-    \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)(-0.07,0.2)
-    \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}
-
-\iffalse
-
-\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}
-
-\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}
-
-\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}
-
-\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}
-
-  \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}
-
-\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}
-
-\fi
-
-\end{document}
diff --git a/20201210/hp-musterloesung-20201210.pdf b/20201210/hp-musterloesung-20201210.pdf
deleted file mode 100644
index e2c19bae1421c7d78645e9af29bb242ca6c649c5..0000000000000000000000000000000000000000
Binary files a/20201210/hp-musterloesung-20201210.pdf and /dev/null differ
diff --git a/20201210/hp-musterloesung-20201210.tex b/20201210/hp-musterloesung-20201210.tex
deleted file mode 100644
index 9f1c06d864d055f41ba36c141ce532eb2dbffb1f..0000000000000000000000000000000000000000
--- a/20201210/hp-musterloesung-20201210.tex
+++ /dev/null
@@ -1,458 +0,0 @@
-% hp-musterloesung-20201114.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: 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 -- 10.\ Dezember 2020}
-
-  \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}{2020ws/20201210}{loesung-1-1.c} setzt diesen Zwischenschritt um.
-
-  Die Ausgabe der Ziffern erfolgt in \gitfile{hp}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{loesung-1-5.c} ist eine in dieser Weise abgewandelte Variante
-  von \gitfile{hp}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{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}{2020ws/20201210}{loesung-3c-1.c} (mit Array-Index)
-      und \gitfile{hp}{2020ws/20201210}{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}{2020ws/20201210}{loesung-3d-1.c} und \gitfile{hp}{2020ws/20201210}{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}{2020ws/20201210}{loesung-3e-1.c}
-      realisiert dies mit einem Array-Index,
-      Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{2020ws/20201210}{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/20201210/hp-uebung-20201210.pdf b/20201210/hp-uebung-20201210.pdf
deleted file mode 100644
index 6d713c0cd332a21c28da29a719303a07ea65ccd7..0000000000000000000000000000000000000000
Binary files a/20201210/hp-uebung-20201210.pdf and /dev/null differ
diff --git a/20201210/hp-uebung-20201210.tex b/20201210/hp-uebung-20201210.tex
deleted file mode 100644
index c988102749d6d59d839394382d0222f845f97022..0000000000000000000000000000000000000000
--- a/20201210/hp-uebung-20201210.tex
+++ /dev/null
@@ -1,227 +0,0 @@
-% hp-uebung-20201210.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: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 10.\ Dezember 2020}
-
-  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}{2020ws/20201210}{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}{2020ws/20201210}{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/20201210/loesung-1-1.c b/20201210/loesung-1-1.c
deleted file mode 100644
index 98b2f03f19d21aa2a794fef1f3f98feff95f5142..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-1-2.c b/20201210/loesung-1-2.c
deleted file mode 100644
index 35aa3b3aea6fc8faaa55c7d5382f0a8de9282aee..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-1-3.c b/20201210/loesung-1-3.c
deleted file mode 100644
index 2462f2b537896722d8d1774a5d47f374ee5ef7fa..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-1-4.c b/20201210/loesung-1-4.c
deleted file mode 100644
index 5083dcb865c86beafd43ce3e8837510b13cbe850..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-1-5.c b/20201210/loesung-1-5.c
deleted file mode 100644
index e3446edb4a40348ac14da420f344c208f8916f7e..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-1-6.c b/20201210/loesung-1-6.c
deleted file mode 100644
index 7b8e8e1a9d7285b8a1e02ff1a91310f1dc02ed5b..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-2.c b/20201210/loesung-2.c
deleted file mode 100644
index 85abfcf3e1e4bacf454acd10f6832b757a64ac35..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3c-1.c b/20201210/loesung-3c-1.c
deleted file mode 100644
index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3c-2.c b/20201210/loesung-3c-2.c
deleted file mode 100644
index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3d-1.c b/20201210/loesung-3d-1.c
deleted file mode 100644
index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3d-2.c b/20201210/loesung-3d-2.c
deleted file mode 100644
index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3e-1.c b/20201210/loesung-3e-1.c
deleted file mode 100644
index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/loesung-3e-2.c b/20201210/loesung-3e-2.c
deleted file mode 100644
index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/logo-hochschule-bochum-cvh-text-v2.pdf b/20201210/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/logo-hochschule-bochum.pdf b/20201210/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201210/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201210/maerchen.c b/20201210/maerchen.c
deleted file mode 100644
index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/pendulum.pdf b/20201210/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20201210/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20201210/pgscript.sty b/20201210/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201210/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201210/pgslides.sty b/20201210/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201210/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201210/philosophy-2.c b/20201210/philosophy-2.c
deleted file mode 100644
index 0e02bd4bb3ffc61a3371932ab17ad36fa5a2c507..0000000000000000000000000000000000000000
--- a/20201210/philosophy-2.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/20201210/philosophy-3.c b/20201210/philosophy-3.c
deleted file mode 100644
index c104bc5a96f892831c0c51daeea2ae2ad4b21f8c..0000000000000000000000000000000000000000
--- a/20201210/philosophy-3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
diff --git a/20201210/philosophy-4.c b/20201210/philosophy-4.c
deleted file mode 100644
index 990eebf41e6438223558da8d528646fb78bbbaac..0000000000000000000000000000000000000000
--- a/20201210/philosophy-4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-#include "answer.c"
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
diff --git a/20201210/philosophy.c b/20201210/philosophy.c
deleted file mode 100644
index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000
--- a/20201210/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/20201210/structs.c b/20201210/structs.c
deleted file mode 100644
index 375be8691a3644b8a4da51be9390bdf28880912b..0000000000000000000000000000000000000000
--- a/20201210/structs.c
+++ /dev/null
@@ -1,103 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int day;
-  int month;
-  int year;
-}
-date;
-
-int isschaltjahr (int jahr)
-{
-  if (jahr % 4 == 0 && (jahr % 100 != 0 || jahr % 400 == 0))
-    {
-      return 1;
-    }
-  return 0;
-}
-
-void
-set_date (date * d)
-{
-  int i=0;
-  while (i == 0)
-    {
-      int daysamonth;
-      (*d).day = 12;		//Hier wird ein festes Datum verwendet. 
-      (*d).month = 11;		//Das Datum soll später abgefragt werden
-      (*d).year = 2020;	//weshalb geprüft wird, ob das Datum 					gültig                      ist.
-
-      switch ((*d).month)
-	{
-	case 1:
-	  daysamonth = 31;
-	  break;
-	case 2:
-	  {
-	    if (isschaltjahr ((*d).year))
-	      {
-		daysamonth = 29;
-	      }
-	    else
-	      {
-		daysamonth = 28;
-	      }
-	    break;
-	  }
-	case 3:
-	  daysamonth = 31;
-	  break;
-	case 4:
-	  daysamonth = 30;
-	  break;
-	case 5:
-	  daysamonth = 31;
-	  break;
-	case 6:
-	  daysamonth = 30;
-	  break;
-	case 7:
-	  daysamonth = 31;
-	  break;
-	case 8:
-	  daysamonth = 31;
-	  break;
-	case 9:
-	  daysamonth = 30;
-	  break;
-	case 10:
-	  daysamonth = 31;
-	  break;
-	case 11:
-	  daysamonth = 30;
-	  break;
-	case 12:
-	  daysamonth = 31;
-	  break;
-	}
-      if ((*d).day > daysamonth || (*d).month > 12)
-	{
-	  printf ("Dies ist kein gültiges Datum: \n");
-	}
-      else
-	{
-	  i = 1;
-	}
-
-    }
-}
-
-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/20201217/InstallationUndVerwendungGTKWin10.pdf b/20201217/InstallationUndVerwendungGTKWin10.pdf
deleted file mode 100644
index 3757e05839ad8463e7da520b343a93af1f30d951..0000000000000000000000000000000000000000
Binary files a/20201217/InstallationUndVerwendungGTKWin10.pdf and /dev/null differ
diff --git a/20201217/Makefile b/20201217/Makefile
deleted file mode 120000
index d5f315bb0af8681b0b80a89de423cdc968cac0ba..0000000000000000000000000000000000000000
--- a/20201217/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-Makefile-3
\ No newline at end of file
diff --git a/20201217/Makefile-1 b/20201217/Makefile-1
deleted file mode 100644
index bfc1b10a929f22a8c2f4f0cf0368c78db14ad0b0..0000000000000000000000000000000000000000
--- a/20201217/Makefile-1
+++ /dev/null
@@ -1,8 +0,0 @@
-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
diff --git a/20201217/Makefile-2 b/20201217/Makefile-2
deleted file mode 100644
index 60aab7c7d51b28879c41e8590ab422e9edfadee5..0000000000000000000000000000000000000000
--- a/20201217/Makefile-2
+++ /dev/null
@@ -1,16 +0,0 @@
-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)
diff --git a/20201217/Makefile-3 b/20201217/Makefile-3
deleted file mode 100644
index 0ac355bfddfd237fe0f1b5062c5a242ab0d3e97e..0000000000000000000000000000000000000000
--- a/20201217/Makefile-3
+++ /dev/null
@@ -1,13 +0,0 @@
-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)
diff --git a/20201217/answer.c b/20201217/answer.c
deleted file mode 100644
index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000
--- a/20201217/answer.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "answer.h"
-
-int answer (void)
-{
-  return 23;
-}
diff --git a/20201217/answer.h b/20201217/answer.h
deleted file mode 100644
index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000
--- a/20201217/answer.h
+++ /dev/null
@@ -1 +0,0 @@
-extern int answer (void);
diff --git a/20201217/aufgabe-2.c b/20201217/aufgabe-2.c
deleted file mode 100644
index 5b0cb23fdd5ee15a4403808c18d2104ed49caf3f..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/gtk-10.c b/20201217/gtk-10.c
deleted file mode 100644
index f7fb2d5b1c4d3f1082a15b8f3a23fb5480fdd4f1..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/gtk-11.c b/20201217/gtk-11.c
deleted file mode 100644
index 1fa3d7169dc09ed0a5e89abffdce3cb297509842..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/gtk-12.c b/20201217/gtk-12.c
deleted file mode 100644
index e0c274336e1ea7a21983daaa95a563796b532e25..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/gtk-13.c b/20201217/gtk-13.c
deleted file mode 100644
index a91d9abf14066d773103a8fca1e2c41abad40be3..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/gtk-14.c b/20201217/gtk-14.c
deleted file mode 100644
index 75956a60c799d463b13ab45db1a6a62db96f7a20..0000000000000000000000000000000000000000
--- a/20201217/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 = 50.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 (5000, (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/20201217/gtk-15.c b/20201217/gtk-15.c
deleted file mode 100644
index abedb4d4988920c9a48cf4db12caf48a1d30d720..0000000000000000000000000000000000000000
--- a/20201217/gtk-15.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 = 50.0;
-double dt = 0.2;
-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 (200, (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 (1000, (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/20201217/gtk-16.c b/20201217/gtk-16.c
deleted file mode 100644
index ccd1697d780457103a2c46d2be8572ac6f6d6d9e..0000000000000000000000000000000000000000
--- a/20201217/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.2;
-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 (200, (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 (1000, (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/20201217/gtk-17.c b/20201217/gtk-17.c
deleted file mode 100644
index 21786c759abcb452650aaa2358d3117acc15da52..0000000000000000000000000000000000000000
--- a/20201217/gtk-17.c
+++ /dev/null
@@ -1,65 +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.2;
-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;
-  if (y + RADIUS >= HEIGHT)
-    vy = -vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (200, (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 (1000, (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/20201217/gtk-18.c b/20201217/gtk-18.c
deleted file mode 100644
index 84f6081519114dbbd32e58ae495c60dbad83e279..0000000000000000000000000000000000000000
--- a/20201217/gtk-18.c
+++ /dev/null
@@ -1,65 +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.2;
-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;
-  if (y + RADIUS <= 0)
-    vy = -vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (200, (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 (1000, (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/20201217/gtk-19.c b/20201217/gtk-19.c
deleted file mode 100644
index 488ecb2f7e2e89c00119acc9c2a7a336129b0236..0000000000000000000000000000000000000000
--- a/20201217/gtk-19.c
+++ /dev/null
@@ -1,65 +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.2;
-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;
-  if (y - RADIUS <= 0)
-    vy = -vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (200, (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 (1000, (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/20201217/gtk-20.c b/20201217/gtk-20.c
deleted file mode 100644
index cf4c99aadff3cc1856b63176eebc1b66bb64acfb..0000000000000000000000000000000000000000
--- a/20201217/gtk-20.c
+++ /dev/null
@@ -1,65 +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.1;
-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;
-  if (y - RADIUS <= 0)
-    vy = -vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (100, (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 (1000, (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/20201217/gtk-21.c b/20201217/gtk-21.c
deleted file mode 100644
index e5227416e36dd16cb647142a2574bf2229f88456..0000000000000000000000000000000000000000
--- a/20201217/gtk-21.c
+++ /dev/null
@@ -1,67 +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.1;
-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;
-  if (x - RADIUS <= 0)
-    vx = -vx;
-  if (y - RADIUS <= 0)
-    vy = -vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (100, (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 (1000, (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/20201217/gtk-22.c b/20201217/gtk-22.c
deleted file mode 100644
index 5a141e5773fe36fc51adce4a69e71d76c898b8f6..0000000000000000000000000000000000000000
--- a/20201217/gtk-22.c
+++ /dev/null
@@ -1,67 +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.1;
-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 = -0.9 * vx;
-  if (x - RADIUS <= 0)
-    vx = -0.9 * vx;
-  if (y - RADIUS <= 0)
-    vy = -0.9 * vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (100, (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 (1000, (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/20201217/gtk-23.c b/20201217/gtk-23.c
deleted file mode 100644
index 0a92ba411bab337fc882130556f463b81d919cfa..0000000000000000000000000000000000000000
--- a/20201217/gtk-23.c
+++ /dev/null
@@ -1,67 +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.1;
-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 > 0)
-    vx = -0.9 * vx;
-  if (x - RADIUS <= 0 && vx < 0)
-    vx = -0.9 * vx;
-  if (y - RADIUS <= 0 && vy < 0)
-    vy = -0.9 * vy;
-  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
-  g_timeout_add (100, (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 (1000, (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/20201217/gtk-9.c b/20201217/gtk-9.c
deleted file mode 100644
index 7beb24ccbed561b4f7451838ea1120fe71cf8b1c..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/hp-20201217.pdf b/20201217/hp-20201217.pdf
deleted file mode 100644
index 440d46e10981db443b7be234834f08ba026b94fc..0000000000000000000000000000000000000000
Binary files a/20201217/hp-20201217.pdf and /dev/null differ
diff --git a/20201217/hp-20201217.tex b/20201217/hp-20201217.tex
deleted file mode 100644
index b64061a30d02b25cffbee5d64fc763758018f863..0000000000000000000000000000000000000000
--- a/20201217/hp-20201217.tex
+++ /dev/null
@@ -1,930 +0,0 @@
-% hp-20201217.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: make, 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{17.\ Dezember 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}
-      \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
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{5}] \textbf{Algorithmen}
-    \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 "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<1->{.}{:}
-%      \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*{-3cm}
-      \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*{-2cm}
-      \end{onlyenv}
-      \begin{onlyenv}<3->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs
-                 gtk+-3.0) -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<3>
-        \begin{picture}(0,0)(0.3,0.3)
-          \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}\qquad\strut}}}
-        \end{picture}
-      \end{onlyenv}
-    \pause
-    \pause
-    \item
-      Auf manchen Plattformen kommt es auf die Reihenfolge an:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \
-               hello-gtk.c $(pkg-config --libs gtk+-3.0) \
-               -o hello-gtk¿
-      \end{lstlisting}
-      (Backslash = "`Es geht in der nächsten Zeile weiter."')
-  \end{itemize}
-
-\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)(-0.07,0.2)
-    \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)(-0.07,0.2)
-    \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}
-
-\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}
-
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-\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}
-
-\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}
-        \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}
-    \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}
-
-\iffalse
-
-\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}
-
-\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}
-
-  \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}
-
-\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}
-
-\fi
-
-\end{document}
diff --git a/20201217/hp-2020ws-p2.pdf b/20201217/hp-2020ws-p2.pdf
deleted file mode 100644
index 0081d3c2667838cb911e8ca1086c615acc4f45b6..0000000000000000000000000000000000000000
Binary files a/20201217/hp-2020ws-p2.pdf and /dev/null differ
diff --git a/20201217/hp-2020ws-p2.tex b/20201217/hp-2020ws-p2.tex
deleted file mode 100644
index 12a39ac9fa8c9f5972caa4f98e6cae16a38128d8..0000000000000000000000000000000000000000
--- a/20201217/hp-2020ws-p2.tex
+++ /dev/null
@@ -1,201 +0,0 @@
-% hp-2020ws-p2.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 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 2: 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 4.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: Weltraum-Simulation}
-    \par\medskip
-    \normalsize Hardwarenahe Programmierung\sep
-    Wintersemester 2020/21\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Schreiben Sie ein C-Programm,
-  das die Bahnen von beliebig vielen 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}
-
-      \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.
-
-      \columnbreak
-
-      \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}{2020ws/20201217}{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}
-
-      \item
-        \textbf{Hinweis:}
-        Speichern Sie die verschiedenen Körper nicht als separate Variable,
-        sondern in einem Array. Ihr Programm wird dadurch nicht nur flexibler,
-        sondern auch übersichtlicher und weniger fehleranfällig.
-
-      \item
-        \textbf{Abgabe:}
-        Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte
-        per E-Mail an \file{peter.gerwinski@hs-bochum.de}
-        mit dem \textbf{Betreff:} \lstinline[style=terminal]{aezeev1C}
-        unter Angabe von Name, Matrikel-Nummer,
-        Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS).
-
-    \end{itemize}
-
-  \end{multicols}
-
-  \vspace*{-\bigskipamount}
-
-  \strut\hfill\emph{Viel Erfolg!}\qquad\qquad
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 17.\ Dezember 2020
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2018, 2019, 2020\quad Peter Gerwinski\\
-    Lizenz: \mylicense
-
-    Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
-    und Beispielprogramm herunterladen unter:
-    \url{https://gitlab.cvh-server.de/pgerwinski/hp}
-
-  \endgroup
-
-\end{document}
diff --git a/20201217/hp-musterloesung-20201217.pdf b/20201217/hp-musterloesung-20201217.pdf
deleted file mode 100644
index 6d28b21ef0e1d7d973b4e6d345c85fce9899181d..0000000000000000000000000000000000000000
Binary files a/20201217/hp-musterloesung-20201217.pdf and /dev/null differ
diff --git a/20201217/hp-musterloesung-20201217.tex b/20201217/hp-musterloesung-20201217.tex
deleted file mode 100644
index 96a1a73d756410ff9290f1c5ef7bb910f53bc97d..0000000000000000000000000000000000000000
--- a/20201217/hp-musterloesung-20201217.tex
+++ /dev/null
@@ -1,326 +0,0 @@
-% hp-musterloesung-20201217.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 -- 17.\ Dezember 2020}
-
-  \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}{2020ws/20201217}{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}{2020ws/20201217}{loesung-1a.c} so ab,
-      daß zum einen die Schleife abbricht, sobald die Spannung 
-      den Wert $0.1\,{\rm V}$ unterschreitet (\gitfile{hp}{2020ws/20201217}{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:\\[0.5\smallskipamount]
-      \boldmath  
-      \begin{math}
-        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
-      \end{math}}
-
-      Wir ändern das Programm \gitfile{hp}{2020ws/20201217}{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}{2020ws/20201217}{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[style=cmd]{./loesung-1c > loesung-1c.dat},
-      in einer Datei \gitfile{hp}{2020ws/20201217}{loesung-1c.dat} speichern,
-      können Sie sich die beiden Kurven graphisch darstellen lassen,
-      z.\,B.\ mit \file{gnuplot} und dem folgenden Befehl:
-      \begin{lstlisting}[style=cmd,gobble=8]
-        plot "loesung-1c.dat" using 1:2 with lines title "Simulation",
-             "loesung-1c.dat" using 1:3 with lines title "Theorie"
-      \end{lstlisting}
-      \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}{2020ws/20201217}{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}{2020ws/20201217}{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}{2020ws/20201217}{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}{2020ws/20201217}{gtk-16.c}.
-  \end{enumerate}
-
-\end{document}
diff --git a/20201217/hp-uebung-20201217.pdf b/20201217/hp-uebung-20201217.pdf
deleted file mode 100644
index 9dabeb446661ba7dadcc3a7dbc49bf325c10e834..0000000000000000000000000000000000000000
Binary files a/20201217/hp-uebung-20201217.pdf and /dev/null differ
diff --git a/20201217/hp-uebung-20201217.tex b/20201217/hp-uebung-20201217.tex
deleted file mode 100644
index 6b9c11944f2215e1240d749a8d2cc744005497f7..0000000000000000000000000000000000000000
--- a/20201217/hp-uebung-20201217.tex
+++ /dev/null
@@ -1,193 +0,0 @@
-% hp-uebung-20201217.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: Kondensator, hüpfender Ball
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 17.\ Dezember 2020}
-
-  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}{2020ws/20201217}{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/20201217/loesung-1a.c b/20201217/loesung-1a.c
deleted file mode 100644
index f355706a6ff6f95bd72897123a985fb2b7ead7c3..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/loesung-1b.c b/20201217/loesung-1b.c
deleted file mode 100644
index f5fc22022ef10a1b986bbd11fba8298a7547792d..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/loesung-1c.c b/20201217/loesung-1c.c
deleted file mode 100644
index 71802e036dd56534470028b61f646d297d1d8840..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/loesung-1c.dat b/20201217/loesung-1c.dat
deleted file mode 100644
index 4df706295bde25a74e025c5335f43617d93129a8..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/loesung-1c.tikz b/20201217/loesung-1c.tikz
deleted file mode 100644
index e97073c442cd1f84adf842357e3cb254fb05e54c..0000000000000000000000000000000000000000
--- a/20201217/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,7.8) {Simulation};
-\gpcolor{rgb color={0.580,0.000,0.827}}
-\draw[gp path] (10.663,7.8)--(11.579,7.8);
-\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.35) {Theorie};
-\gpcolor{rgb color={0.000,0.620,0.451}}
-\draw[gp path] (10.663,7.35)--(11.579,7.35);
-\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/20201217/logo-hochschule-bochum-cvh-text-v2.pdf b/20201217/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/logo-hochschule-bochum.pdf b/20201217/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20201217/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20201217/make-1.txt b/20201217/make-1.txt
deleted file mode 100644
index a04a551c7c38556c87ae7c3644357cbf51d13df3..0000000000000000000000000000000000000000
--- a/20201217/make-1.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c
-#include <stdio.h>
-#include "answer.h"
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h
-extern int answer (void);
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c
-#include "answer.h"
-
-int answer (void)
-{
-  return 42;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c -o philosophy
-/usr/bin/ld: /tmp/ccCbFdy5.o: in function `main':
-philosophy.c:(.text+0x5): undefined reference to `answer'
-collect2: error: ld returned 1 exit status
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 42.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-10.txt b/20201217/make-10.txt
deleted file mode 100644
index 5a731bbb980ec0a63c1caf3152fd690e81631e26..0000000000000000000000000000000000000000
--- a/20201217/make-10.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-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)
-cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-2
-make: „philosophy“ ist bereits aktuell.
-cassini/home/peter/bo/2020ws/hp/20201217> make answer.o -f Makefile-2
-make: „answer.o“ ist bereits aktuell.
-cassini/home/peter/bo/2020ws/hp/20201217> make clean -f Makefile-2
-rm -f philosophy.o answer.o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> make answer.o -f Makefile-2
-gcc -Wall -O answer.c -c
-cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-2
-gcc -Wall -O philosophy.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 23.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-11.txt b/20201217/make-11.txt
deleted file mode 100644
index 972907b4742b95090fa2ab16b416c01f234894a3..0000000000000000000000000000000000000000
--- a/20201217/make-11.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile-3
-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)
-cassini/home/peter/bo/2020ws/hp/20201217> make clean
-make: *** Keine Regel, um „clean“ zu erstellen.  Schluss.
-cassini/home/peter/bo/2020ws/hp/20201217> make
-make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden.  Schluss.
-cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-3 clean
-rm -f philosophy.o answer.o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-3
-gcc -Wall -O philosophy.c -c
-gcc -Wall -O answer.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ln -s Makefile-3 Makefile
-cassini/home/peter/bo/2020ws/hp/20201217> make clean
-rm -f philosophy.o answer.o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc -Wall -O philosophy.c -c
-gcc -Wall -O answer.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-2.txt b/20201217/make-2.txt
deleted file mode 100644
index 4143a77a2e45b57b3efe005456c99b173ca92b99..0000000000000000000000000000000000000000
--- a/20201217/make-2.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "answer.h"
-
-int answer (void)
-{
-  return 137;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 42.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-3.txt b/20201217/make-3.txt
deleted file mode 100644
index ac0a49ddec4c3f6fcb3229abbe35640a7816e8d9..0000000000000000000000000000000000000000
--- a/20201217/make-3.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "answer.h"
-
-int answer (void)
-{
-  return 137;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 42.
-cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-2.txt
-#include "answer.h"
-
-int answer (void)
-{
-  return 137;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 42.
-cassini/home/peter/bo/2020ws/hp/20201217>
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 137.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-4.txt b/20201217/make-4.txt
deleted file mode 100644
index d07bb9f28f390a394f55dbb9bf1a85a8a00419cf..0000000000000000000000000000000000000000
--- a/20201217/make-4.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c
-#include <stdio.h>
-#include "answer.h"
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h
-extern int answer (void);
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c
-#include "answer.h"
-
-int answer (void)
-{
-  return 137;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c -c
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c
-cassini/home/peter/bo/2020ws/hp/20201217> gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 137.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-5.txt b/20201217/make-5.txt
deleted file mode 100644
index 7033a7ff15ef20da449058e5955084573bec74c3..0000000000000000000000000000000000000000
--- a/20201217/make-5.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c
-#include <stdio.h>
-#include "answer.h"
-
-int main (void)
-{
-  printf ("The answer is %d.\n", answer ());
-  return 0;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h
-extern int answer (void);
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c
-#include "answer.h"
-
-int answer (void)
-{
-  return 137;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> for x in philsophy.c answer.c; do gcc -Wall -O $x -c; done
-gcc: error: philsophy.c: Datei oder Verzeichnis nicht gefunden
-gcc: fatal error: no input files
-compilation terminated.
-cassini/home/peter/bo/2020ws/hp/20201217> for x in philosophy.c answer.c; do gcc -Wall -O $x -c; done
-cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.c -c
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-6.txt b/20201217/make-6.txt
deleted file mode 100644
index 8b369c1e14c49675d968324c8406a311eb3bbd66..0000000000000000000000000000000000000000
--- a/20201217/make-6.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile
-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
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 137.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-7.txt b/20201217/make-7.txt
deleted file mode 100644
index 2237b1b84043ee3844d8d73c212a3321436b2e4d..0000000000000000000000000000000000000000
--- a/20201217/make-7.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile
-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
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 137.
-cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-6.txt
-cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile
-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
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy
-The answer is 137.
-cassini/home/peter/bo/2020ws/hp/20201217>
-cassini/home/peter/bo/2020ws/hp/20201217> sed -i answer.c -e 's/137/23/'
-cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c
-#include "answer.h"
-
-int answer (void)
-{
-  return 23;
-}
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc -Wall -O answer.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-8.txt b/20201217/make-8.txt
deleted file mode 100644
index f2d502f113a0c393496efea008247677f643092b..0000000000000000000000000000000000000000
--- a/20201217/make-8.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc -Wall -O philosophy.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/make-9.txt b/20201217/make-9.txt
deleted file mode 100644
index 13617e5285cbb625b8f27f070279508d80705c0a..0000000000000000000000000000000000000000
--- a/20201217/make-9.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc -Wall -O philosophy.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-8.txt
-cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c
-cassini/home/peter/bo/2020ws/hp/20201217> make
-gcc -Wall -O philosophy.c -c
-gcc philosophy.o answer.o -o philosophy
-cassini/home/peter/bo/2020ws/hp/20201217>
-cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-1
-make: „philosophy“ ist bereits aktuell.
-cassini/home/peter/bo/2020ws/hp/20201217>
diff --git a/20201217/pendulum-0.c b/20201217/pendulum-0.c
deleted file mode 100644
index 6faebdc7ad779d89ab8e2eacd189240ace1fb406..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/pendulum-1.c b/20201217/pendulum-1.c
deleted file mode 100644
index 44f4c4fde79d96ed604882b0d5ce22a9035e1400..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/pendulum-2.c b/20201217/pendulum-2.c
deleted file mode 100644
index 4fbad9a50cc595e92fbb1075dd01405a08e84001..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/pendulum-3.c b/20201217/pendulum-3.c
deleted file mode 100644
index 35b0b67aeb0d11aa2a81aba204c97ca96504ad89..0000000000000000000000000000000000000000
--- a/20201217/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/20201217/pendulum-4.c b/20201217/pendulum-4.c
deleted file mode 100644
index 1a08e32735336064af72ce6f332299d14ff66218..0000000000000000000000000000000000000000
--- a/20201217/pendulum-4.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 (-5.0 / 180.0 * M_PI)
-#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/20201217/pendulum.pdf b/20201217/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20201217/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20201217/pgscript.sty b/20201217/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20201217/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20201217/pgslides.sty b/20201217/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20201217/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20201217/philosophy.c b/20201217/philosophy.c
deleted file mode 100644
index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000
--- a/20201217/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/20210107/Tower_of_Hanoi.jpeg b/20210107/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/20210107/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/20210107/aufgabe-1.c b/20210107/aufgabe-1.c
deleted file mode 100644
index abbf364a3db17611e41d086591826e98a8a3672b..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/aufgabe-2.c b/20210107/aufgabe-2.c
deleted file mode 100644
index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/aufgabe-3.c b/20210107/aufgabe-3.c
deleted file mode 100644
index 2bcd5e63a71f212b7243d1f7d9c92406d1e41e77..0000000000000000000000000000000000000000
--- a/20210107/aufgabe-3.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/20210107/bsort-1.c b/20210107/bsort-1.c
deleted file mode 100644
index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/bsort-1a.c b/20210107/bsort-1a.c
deleted file mode 100644
index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/bsort-2.c b/20210107/bsort-2.c
deleted file mode 100644
index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/bsort-3.c b/20210107/bsort-3.c
deleted file mode 100644
index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/bsort-4.c b/20210107/bsort-4.c
deleted file mode 100644
index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-0.c b/20210107/hanoi-0.c
deleted file mode 100644
index 83b5f081e33e699f2d5eaa1f858320530e1b2820..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-1.c b/20210107/hanoi-1.c
deleted file mode 100644
index 6d005f0b12afa6086afb65e1794fb5c977b474e2..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-2.c b/20210107/hanoi-2.c
deleted file mode 100644
index c928c1130539da08d0882249bdffc877d72289b2..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-3.c b/20210107/hanoi-3.c
deleted file mode 100644
index 4b59c046962c1f79eca315882d93faf6b6c298c1..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-4.c b/20210107/hanoi-4.c
deleted file mode 100644
index 162a5ba7cccedf64bff8ae9a514aaf146088e3a4..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-5.c b/20210107/hanoi-5.c
deleted file mode 100644
index e04ad85f63fe92e5c15d22646beb9e9107bf78d6..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-6.c b/20210107/hanoi-6.c
deleted file mode 100644
index 1267605f802246e857c32d29cc0a132609cb24ce..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-7.c b/20210107/hanoi-7.c
deleted file mode 100644
index f71fcdc0c3f66047ee3ad870d019a06eb328050f..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-8.c b/20210107/hanoi-8.c
deleted file mode 100644
index 6d804063531d424a82924a89d85424c33994793b..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-9.c b/20210107/hanoi-9.c
deleted file mode 100644
index 7694b373b7011e96f6be0ad0f00ba54b67086158..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi-9a.c b/20210107/hanoi-9a.c
deleted file mode 100644
index 55e8d74db6d7284d6db225a6f8f3e08ab4efdc06..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/hanoi.xcf.gz b/20210107/hanoi.xcf.gz
deleted file mode 100644
index 77c7ad5d82486563f7ae1188a7de539f9bad3663..0000000000000000000000000000000000000000
Binary files a/20210107/hanoi.xcf.gz and /dev/null differ
diff --git a/20210107/hp-20210107.pdf b/20210107/hp-20210107.pdf
deleted file mode 100644
index 0503488856a9624499caa49b82e1a83ce6e35f04..0000000000000000000000000000000000000000
Binary files a/20210107/hp-20210107.pdf and /dev/null differ
diff --git a/20210107/hp-20210107.tex b/20210107/hp-20210107.tex
deleted file mode 100644
index 0e48bfed60b59e2731f579314252ee949a00019c..0000000000000000000000000000000000000000
--- a/20210107/hp-20210107.tex
+++ /dev/null
@@ -1,852 +0,0 @@
-% hp-20210107.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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
-
-\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.\ Januar 2021}
-
-\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}
-    \item[\textbf{4}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Differentialgleichungen
-        \color{red}
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \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 "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<1->{.}{:}
-%      \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*{-3cm}
-      \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*{-2cm}
-      \end{onlyenv}
-      \begin{onlyenv}<3->
-        \begin{lstlisting}[style=terminal,gobble=10]
-          $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs
-                 gtk+-3.0) -o hello-gtk¿
-        \end{lstlisting}
-      \end{onlyenv}
-      \begin{onlyenv}<3>
-        \begin{picture}(0,0)(0.3,0.3)
-          \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}\qquad\strut}}}
-        \end{picture}
-      \end{onlyenv}
-    \pause
-    \pause
-    \item
-      Auf manchen Plattformen kommt es auf die Reihenfolge an:
-      \begin{lstlisting}[style=terminal,gobble=8]
-        $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \
-               hello-gtk.c $(pkg-config --libs gtk+-3.0) \
-               -o hello-gtk¿
-      \end{lstlisting}
-      (Backslash = "`Es geht in der nächsten Zeile weiter."')
-  \end{itemize}
-
-\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)(-0.07,0.2)
-    \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)(-0.07,0.2)
-    \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}
-
-  \vspace*{-1cm}
-
-\end{frame}
-
-\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}
-
-\section{Algorithmen}
-\subsection{Differentialgleichungen}
-
-\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}
-
-\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}
-    \item[\textbf{4}] \textbf{Algorithmen}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Differentialgleichungen
-        \color{red}
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\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<16->{\includegraphics{landau-symbols-3.pdf}}%
-                       {\alt<15->{\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-13>
-    \textbf{Beispiel: Sortieralgorithmen}
-
-    \smallskip
-
-    Anzahl der Vergleiche bei $n$ Strings
-    \begin{itemize}
-      \item
-        Maximum suchen \pause[4]mit Schummeln\pause: $\mathcal{O}(1)$
-      \pause
-      \item
-        Maximum suchen\pause: $\mathcal{O}(n)$
-      \pause
-      \item
-        Selection-Sort\pause: $\mathcal{O}(n^2)$
-      \pause
-      \item
-        Bubble-Sort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$
-      \pause
-      \item
-        Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$
-    \end{itemize}
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<14>
-    \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}<15->
-
-    \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<16->{{\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<16->{{\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<16->{{\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}
-
-\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
-        \item[3.4] Projekt organisieren: make
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \color{medgreen}
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\end{document}
diff --git a/20210107/hp-musterloesung-20210107.pdf b/20210107/hp-musterloesung-20210107.pdf
deleted file mode 100644
index c154a59ec11e00019d6653f8a309f770ce37a0e6..0000000000000000000000000000000000000000
Binary files a/20210107/hp-musterloesung-20210107.pdf and /dev/null differ
diff --git a/20210107/hp-musterloesung-20210107.tex b/20210107/hp-musterloesung-20210107.tex
deleted file mode 100644
index 2027ef6d209d940a82a925f8d8fee50f54ab0048..0000000000000000000000000000000000000000
--- a/20210107/hp-musterloesung-20210107.tex
+++ /dev/null
@@ -1,357 +0,0 @@
-% hp-musterloesung-20210107.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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), Hexdumps
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{gnuplot-lua-tikz}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 7.\ Januar 2021}
-
-  \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}{2020ws/20210107}{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}{2020ws/20210107}{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}{2020ws/20210107}{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}{2020ws/20210107}{loesung-2c-1.c} (mit Array-Index)
-      und \gitfile{hp}{2020ws/20210107}{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}{2020ws/20210107}{loesung-2d-1.c} und \gitfile{hp}{2020ws/20210107}{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}{2020ws/20210107}{loesung-2e-1.c}
-      realisiert dies mit einem Array-Index,
-      Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{2020ws/20210107}{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}{2020ws/20210107}{loesung-2e-1.c}
-      und \gitfile{hp}{2020ws/20210107}{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{Hexdumps}
-
-  Das folgende Programm (\gitfile{hp}{2020ws/20210107}{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}{2020ws/20210107}{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/20210107/hp-uebung-20210107.pdf b/20210107/hp-uebung-20210107.pdf
deleted file mode 100644
index 068a5c491dd2622ecc9223c9fc0cf9ffed8fd762..0000000000000000000000000000000000000000
Binary files a/20210107/hp-uebung-20210107.pdf and /dev/null differ
diff --git a/20210107/hp-uebung-20210107.tex b/20210107/hp-uebung-20210107.tex
deleted file mode 100644
index 3e06f4d7420fa1182fce1741aa6bf718df3c7ce5..0000000000000000000000000000000000000000
--- a/20210107/hp-uebung-20210107.tex
+++ /dev/null
@@ -1,203 +0,0 @@
-% hp-uebung-20210107.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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), Hexdumps
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 7.\ Januar 2021}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 85 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  15 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \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}{2020ws/20210107}{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 10.\ Dezember 2020,\\
-  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}{2020ws/20210107}{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{Hexdumps}
-
-  Das folgende Programm (\gitfile{hp}{2020ws/20210107}{aufgabe-3.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/20210107/landau-symbols-2.pdf b/20210107/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20210107/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20210107/landau-symbols-3.pdf b/20210107/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20210107/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20210107/landau-symbols.pdf b/20210107/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20210107/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20210107/loesung-1.c b/20210107/loesung-1.c
deleted file mode 100644
index c2d6f6003924627ae97831407c191eaac42a09c1..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2c-1.c b/20210107/loesung-2c-1.c
deleted file mode 100644
index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2c-2.c b/20210107/loesung-2c-2.c
deleted file mode 100644
index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2d-1.c b/20210107/loesung-2d-1.c
deleted file mode 100644
index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2d-2.c b/20210107/loesung-2d-2.c
deleted file mode 100644
index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2e-1.c b/20210107/loesung-2e-1.c
deleted file mode 100644
index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-2e-2.c b/20210107/loesung-2e-2.c
deleted file mode 100644
index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3.c b/20210107/loesung-3.c
deleted file mode 100644
index 872058ac9fecdcb59ac1104ca67841cb3dc974a9..0000000000000000000000000000000000000000
--- a/20210107/loesung-3.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/20210107/loesung-3d-0f.c b/20210107/loesung-3d-0f.c
deleted file mode 100644
index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3d-1.c b/20210107/loesung-3d-1.c
deleted file mode 100644
index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3d-2.c b/20210107/loesung-3d-2.c
deleted file mode 100644
index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3e.c b/20210107/loesung-3e.c
deleted file mode 100644
index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3f.c b/20210107/loesung-3f.c
deleted file mode 100644
index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/loesung-3g.c b/20210107/loesung-3g.c
deleted file mode 100644
index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/logo-hochschule-bochum-cvh-text-v2.pdf b/20210107/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/logo-hochschule-bochum.pdf b/20210107/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210107/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210107/pendulum.pdf b/20210107/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20210107/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20210107/pgscript.sty b/20210107/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210107/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210107/pgslides.sty b/20210107/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210107/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210107/qsort-1.c b/20210107/qsort-1.c
deleted file mode 100644
index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/qsort-1a.c b/20210107/qsort-1a.c
deleted file mode 100644
index a3d4d0011834aa3d85907c2a0d0e90e3bf80799e..0000000000000000000000000000000000000000
--- a/20210107/qsort-1a.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 - 1;
-  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/20210107/qsort-2.c b/20210107/qsort-2.c
deleted file mode 100644
index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/qsort-3.c b/20210107/qsort-3.c
deleted file mode 100644
index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-0.c b/20210107/sort-0.c
deleted file mode 100644
index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-1.c b/20210107/sort-1.c
deleted file mode 100644
index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-2.c b/20210107/sort-2.c
deleted file mode 100644
index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-3.c b/20210107/sort-3.c
deleted file mode 100644
index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-4.c b/20210107/sort-4.c
deleted file mode 100644
index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-5.c b/20210107/sort-5.c
deleted file mode 100644
index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-6.c b/20210107/sort-6.c
deleted file mode 100644
index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000
--- a/20210107/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/20210107/sort-7.c b/20210107/sort-7.c
deleted file mode 100644
index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000
--- a/20210107/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/20210114/400_points_breadboard.jpg b/20210114/400_points_breadboard.jpg
deleted file mode 100644
index 8ba048255851581a84db16c4d5a50802f7521486..0000000000000000000000000000000000000000
Binary files a/20210114/400_points_breadboard.jpg and /dev/null differ
diff --git a/20210114/Makefile b/20210114/Makefile
deleted file mode 100644
index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000
--- a/20210114/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/20210114/Tower_of_Hanoi.jpeg b/20210114/Tower_of_Hanoi.jpeg
deleted file mode 120000
index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000
--- a/20210114/Tower_of_Hanoi.jpeg
+++ /dev/null
@@ -1 +0,0 @@
-../common/Tower_of_Hanoi.jpeg
\ No newline at end of file
diff --git a/20210114/aufgabe-2.c b/20210114/aufgabe-2.c
deleted file mode 100644
index 1afa7b1260506cb307aff5f929c6357c7bdcb708..0000000000000000000000000000000000000000
--- a/20210114/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/20210114/aufgabe-3.c b/20210114/aufgabe-3.c
deleted file mode 100644
index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000
--- a/20210114/aufgabe-3.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/20210114/bit-operations.txt b/20210114/bit-operations.txt
deleted file mode 100644
index 72160be53e7c5ae912714d2d9cb709747536f6f7..0000000000000000000000000000000000000000
--- a/20210114/bit-operations.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-a = 0100 1111   Bit Nr. 4 auf 1 setzen
-       ^
-    0100 1111
-  | 0001 0000   bitweise Oder-Verknüpfung mit Bit-Maske
-    ---------                                     ~~~~~
-    0101 1111   b = a | mask;
-
-a = 0100 1111   Bit Nr. 4 auf 0 setzen
-  & 1110 1111   bitweise Und-Verknüpfung mit Bit-Maske
-    ---------                                    ~~~~~
-    0100 1111   b = a & mask;
-
-                a = a & mask;
-                a &= mask;
-
-a = 0100 1111   Bit Nr. 6 auf 0 setzen
-  & 1011 1111   bitweise Und-Verknüpfung mit Bit-Maske
-    ---------                                    ~~~~~
-    0000 1111   a &= mask;
-
-Woher bekomme ich die Maske?
-
-  Verschiebe-Operationen:
-    1001 0010 << 2 = 0100 1000   (Die 1 ganz links wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.)
-    1001 0010 >> 2 = 0010 0100   (Die 1 rechts wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.)
-
-    Zahl << 3 = Zahl * 2 hoch 3 = Zahl * 8
-
-  Was wurde herausgeschoben?
-
-    1001 0010 >> 2
-           ~~
-  = 1001 0010
-  & 0000 0011   Maske für die 2 Bits, die gleich herausgeschoben werden
-    ---------
-    0000 0010   Wert ermittelt, der durch ">> 2" verloren gehen wird
-
-Bei Bitverschiebungen schiebt man normalerweise Nullen hinein.
-Ausnahme: negative Zahlen (int) nach rechts schieben --> mit Einsen aufgefüllt
-          (in der Praxis eher unüblich)
-
-Daher verwendet man für Bit-Operationen normalerweise vorzeichenlose Variablen (unsigned)
-anstelle von vorzeichenbehafteten (int)
-
-Maske bauen:  1 << Nr. des Bits
-
-a = 0100 1111   Bit Nr. 4 auf 1 setzen
-       ^
-    0100 1111
-  | 0001 0000   Maske = 1 << 4
-    ---------
-    0101 1111   a |= 1 << 4;
-
-a = 0100 1111   Bit Nr. 6 auf 0 setzen
-  & 1011 1111   Maske = ~(1 << 6)
-    ---------
-    0000 1111   a &= ~(1 << 6);
-
-a = 0100 1111   Zweites Bit von links auf 0 setzen
-  & 1011 1111   Maske = ~(0x80 >> (2 - 1))
-    ---------
-    0000 1111   a &= ~(0x80 >> 1);
-
-Exklusiv-Oder
-
-a = 0100 1111   Bit Nr. 4 umklappen
-       ^
-    0100 1111
-  ^ 0001 0000   Maske = 1 << 4
-    ---------
-    0101 1111   a ^= 1 << 4;
-
-a = 0100 1111   Bit Nr. 6 umklappen
-     ^
-    0100 1111
-  ^ 0100 0000   Maske = 1 << 6
-    ---------
-    0000 1111   a ^= 1 << 6;
diff --git a/20210114/blink-0.c b/20210114/blink-0.c
deleted file mode 100644
index eebbd9e5380e1d38a7e04def7099db9d56cf7770..0000000000000000000000000000000000000000
--- a/20210114/blink-0.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20210114/blink-0.hex b/20210114/blink-0.hex
deleted file mode 100644
index 4a3ecbb32f186d6c742777b223473148e1cef0a4..0000000000000000000000000000000000000000
--- a/20210114/blink-0.hex
+++ /dev/null
@@ -1,10 +0,0 @@
-:100000000C9434000C943E000C943E000C943E0082
-:100010000C943E000C943E000C943E000C943E0068
-:100020000C943E000C943E000C943E000C943E0058
-:100030000C943E000C943E000C943E000C943E0048
-:100040000C943E000C943E000C943E000C943E0038
-:100050000C943E000C943E000C943E000C943E0028
-:100060000C943E000C943E0011241FBECFEFD8E04C
-:10007000DEBFCDBF0E9440000C9445000C940000F0
-:0E0080008CE78AB980E48BB9FFCFF894FFCFEC
-:00000001FF
diff --git a/20210114/blink-0a.c b/20210114/blink-0a.c
deleted file mode 100644
index 569e7c5b9160c1fe750f1b34492dec99ef814012..0000000000000000000000000000000000000000
--- a/20210114/blink-0a.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <avr/io.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  PORTD = 0x41;  /* binär: 0100 0001 */
-  while (1);
-  return 0;
-}
diff --git a/20210114/blink-0b.c b/20210114/blink-0b.c
deleted file mode 100644
index 1f9ee2b0d4bd483103e56c571180f6e50f11dba9..0000000000000000000000000000000000000000
--- a/20210114/blink-0b.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  _delay_ms (1);
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20210114/blink-0c.c b/20210114/blink-0c.c
deleted file mode 100644
index 28fe2e148c88fa68547d55e5ba025a70c5ea42ae..0000000000000000000000000000000000000000
--- a/20210114/blink-0c.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000l
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7d;   /* binär: 0111 1101 */
-  _delay_ms (1);
-  PORTD = 0x40;  /* binär: 0100 0000 */
-  while (1);
-  return 0;
-}
diff --git a/20210114/blink-1.c b/20210114/blink-1.c
deleted file mode 100644
index 1b1b89bfc8426b37c6c10e6dd4583c53604d28e1..0000000000000000000000000000000000000000
--- a/20210114/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 = 0x7c;
-  PORTD |= 0x40;
-  while (1)
-    {
-      _delay_ms (500);
-      PORTD &= ~0x40;
-      _delay_ms (500);
-      PORTD |= 0x40;
-    }
-  return 0;
-}
diff --git a/20210114/blink-2.c b/20210114/blink-2.c
deleted file mode 100644
index 008bfd0c34ba4943318bb1aa1389cd6c96303f27..0000000000000000000000000000000000000000
--- a/20210114/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 = 0x7c;
-  PORTD = 0x40;
-  while (1)
-    {
-      _delay_ms (250);
-      PORTD ^= 0x40;
-    }
-  return 0;
-}
diff --git a/20210114/blink-3.c b/20210114/blink-3.c
deleted file mode 100644
index 590b6197d1f070e58b01354970410c217c5e3228..0000000000000000000000000000000000000000
--- a/20210114/blink-3.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7c;
-  PORTD = 0x40;
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x40;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20210114/blink-3a.c b/20210114/blink-3a.c
deleted file mode 100644
index 388ed658bb7494d5483f311908a1251892aef196..0000000000000000000000000000000000000000
--- a/20210114/blink-3a.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  PORTD = 0x42;  /* binär: 0100 0010: PORT für Input für 1 setzen = internen Pull-Up-Widerstand aktivieren */
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)   /* binär: 0000 0010 */
-        ; /* just wait */
-      PORTD ^= 0x40;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20210114/blink-3c.c b/20210114/blink-3c.c
deleted file mode 100644
index d978187a6dd73fb489ef5a231c92032405715aa7..0000000000000000000000000000000000000000
--- a/20210114/blink-3c.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  PORTD = 0xc0;  /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x40;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20210114/blink-3d.c b/20210114/blink-3d.c
deleted file mode 100644
index 7940918580dac53ea5ca7cb717062a6a2e4fc4d9..0000000000000000000000000000000000000000
--- a/20210114/blink-3d.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0x7c;   /* binär: 0111 1100 */
-  PORTD = 0xc0;  /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x80;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20210114/blink-3e.c b/20210114/blink-3e.c
deleted file mode 100644
index 20dd315377a479c739502993dcb88b28015e9ebc..0000000000000000000000000000000000000000
--- a/20210114/blink-3e.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <avr/io.h>
-
-#define F_CPU 16000000
-#include <util/delay.h>
-
-int main (void)
-{
-  DDRD = 0xfc;   /* binär: 1111 1100 */
-  PORTD = 0xc0;  /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */
-  while (1)
-    {
-      while ((PIND & 0x02) == 0)
-        ; /* just wait */
-      PORTD ^= 0x80;
-      _delay_ms (200);
-    }
-  return 0;
-}
diff --git a/20210114/download.sh b/20210114/download.sh
deleted file mode 100755
index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000
--- a/20210114/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/20210114/hp-2020ws-p3.pdf b/20210114/hp-2020ws-p3.pdf
deleted file mode 100644
index 95e1f2fb877e9e32d0f8d5709938bd291ae1ca09..0000000000000000000000000000000000000000
Binary files a/20210114/hp-2020ws-p3.pdf and /dev/null differ
diff --git a/20210114/hp-2020ws-p3.tex b/20210114/hp-2020ws-p3.tex
deleted file mode 100644
index 42026861efdff7a93709aefd072eff2704db654d..0000000000000000000000000000000000000000
--- a/20210114/hp-2020ws-p3.tex
+++ /dev/null
@@ -1,195 +0,0 @@
-% hp-2020ws-p3.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2021  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: 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 4.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 2020/21\sep
-    Prof.~Dr.~Peter Gerwinski
-  \end{center}
-
-  Aufgabe: Programmieren Sie in C 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 eignet sich u.\,a.\
-        ein \emph{Arduino Uno\/}. \textbf{Wenn Sie keinen Zugang zu einer
-        geeigneten Mi\-kro\-con\-trol\-ler-Ent\-wick\-lungs\-platt\-form haben,
-        sprechen Sie uns an.}
-      \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 \textbf{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}
-
-        Bei Zugriffsproblemen auf die Schnittstelle
-        (hier: \lstinline[style=terminal]{/dev/ttyACM0}) fügen Sie Ihr
-        Benutzerkonto der entsprechenden Gruppe hinzu (normalerweise:
-        \lstinline[style=terminal]{dialout}).
-
-        Notfalls: \lstinline[style=cmd]{sudo chmod 666 /dev/ttyACM0}
-
-      \medskip
-      \item
-        Die Verdrahtung erfolgt üblicherweise auf einer Steckplatine
-        -- 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 kann man auch ein Stück Draht verwenden.
-      \item
-        \textbf{Abgabe:}
-        Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte
-        per E-Mail an \file{peter.gerwinski@hs-bochum.de}
-        mit dem \textbf{Betreff:} \lstinline[style=terminal]{PaoJ6nae}
-        unter Angabe von Name, Matrikel-Nummer,
-        Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS).
-
-    \end{itemize}
-
-    \vspace*{-\medskipamount}
-
-    \strut\hfill\emph{Viel Erfolg!}\\[-3.5cm]
-
-  \end{multicols}
-
-  \vspace*{-5\bigskipamount}
-
-  \begin{figure}[h]
-    \begin{minipage}{7.3cm}
-      \includegraphics[width=8cm]{400_points_breadboard.jpg}
-      \vspace*{-1cm}
-      \caption{Steckplatine\label{Steckplatine}\hspace*{1.2cm}}
-      \vspace*{1cm}
-    \end{minipage}%
-    \begin{picture}(0,0)
-      \put(-1.6,0.0){\makebox(0,0)[tl]{%
-        \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{picture}
-  \end{figure}
-
-  \vspace*{-1.5\bigskipamount}
-
-  \vfill
-
-  \begingroup
-
-    \small
-
-    \setlength{\leftskip}{3cm}
-
-    Stand: 14.\ Januar 2021
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019, 2021\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/20210114/hp-20210114.pdf b/20210114/hp-20210114.pdf
deleted file mode 100644
index 4c5f6beafed5f1166fdb79405c8a180115978dfb..0000000000000000000000000000000000000000
Binary files a/20210114/hp-20210114.pdf and /dev/null differ
diff --git a/20210114/hp-20210114.tex b/20210114/hp-20210114.tex
deleted file mode 100644
index 6b5b28769da539ce5f220a8938da7dad16b86e32..0000000000000000000000000000000000000000
--- a/20210114/hp-20210114.tex
+++ /dev/null
@@ -1,762 +0,0 @@
-% hp-20210114.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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: Hardwarenahe Programmierung: 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.\ Januar 2021}
-
-\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{Algorithmen}
-      \begin{itemize}
-        \item[4.1] Differentialgleichungen
-        \color{medgreen}
-        \item[4.2] Rekursion
-        \item[4.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{black}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \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-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}
-
-\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}<1>
-%    \begin{center}
-%      \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg}
-%    \end{center}
-%  \end{onlyenv}
-
-  \begin{onlyenv}<1->
-    \begin{itemize}
-      \item
-        64 Scheiben, 3 Plätze,
-        \only<1>{\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}<2>
-      \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}<3->
-      \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<16->{\includegraphics{landau-symbols-3.pdf}}%
-                       {\alt<15->{\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-13>
-    \textbf{Beispiel: Sortieralgorithmen}
-
-    \smallskip
-
-    Anzahl der Vergleiche bei $n$ Strings
-    \begin{itemize}
-      \item
-        Maximum suchen \pause[4]mit Schummeln\pause: $\mathcal{O}(1)$
-      \pause
-      \item
-        Maximum suchen\pause: $\mathcal{O}(n)$
-      \pause
-      \item
-        Selection-Sort\pause: $\mathcal{O}(n^2)$
-      \pause
-      \item
-        Bubble-Sort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$
-      \pause
-      \item
-        Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$
-    \end{itemize}
-
-  \end{onlyenv}
-
-  \begin{onlyenv}<14>
-    \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}<15->
-
-    \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<16->{{\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<16->{{\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<16->{{\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}
-
-\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{Algorithmen}
-      \begin{itemize}
-        \item[4.1] Differentialgleichungen
-        \color{medgreen}
-        \item[4.2] Rekursion
-        \item[4.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{black}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-  \vspace*{-1cm}
-
-\end{frame}
-
-\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}5.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}
-
-\end{document}
diff --git a/20210114/hp-musterloesung-20210114.pdf b/20210114/hp-musterloesung-20210114.pdf
deleted file mode 100644
index c154a59ec11e00019d6653f8a309f770ce37a0e6..0000000000000000000000000000000000000000
Binary files a/20210114/hp-musterloesung-20210114.pdf and /dev/null differ
diff --git a/20210114/hp-musterloesung-20210114.tex b/20210114/hp-musterloesung-20210114.tex
deleted file mode 100644
index cb7514e9303ffa538c78d1a9ca7bc5efc8e9b141..0000000000000000000000000000000000000000
--- a/20210114/hp-musterloesung-20210114.tex
+++ /dev/null
@@ -1,392 +0,0 @@
-% hp-musterloesung-20210114.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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{gnuplot-lua-tikz}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 14.\ Januar 2021}
-
-  \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}{2020ws/20210114}{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/20210114/hp-uebung-20210114.pdf b/20210114/hp-uebung-20210114.pdf
deleted file mode 100644
index 785187e80cc5dd88b94bb022298fd377113c2202..0000000000000000000000000000000000000000
Binary files a/20210114/hp-uebung-20210114.pdf and /dev/null differ
diff --git a/20210114/hp-uebung-20210114.tex b/20210114/hp-uebung-20210114.tex
deleted file mode 100644
index 952f3ed10fd5e8a8a2565351c1c14c176e92462b..0000000000000000000000000000000000000000
--- a/20210114/hp-uebung-20210114.tex
+++ /dev/null
@@ -1,266 +0,0 @@
-% hp-uebung-20210114.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, Einfügen in Strings (Ergänzung)
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 14.\ Januar 2021}
-
-  Diese Übung enthält Punkteangaben wie in einer Klausur.
-  Um zu "`bestehen"', müssen Sie innerhalb von 85 Minuten
-  unter Verwendung ausschließlich zugelassener Hilfsmittel
-  17 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}{2020ws/20210114}{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}
-
-  \exercise{Einfügen in Strings (Ergänzung)}
-
-  Diese Aufgabe ist eine Ergänzung von Aufgabe 2 der Übung vom 10.\ Dezember
-  2020 um die Teilaufgaben (e), (f) und (g). Für den "`Klausur-Modus"' können
-  Sie die Teilaufgaben (a) bis (d) als "`bereits gelöst"' voraussetzen.
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210114}{aufgabe-3.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)}?
-      Begründen Sie Ihre Antwort.
-      \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}
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20210114/io-ports-and-interrupts.pdf b/20210114/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20210114/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/20210114/landau-symbols-2.pdf b/20210114/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20210114/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20210114/landau-symbols-3.pdf b/20210114/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20210114/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20210114/landau-symbols.pdf b/20210114/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20210114/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20210114/leds.jpg b/20210114/leds.jpg
deleted file mode 120000
index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000
--- a/20210114/leds.jpg
+++ /dev/null
@@ -1 +0,0 @@
-../common/leds.jpg
\ No newline at end of file
diff --git a/20210114/logo-hochschule-bochum-cvh-text-v2.pdf b/20210114/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210114/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/20210114/logo-hochschule-bochum.pdf b/20210114/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210114/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210114/pendulum.pdf b/20210114/pendulum.pdf
deleted file mode 120000
index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000
--- a/20210114/pendulum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/pendulum.pdf
\ No newline at end of file
diff --git a/20210114/pgscript.sty b/20210114/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210114/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210114/pgslides.sty b/20210114/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210114/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210114/pull-down-widerstand.png b/20210114/pull-down-widerstand.png
deleted file mode 100644
index 3bb39aba9aef4c9e20af37078c00c65395347e7c..0000000000000000000000000000000000000000
Binary files a/20210114/pull-down-widerstand.png and /dev/null differ
diff --git a/20210114/pull-up-kurzschluss.png b/20210114/pull-up-kurzschluss.png
deleted file mode 100644
index c46e8af0f82ae804b3533d5d9f790125ee330a31..0000000000000000000000000000000000000000
Binary files a/20210114/pull-up-kurzschluss.png and /dev/null differ
diff --git a/20210114/pull-up-pull-down-widerstaende.xcf.gz b/20210114/pull-up-pull-down-widerstaende.xcf.gz
deleted file mode 100644
index 6de47102589e3bf76089bc42397388183d077ac3..0000000000000000000000000000000000000000
Binary files a/20210114/pull-up-pull-down-widerstaende.xcf.gz and /dev/null differ
diff --git a/20210114/pull-up-widerstand-intern.png b/20210114/pull-up-widerstand-intern.png
deleted file mode 100644
index b30258e23cb31aef227e982a7911f5fc7223d8c7..0000000000000000000000000000000000000000
Binary files a/20210114/pull-up-widerstand-intern.png and /dev/null differ
diff --git a/20210114/pull-up-widerstand.png b/20210114/pull-up-widerstand.png
deleted file mode 100644
index cce8f393763a0364d793953295b5b9322f288681..0000000000000000000000000000000000000000
Binary files a/20210114/pull-up-widerstand.png and /dev/null differ
diff --git a/20210121/Makefile b/20210121/Makefile
deleted file mode 100644
index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/alignment-1.c b/20210121/alignment-1.c
deleted file mode 100644
index 815b4562a8f1c4aac3dac5ff3ddc3f5452bbaee7..0000000000000000000000000000000000000000
--- a/20210121/alignment-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t a = 42;
-  uint16_t b = 1117;
-  uint8_t c = 23;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-}
diff --git a/20210121/alignment-2.c b/20210121/alignment-2.c
deleted file mode 100644
index 23de308c39c5f7301c7c8b90c0078a003de21bd0..0000000000000000000000000000000000000000
--- a/20210121/alignment-2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t a = 42;
-  uint16_t b = 1117;
-  uint8_t c = 23;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  a = 0;
-  b = 0;
-  c = 0;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-}
diff --git a/20210121/alignment-3.c b/20210121/alignment-3.c
deleted file mode 100644
index 6a7dd0a3c8debd1fdc0e06912d0895820c08311c..0000000000000000000000000000000000000000
--- a/20210121/alignment-3.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t a = 42;
-  uint16_t b = 1117;
-  uint8_t c = 23;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  uint32_t *p = &a;
-  *p = 0;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-}
diff --git a/20210121/alignment-4.c b/20210121/alignment-4.c
deleted file mode 100644
index e073043765778ba75a1a002b5e86a672f1e03cea..0000000000000000000000000000000000000000
--- a/20210121/alignment-4.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t a = 42;
-  uint16_t b = 1117;
-  uint8_t c = 23;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  uint32_t *p = (uint32_t *) &a;
-  *p = 0;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-}
diff --git a/20210121/alignment-5-32.s b/20210121/alignment-5-32.s
deleted file mode 100644
index d4df40706c2e1e59bd3c15f2df1cba1bebafb722..0000000000000000000000000000000000000000
--- a/20210121/alignment-5-32.s
+++ /dev/null
@@ -1,83 +0,0 @@
-	.file	"alignment-5.c"
-	.text
-	.section	.rodata
-.LC0:
-	.string	"a = %d, b = %d, c = %d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB0:
-	.cfi_startproc
-	leal	4(%esp), %ecx
-	.cfi_def_cfa 1, 0
-	andl	$-16, %esp
-	pushl	-4(%ecx)
-	pushl	%ebp
-	.cfi_escape 0x10,0x5,0x2,0x75,0
-	movl	%esp, %ebp
-	pushl	%ebx
-	pushl	%ecx
-	.cfi_escape 0xf,0x3,0x75,0x78,0x6
-	.cfi_escape 0x10,0x3,0x2,0x75,0x7c
-	subl	$16, %esp
-	call	__x86.get_pc_thunk.bx
-	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
-	movb	$42, -17(%ebp)                        # #include <stdio.h>
-	movw	$1117, -10(%ebp)                      # #include <stdint.h>
-	movb	$23, -11(%ebp)                        #
-	movzbl	-11(%ebp), %ecx                       # int main (void)
-	movzwl	-10(%ebp), %edx                       # {
-	movzbl	-17(%ebp), %eax                       #   uint8_t a = 42;
-	movzbl	%al, %eax                             #   uint16_t b = 1117;
-	pushl	%ecx                                  #   uint8_t c = 23;
-	pushl	%edx                                  #   printf ("a = %d, b = %d, c = %d\n", a, b, c);
-	pushl	%eax                                  #   uint64_t *p = (uint64_t *) &a;
-	leal	.LC0@GOTOFF(%ebx), %eax               #   *p = 0;
-	pushl	%eax                                  #   printf ("a = %d, b = %d, c = %d\n", a, b, c);
-	call	printf@PLT                            # }
-	addl	$16, %esp
-	leal	-17(%ebp), %eax
-	movl	%eax, -16(%ebp)
-	movl	-16(%ebp), %eax
-	movl	$0, (%eax)
-	movl	$0, 4(%eax)                           #  -9 \ b
-	movzbl	-11(%ebp), %ecx                       # -10 /      -.
-	movzwl	-10(%ebp), %edx                       # -11 - c     |
-	movzbl	-17(%ebp), %eax                       # -12         |
-	movzbl	%al, %eax                             # -13          } auf 0 gesetzt
-	pushl	%ecx                                  # -14         |
-	pushl	%edx                                  # -15         |
-	pushl	%eax                                  # -16         |
-	leal	.LC0@GOTOFF(%ebx), %eax               # -17 - a    -'
-	pushl	%eax
-	call	printf@PLT
-	addl	$16, %esp
-	movl	$0, %eax
-	leal	-8(%ebp), %esp
-	popl	%ecx
-	.cfi_restore 1
-	.cfi_def_cfa 1, 0
-	popl	%ebx
-	.cfi_restore 3
-	popl	%ebp
-	.cfi_restore 5
-	leal	-4(%ecx), %esp
-	.cfi_def_cfa 4, 4
-	ret
-	.cfi_endproc
-.LFE0:
-	.size	main, .-main
-	.section	.text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
-	.globl	__x86.get_pc_thunk.bx
-	.hidden	__x86.get_pc_thunk.bx
-	.type	__x86.get_pc_thunk.bx, @function
-__x86.get_pc_thunk.bx:
-.LFB1:
-	.cfi_startproc
-	movl	(%esp), %ebx
-	ret
-	.cfi_endproc
-.LFE1:
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20210121/alignment-5.c b/20210121/alignment-5.c
deleted file mode 100644
index 913c5c8a81eedddf8463acee10262875bd6c84d7..0000000000000000000000000000000000000000
--- a/20210121/alignment-5.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-
-int main (void)
-{
-  uint8_t a = 42;
-  uint16_t b = 1117;
-  uint8_t c = 23;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-  uint64_t *p = (uint64_t *) &a;
-  *p = 0;
-  printf ("a = %d, b = %d, c = %d\n", a, b, c);
-}
diff --git a/20210121/answer-32.s b/20210121/answer-32.s
deleted file mode 100644
index d8649e6678dfed4bb2abeb06533fa123c195c861..0000000000000000000000000000000000000000
--- a/20210121/answer-32.s
+++ /dev/null
@@ -1,68 +0,0 @@
-	.file	"answer.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	leal	4(%esp), %ecx
-	.cfi_def_cfa 1, 0
-	andl	$-16, %esp
-	pushl	-4(%ecx)
-	pushl	%ebp
-	.cfi_escape 0x10,0x5,0x2,0x75,0                   # #include <stdio.h>
-	movl	%esp, %ebp                                #
-	pushl	%ebx                                      # int answer = 23;
-	pushl	%ecx                                      #
-	.cfi_escape 0xf,0x3,0x75,0x78,0x6                 # int main (void)
-	.cfi_escape 0x10,0x3,0x2,0x75,0x7c                # {
-	call	__x86.get_pc_thunk.bx                     #   answer += 19;
-	addl	$_GLOBAL_OFFSET_TABLE_, %ebx              #   printf ("%d\n", answer);
-	movl	answer@GOTOFF(%ebx), %eax                 #   return 0;
-	addl	$19, %eax                                 # }
-	movl	%eax, answer@GOTOFF(%ebx)
-	subl	$8, %esp
-	pushl	%eax
-	leal	.LC0@GOTOFF(%ebx), %eax
-	pushl	%eax
-	call	printf@PLT
-	addl	$16, %esp
-	movl	$0, %eax
-	leal	-8(%ebp), %esp
-	popl	%ecx
-	.cfi_restore 1
-	.cfi_def_cfa 1, 0
-	popl	%ebx
-	.cfi_restore 3
-	popl	%ebp
-	.cfi_restore 5
-	leal	-4(%ecx), %esp
-	.cfi_def_cfa 4, 4
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.globl	answer
-	.data
-	.align 4
-	.type	answer, @object
-	.size	answer, 4
-answer:
-	.long	23
-	.section	.text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
-	.globl	__x86.get_pc_thunk.bx
-	.hidden	__x86.get_pc_thunk.bx
-	.type	__x86.get_pc_thunk.bx, @function
-__x86.get_pc_thunk.bx:
-.LFB12:
-	.cfi_startproc
-	movl	(%esp), %ebx
-	ret
-	.cfi_endproc
-.LFE12:
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20210121/answer.c b/20210121/answer.c
deleted file mode 100644
index 2da5fc39c50955e3ac5588d12fa1ca6d9ac949eb..0000000000000000000000000000000000000000
--- a/20210121/answer.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-int answer = 23;
-
-int main (void)
-{
-  answer += 19;
-  printf ("%d\n", answer);
-  return 0;
-}
diff --git a/20210121/answer.disassemble b/20210121/answer.disassemble
deleted file mode 100644
index d5682bdc46f53067217941a2fdc00d082637b515..0000000000000000000000000000000000000000
--- a/20210121/answer.disassemble
+++ /dev/null
@@ -1,16 +0,0 @@
-(gdb) disassemble /r main
-Dump of assembler code for function main:
-   0x0000000000001135 <+0>:     48 83 ec 08             sub    $0x8,%rsp
-   0x0000000000001139 <+4>:     8b 05 f1 2e 00 00       mov    0x2ef1(%rip),%eax        # 0x4030 <answer>
-   0x000000000000113f <+10>:    8d 70 13                lea    0x13(%rax),%esi
-   0x0000000000001142 <+13>:    89 35 e8 2e 00 00       mov    %esi,0x2ee8(%rip)        # 0x4030 <answer>
-   0x0000000000001148 <+19>:    48 8d 3d b5 0e 00 00    lea    0xeb5(%rip),%rdi         # 0x2004
-   0x000000000000114f <+26>:    b8 00 00 00 00          mov    $0x0,%eax
-   0x0000000000001154 <+31>:    e8 d7 fe ff ff          callq  0x1030 <printf@plt>
-   0x0000000000001159 <+36>:    b8 00 00 00 00          mov    $0x0,%eax
-   0x000000000000115e <+41>:    48 83 c4 08             add    $0x8,%rsp
-   0x0000000000001162 <+45>:    c3                      retq
-End of assembler dump.
-
-                                ^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^
-                                Maschinensprache        Assembler
diff --git a/20210121/answer.s b/20210121/answer.s
deleted file mode 100644
index 69cf9a26f4abc713b067f4231c831f80fd3a7e31..0000000000000000000000000000000000000000
--- a/20210121/answer.s
+++ /dev/null
@@ -1,35 +0,0 @@
-	.file	"answer.c"
-	.text
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC0:
-	.string	"%d\n"
-	.text
-	.globl	main
-	.type	main, @function
-main:
-.LFB11:
-	.cfi_startproc
-	subq	$8, %rsp
-	.cfi_def_cfa_offset 16                #  #include <stdio.h>
-	movl	answer(%rip), %eax            #
-	leal	19(%rax), %esi                #  int answer = 23;
-	movl	%esi, answer(%rip)            #
-	leaq	.LC0(%rip), %rdi              #  int main (void)
-	movl	$0, %eax                      #  {
-	call	printf@PLT                    #    answer += 19;
-	movl	$0, %eax                      #    printf ("%d\n", answer);
-	addq	$8, %rsp                      #    return 0;
-	.cfi_def_cfa_offset 8                 #  }
-	ret
-	.cfi_endproc
-.LFE11:
-	.size	main, .-main
-	.globl	answer
-	.data
-	.align 4
-	.type	answer, @object
-	.size	answer, 4
-answer:
-	.long	23
-	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/20210121/aufgabe-1.c b/20210121/aufgabe-1.c
deleted file mode 100644
index 2afae773ac2d564771ab6dfb473eed664070d3e2..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/aufgabe-3.c b/20210121/aufgabe-3.c
deleted file mode 100644
index 4c95eb6ad4881c904448309c6b7c46fa101cc109..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-10.c b/20210121/blink-10.c
deleted file mode 100644
index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-11.c b/20210121/blink-11.c
deleted file mode 100644
index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-4.c b/20210121/blink-4.c
deleted file mode 100644
index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-5.c b/20210121/blink-5.c
deleted file mode 100644
index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-6.c b/20210121/blink-6.c
deleted file mode 100644
index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-7.c b/20210121/blink-7.c
deleted file mode 100644
index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-8.c b/20210121/blink-8.c
deleted file mode 100644
index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/blink-9.c b/20210121/blink-9.c
deleted file mode 100644
index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/download.sh b/20210121/download.sh
deleted file mode 100755
index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/hp-20210121.pdf b/20210121/hp-20210121.pdf
deleted file mode 100644
index e0f51da4e38d05cbe6d9579219c40989592e5691..0000000000000000000000000000000000000000
Binary files a/20210121/hp-20210121.pdf and /dev/null differ
diff --git a/20210121/hp-20210121.tex b/20210121/hp-20210121.tex
deleted file mode 100644
index a6704ae89220c1bbcc3c97ac9253f5e579342ee9..0000000000000000000000000000000000000000
--- a/20210121/hp-20210121.tex
+++ /dev/null
@@ -1,909 +0,0 @@
-% hp-20210121.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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: Hardwarenahe Programmierung: Interrupts, volatile-Variable, Byte-Reihenfolge – Endianness, 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{21.\ Januar 2021}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{red}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \vspace*{-\smallskipamount}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{4}
-\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}5.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<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}
-
-\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}
-
-\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}
-
-\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{Algorithmen}
-      \begin{itemize}
-        \item[4.1] Differentialgleichungen
-        \item[4.2] Rekursion
-        \item[4.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{medgreen}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20210121/hp-musterloesung-20210121.pdf b/20210121/hp-musterloesung-20210121.pdf
deleted file mode 100644
index 4d248668921e1a7249fc1a824d203d91111b5ec4..0000000000000000000000000000000000000000
Binary files a/20210121/hp-musterloesung-20210121.pdf and /dev/null differ
diff --git a/20210121/hp-musterloesung-20210121.tex b/20210121/hp-musterloesung-20210121.tex
deleted file mode 100644
index fed8134934bf225fd302175327ef4566c6c29482..0000000000000000000000000000000000000000
--- a/20210121/hp-musterloesung-20210121.tex
+++ /dev/null
@@ -1,417 +0,0 @@
-% hp-musterloesung-20210121.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, LED-Blinkmuster
-
-\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 -- 21.\ Januar 2021}
-
-  \exercise{Trickprogrammierung}
-
-  Wir betrachten das folgende Programm (Datei: \gitfile{hp}{2020ws/20210121}{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}{2020ws/20210121}{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}{2020ws/20210121}{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}{2020ws/20210121}{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}{2020ws/20210121}{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}{2020ws/20210121}{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}{2020ws/20210121}{loesung-2.c} erfolgt entsprechend \lstinline{printf()}
-      nur im Testprogramm \lstinline{main()}.)
-  \end{itemize}
-
-  \exercise{LED-Blinkmuster}
-
-  Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller
-  (Datei: \gitfile{hp}{2020ws/20210121}{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/20210121/hp-uebung-20210121.pdf b/20210121/hp-uebung-20210121.pdf
deleted file mode 100644
index e792a29159a340d20df23d0c722b5cf89a06c88a..0000000000000000000000000000000000000000
Binary files a/20210121/hp-uebung-20210121.pdf and /dev/null differ
diff --git a/20210121/hp-uebung-20210121.tex b/20210121/hp-uebung-20210121.tex
deleted file mode 100644
index 354a9448ea8c30fd5086f932d7cf55ab51b00b7d..0000000000000000000000000000000000000000
--- a/20210121/hp-uebung-20210121.tex
+++ /dev/null
@@ -1,226 +0,0 @@
-% hp-uebung-20210121.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, LED-Blinkmuster
-
-\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 -- 21.\ Januar 2021}
-
-  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{Trickprogrammierung}
-
-  Wir betrachten das folgende Programm (Datei: \gitfile{hp}{2020ws/20210121}{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}
-
-  \exercise{LED-Blinkmuster}
-
-  Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller
-  (Datei: \gitfile{hp}{2020ws/20210121}{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/20210121/io-ports-and-interrupts.pdf b/20210121/io-ports-and-interrupts.pdf
deleted file mode 120000
index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/loesung-1-1.c b/20210121/loesung-1-1.c
deleted file mode 100644
index 26fcc817796b3da118b5dda92f45bfb870e315b6..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/loesung-1-2.c b/20210121/loesung-1-2.c
deleted file mode 100644
index 7151db69b2e675f17517d7b7c3814bbda3b1fa89..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/loesung-1-3.c b/20210121/loesung-1-3.c
deleted file mode 100644
index fadccdef1155e4d16b5da0c8a82d8e7ae76ca3cc..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/loesung-2.c b/20210121/loesung-2.c
deleted file mode 100644
index b02d98b51b9bc525a567afea2f0dce5a8e6413a5..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/logo-hochschule-bochum-cvh-text-v2.pdf b/20210121/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210121/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/20210121/logo-hochschule-bochum.pdf b/20210121/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210121/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210121/pgscript.sty b/20210121/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210121/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210121/pgslides.sty b/20210121/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210121/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210128/aufgabe-1.c b/20210128/aufgabe-1.c
deleted file mode 100644
index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/aufgabe-2.c b/20210128/aufgabe-2.c
deleted file mode 100644
index 47595ef0658e94d76a42263e82200f94895cdeea..0000000000000000000000000000000000000000
--- a/20210128/aufgabe-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;
-  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/20210128/aufgabe-3a.c b/20210128/aufgabe-3a.c
deleted file mode 100644
index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/aufgabe-3b.c b/20210128/aufgabe-3b.c
deleted file mode 100644
index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/dynmem-1.c b/20210128/dynmem-1.c
deleted file mode 100644
index 129ae368b75355aecac8fca803af968e196bf720..0000000000000000000000000000000000000000
--- a/20210128/dynmem-1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  char **name = malloc (3 * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < 3; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-1.png b/20210128/dynmem-1.png
deleted file mode 100644
index 0101156f78c381c9d6d60936169e1e7a93219139..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem-1.png and /dev/null differ
diff --git a/20210128/dynmem-10.c b/20210128/dynmem-10.c
deleted file mode 100644
index 277cf78b0436195f2935d12e38d927024bfa80b7..0000000000000000000000000000000000000000
--- a/20210128/dynmem-10.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  free (new_name);
-  name[N - 1] = "Dieter";
-
-  N++;
-  new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  free (new_name);
-  name[N - 1] = "Emma";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-11.c b/20210128/dynmem-11.c
deleted file mode 100644
index 6ec1aeb467cef507991f32afa47d47478a8346f6..0000000000000000000000000000000000000000
--- a/20210128/dynmem-11.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;
-  name[N - 1] = "Dieter";
-
-  N++;
-  new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;
-  name[N - 1] = "Emma";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-12.c b/20210128/dynmem-12.c
deleted file mode 100644
index 646fab6f8a4f1266715b4307b9dc7db4b04dd75d..0000000000000000000000000000000000000000
--- a/20210128/dynmem-12.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    {
-      new_name[i] = name[i];
-      free (name[i]);
-    }
-  free (name);
-  name = new_name;
-  name[N - 1] = "Dieter";
-
-  N++;
-  new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    {
-      new_name[i] = name[i];
-      free (name[i]);
-    }
-  free (name);
-  name = new_name;
-  name[N - 1] = "Emma";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-13.c b/20210128/dynmem-13.c
deleted file mode 100644
index 05edde0ad90c61c4b297ba400352df62f326f1de..0000000000000000000000000000000000000000
--- a/20210128/dynmem-13.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int N = 3;
-char **name = NULL;
-
-void insert_string (char *s)
-{
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  free (name);
-  name = new_name;
-  name[N - 1] = s;
-}
-
-int main (void)
-{
-  name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  insert_string ("Dieter");
-  insert_string ("Emma");
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-14.c b/20210128/dynmem-14.c
deleted file mode 100644
index f337059fba37de6f43964354863d04e7123284d0..0000000000000000000000000000000000000000
--- a/20210128/dynmem-14.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int N = 3;
-char **name = NULL;
-
-void insert_string (char *s)
-{
-  N++;
-  name = realloc (name, N * sizeof (char *));
-  name[N - 1] = s;
-}
-
-int main (void)
-{
-  name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  insert_string ("Dieter");
-  insert_string ("Emma");
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-2.c b/20210128/dynmem-2.c
deleted file mode 100644
index e002b3326b70b6fd2b2fb76e033c0b0b13abfb84..0000000000000000000000000000000000000000
--- a/20210128/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] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < 3; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  name[3] = "Dieter";
-
-  printf ("\n");
-  for (int i = 0; i < 4; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-2.png b/20210128/dynmem-2.png
deleted file mode 100644
index 21cd6b75758a8202ee7ddeca930a85d728e3d1a4..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem-2.png and /dev/null differ
diff --git a/20210128/dynmem-3.c b/20210128/dynmem-3.c
deleted file mode 100644
index ae842579f633fcee8bae8a91047360a142786635..0000000000000000000000000000000000000000
--- a/20210128/dynmem-3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  name[3] = "Dieter";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-3.png b/20210128/dynmem-3.png
deleted file mode 100644
index bbd582d32eea3d7d76701c5a881538e30874165e..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem-3.png and /dev/null differ
diff --git a/20210128/dynmem-4.c b/20210128/dynmem-4.c
deleted file mode 100644
index 2aecf6de2971501e4519c78a69aefe08269968e7..0000000000000000000000000000000000000000
--- a/20210128/dynmem-4.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  for (int i = 0; i < 10; i++)
-    {
-      N++;
-      name[3] = "Dieter";
-    }
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-4.png b/20210128/dynmem-4.png
deleted file mode 100644
index ff2d7f4029dd0263f124ed802062a354350c60c6..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem-4.png and /dev/null differ
diff --git a/20210128/dynmem-5.c b/20210128/dynmem-5.c
deleted file mode 100644
index 25dfd9363aa601db04ac7209b76fcafebdc971ef..0000000000000000000000000000000000000000
--- a/20210128/dynmem-5.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;                      /* Falsch! */
-  name[3] = "Dieter";
-  N++;
-  name[4] = "Emma";         /* Ausgabe führt zu Absturz! */
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-5.png b/20210128/dynmem-5.png
deleted file mode 100644
index 460a66351b2f6bce9e491cb9c2139b2b29661e79..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem-5.png and /dev/null differ
diff --git a/20210128/dynmem-6.c b/20210128/dynmem-6.c
deleted file mode 100644
index be115dbf74d7c0585b7b46be3c4b8bab9ddcc0b1..0000000000000000000000000000000000000000
--- a/20210128/dynmem-6.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-void print_names (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  /* Speicherleck: Der Zeiger "name" verschwindet, aber die 24 Bytes,
-     auf die er zeigt, sind weiterhin belegt. */
-}
-
-int main (void)
-{
-  print_names ();
-  print_names ();
-  print_names ();
-  print_names ();
-  print_names ();
-  return 0;
-}
diff --git a/20210128/dynmem-7.c b/20210128/dynmem-7.c
deleted file mode 100644
index e6f4605ce35755f425af2018b51121e97f8b323d..0000000000000000000000000000000000000000
--- a/20210128/dynmem-7.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-void print_names (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-
-  /* Kein Speicherleck: Bevor der Zeiger "name" verschwindet,
-     geben wir die 24 Bytes, auf die er zeigt, wieder frei. */
-
-  /* Garbage Collection: Die Standard-Bibliothek der Programmiersprache
-     sorgt dafür, daß nicht mehr benötigte Speicherbereiche automatisch
-     wieder freigegeben werden. C macht das nicht. */
-}
-
-int main (void)
-{
-  print_names ();
-  print_names ();
-  print_names ();
-  print_names ();
-  print_names ();
-  return 0;
-}
diff --git a/20210128/dynmem-8.c b/20210128/dynmem-8.c
deleted file mode 100644
index 235b7be5f8360ff3764a6453ff2716aaa5142167..0000000000000000000000000000000000000000
--- a/20210128/dynmem-8.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  name[N - 1] = "Dieter";
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  name[N - 1] = "Emma";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem-9.c b/20210128/dynmem-9.c
deleted file mode 100644
index ff863c1e4324ae44d1528b5aff13e9a9722fe4a7..0000000000000000000000000000000000000000
--- a/20210128/dynmem-9.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int main (void)
-{
-  int N = 3;
-  char **name = malloc (N * sizeof (char *));
-  name[0] = "Anna";
-  name[1] = "Berthold";
-  name[2] = "Caesar";
-
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  N++;
-  char **new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  name[N - 1] = "Dieter";
-
-  N++;
-  new_name = malloc (N * sizeof (char *));
-  for (int i = 0; i < N - 1; i++)
-    new_name[i] = name[i];
-  name = new_name;
-  name[N - 1] = "Emma";
-
-  printf ("\n");
-  for (int i = 0; i < N; i++)
-    printf ("name[%d] = %s\n", i, name[i]);
-
-  free (name);
-  return 0;
-}
diff --git a/20210128/dynmem.xcf.gz b/20210128/dynmem.xcf.gz
deleted file mode 100644
index 9277bf3e60bafc997d8f4bc4fe6f163c364b57f6..0000000000000000000000000000000000000000
Binary files a/20210128/dynmem.xcf.gz and /dev/null differ
diff --git a/20210128/hello-gtk.png b/20210128/hello-gtk.png
deleted file mode 120000
index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000
--- a/20210128/hello-gtk.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/hello-gtk.png
\ No newline at end of file
diff --git a/20210128/hp-20210128.pdf b/20210128/hp-20210128.pdf
deleted file mode 100644
index 2f7012a249447a82c6d97afb9afd8378019fdefa..0000000000000000000000000000000000000000
Binary files a/20210128/hp-20210128.pdf and /dev/null differ
diff --git a/20210128/hp-20210128.tex b/20210128/hp-20210128.tex
deleted file mode 100644
index f291a0036f102c6dd7f28748db0e62e580a0745c..0000000000000000000000000000000000000000
--- a/20210128/hp-20210128.tex
+++ /dev/null
@@ -1,1404 +0,0 @@
-% hp-20210128.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{rotating}
-\usepackage{tikz}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{28.\ Januar 2021}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{medgreen}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-%        \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}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\end{frame}
-
-\setcounter{section}{4}
-\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}
-
-\nosectionnonumber{Aufgabe}
-
-\begin{frame}[fragile]
-
-  \shownosectionnonumber
-
-  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}
-
-  \bigskip
-
-  Diese Aufgabe berührt die Themen
-  "`Umgang mit Arrays und Zeigern"', "`Bit-Manipulation"'
-  und je nach Implementierung auch "`objektorientierte Programmierung"'.
-  Dies zu begründen, ist Teil der Aufgabe.
-
-\end{frame}
-
-\addtocounter{subsection}{1}
-
-\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}
-
-\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}
-
-  \smallskip
-
-  Verwechselungsgefahr: most/least significant byte
-
-\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}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \item[5.1] Bit-Operationen
-        \item[5.2] I/O-Ports
-        \color{medgreen}
-        \item[5.3] Interrupts
-        \item[5.4] volatile-Variable
-        \item[5.6] Byte-Reihenfolge -- Endianness
-        \item[5.7] Binärdarstellung negativer Zahlen
-        \item[5.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{red}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \vspace*{-\smallskipamount}
-        \item[\dots]
-%        \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}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\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 \textarrow\ \newterm{Objekt}
-    \item
-      Problem: Die Elemente sind unterschiedlich groß (Speicherplatz).
-    \item
-      Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf.
-  \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.05){\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.05){\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 \textarrow\ \newterm{Objekt}
-    \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{Klassenhierarchie} 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}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \item[6.3] Unions
-        \item[6.4] Virtuelle Methoden
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20210128/hp-musterloesung-20210128.pdf b/20210128/hp-musterloesung-20210128.pdf
deleted file mode 100644
index 05884e3ee698a07f1924d6b18f57a8c29c7374e9..0000000000000000000000000000000000000000
Binary files a/20210128/hp-musterloesung-20210128.pdf and /dev/null differ
diff --git a/20210128/hp-musterloesung-20210128.tex b/20210128/hp-musterloesung-20210128.tex
deleted file mode 100644
index 93131492c646f3186f1715c1f7e4bf4a1bb23b88..0000000000000000000000000000000000000000
--- a/20210128/hp-musterloesung-20210128.tex
+++ /dev/null
@@ -1,763 +0,0 @@
-% hp-musterloesung-20210128.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, Personen-Datenbank, objektorientierte Tier-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 28.\ Januar 2021}
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{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 Ausgabe 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}
-
-  \exercise{Personen-Datenbank}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-2.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.
-
-  \exercise{Objektorientierte Tier-Datenbank}
-
-  Das unten dargestellte Programm (Datei: \gitfile{hp}{2020ws/20210128}{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}{2020ws/20210128}{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}{2020ws/20210128}{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}{2020ws/20210128}{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}{2020ws/20210128}{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}{2020ws/20210128}{loesung-3e.c}.
-      
-      Diese Lösung basiert auf \gitfile{hp}{2020ws/20210128}{loesung-3d-2.c},
-      da diese bereits weniger explizite Typumwandlungen enthält
-      als \gitfile{hp}{2020ws/20210128}{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}{2020ws/20210128}{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}{2020ws/20210128}{loesung-3g.c}.
-
-  \end{itemize}
-
-\end{document}
diff --git a/20210128/hp-uebung-20210128.pdf b/20210128/hp-uebung-20210128.pdf
deleted file mode 100644
index 350451858390509e6e1c0b4e13eee0ebf42d2f8f..0000000000000000000000000000000000000000
Binary files a/20210128/hp-uebung-20210128.pdf and /dev/null differ
diff --git a/20210128/hp-uebung-20210128.tex b/20210128/hp-uebung-20210128.tex
deleted file mode 100644
index 49b831bc5b00720a0e3ff714da0aff587878253b..0000000000000000000000000000000000000000
--- a/20210128/hp-uebung-20210128.tex
+++ /dev/null
@@ -1,305 +0,0 @@
-% hp-uebung-20210128.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, Personen-Datenbank, objektorientierte Tier-Datenbank
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 28.\ Januar 2021}
-
-  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
-  17 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Speicherformate von Zahlen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{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{Personen-Datenbank}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-2.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}
-
-  \clearpage
-  \exercise{Objektorientierte Tier-Datenbank}
-
-  Das unten dargestellte Programm (Datei: \gitfile{hp}{2020ws/20210128}{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}{2020ws/20210128}{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/20210128/loesung-1-1.c b/20210128/loesung-1-1.c
deleted file mode 100644
index 175923f7250d0747a21df5f33f8a3761393d1d7f..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-1-2.c b/20210128/loesung-1-2.c
deleted file mode 100644
index 07ca06832cc58c1b8243f9afd05aec57bb12b1c4..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-2-1.c b/20210128/loesung-2-1.c
deleted file mode 100644
index 416c5dfa2cba2f7dc68b72551ec6a5c8ce8bab79..0000000000000000000000000000000000000000
--- a/20210128/loesung-2-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/20210128/loesung-2-2.c b/20210128/loesung-2-2.c
deleted file mode 100644
index 825373e61475ebc67e9cac6929b6e004715a7cad..0000000000000000000000000000000000000000
--- a/20210128/loesung-2-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/20210128/loesung-2-3.c b/20210128/loesung-2-3.c
deleted file mode 100644
index 7a4b1bfaf9e67a164ee865a0ae4ef69606255de0..0000000000000000000000000000000000000000
--- a/20210128/loesung-2-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/20210128/loesung-2-4.c b/20210128/loesung-2-4.c
deleted file mode 100644
index 3c635dfa7e3923eb678469166bf218e1640927a2..0000000000000000000000000000000000000000
--- a/20210128/loesung-2-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/20210128/loesung-3d-0f.c b/20210128/loesung-3d-0f.c
deleted file mode 100644
index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-3d-1.c b/20210128/loesung-3d-1.c
deleted file mode 100644
index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-3d-2.c b/20210128/loesung-3d-2.c
deleted file mode 100644
index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-3e.c b/20210128/loesung-3e.c
deleted file mode 100644
index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-3f.c b/20210128/loesung-3f.c
deleted file mode 100644
index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/loesung-3g.c b/20210128/loesung-3g.c
deleted file mode 100644
index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/logo-hochschule-bochum-cvh-text-v2.pdf b/20210128/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/logo-hochschule-bochum.pdf b/20210128/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210128/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210128/objects-1.c b/20210128/objects-1.c
deleted file mode 100644
index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-2.c b/20210128/objects-2.c
deleted file mode 100644
index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-3.c b/20210128/objects-3.c
deleted file mode 100644
index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-3a.c b/20210128/objects-3a.c
deleted file mode 100644
index a285a87d72694f5259a8a736ab448383e7004580..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-4.c b/20210128/objects-4.c
deleted file mode 100644
index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-5.c b/20210128/objects-5.c
deleted file mode 100644
index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-5a.c b/20210128/objects-5a.c
deleted file mode 100644
index 14f1cadd3a7d0954abdd844249d73656322c9e89..0000000000000000000000000000000000000000
--- a/20210128/objects-5a.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdio.h>
-
-typedef struct
-{
-  int nutzlos;
-  int type;
-} t_base;
-
-typedef struct
-{
-  int content;
-  int type;
-} t_integer;
-
-typedef struct
-{
-  char *content;
-  int type;
-} t_string;
-
-int main (void)
-{
-  t_integer i = { 42, 1 };
-  t_string s = { "Hello, world!", 2 };
-
-  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/20210128/objects-6.c b/20210128/objects-6.c
deleted file mode 100644
index 86847c9085083e2d5093026619550fb272b5f4ec..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-7.c b/20210128/objects-7.c
deleted file mode 100644
index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-8.c b/20210128/objects-8.c
deleted file mode 100644
index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-8a.c b/20210128/objects-8a.c
deleted file mode 100644
index 76c3cc56ab586e07d5342c4421e7e77be1ead15d..0000000000000000000000000000000000000000
--- a/20210128/objects-8a.c
+++ /dev/null
@@ -1,61 +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;
-
-char *content = "Ätsch.";
-
-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/20210128/objects-8b.c b/20210128/objects-8b.c
deleted file mode 100644
index a9d7b5a296a8fb0c822ae0274773dbe6f1c372c7..0000000000000000000000000000000000000000
--- a/20210128/objects-8b.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_base *new_integer (int i)
-{
-  t_integer *p = malloc (sizeof (t_integer));
-  p->type = T_INTEGER;
-  p->content = i;
-  return (t_base *) p;
-}
-
-t_base *new_string (char *s)
-{
-  t_string *p = malloc (sizeof (t_string));
-  p->type = T_STRING;
-  p->content = s;
-  return (t_base *) p;
-} 
-
-int main (void)
-{
-  t_base *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/20210128/objects-9.c b/20210128/objects-9.c
deleted file mode 100644
index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/objects-9a.c b/20210128/objects-9a.c
deleted file mode 100644
index 46431c9dbd4366c8175a6e3284a271080f175822..0000000000000000000000000000000000000000
--- a/20210128/objects-9a.c
+++ /dev/null
@@ -1,68 +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]);
-
-  for (int i = 0; object[i]; i++)
-    free (object[i]);
-  return 0;
-}
diff --git a/20210128/pgscript.sty b/20210128/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210128/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210128/pgslides.sty b/20210128/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210128/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210128/strings-1.c b/20210128/strings-1.c
deleted file mode 100644
index a3d7c16599ce22bcdccce64b5c3abbe0cffbe08e..0000000000000000000000000000000000000000
--- a/20210128/strings-1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char *hello = "Hello";
-  hello[1] = 'a';
-  printf ("%s\n", hello);
-  return 0;
-}
diff --git a/20210128/strings-1.png b/20210128/strings-1.png
deleted file mode 100644
index 842fcec427c07479e65f5a75610891c3448b01b6..0000000000000000000000000000000000000000
Binary files a/20210128/strings-1.png and /dev/null differ
diff --git a/20210128/strings-2.c b/20210128/strings-2.c
deleted file mode 100644
index 9e0ede926f7ff007f5d3f900af45e59328825302..0000000000000000000000000000000000000000
--- a/20210128/strings-2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-
-int main (void)
-{
-  char hello[] = "Hello";
-  hello[1] = 'a';
-  printf ("%s\n", hello);
-  return 0;
-}
diff --git a/20210128/strings-2.png b/20210128/strings-2.png
deleted file mode 100644
index fe399a77a49858d585d47927267baa5b98a13d6e..0000000000000000000000000000000000000000
Binary files a/20210128/strings-2.png and /dev/null differ
diff --git a/20210128/unions-1.c b/20210128/unions-1.c
deleted file mode 100644
index b75a6063b50193e13e9a2fd0ce140db6a8827499..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/unions-2.c b/20210128/unions-2.c
deleted file mode 100644
index 8f3c5d8411b6f68e25a1e981e0a811d8015e3526..0000000000000000000000000000000000000000
--- a/20210128/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/20210128/unions-3.c b/20210128/unions-3.c
deleted file mode 100644
index 2162c065714146572a88da29babe54246afe61c6..0000000000000000000000000000000000000000
--- a/20210128/unions-3.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 ("%ld\n", test.x);
-  return 0;
-}
diff --git a/20210128/unions-4.c b/20210128/unions-4.c
deleted file mode 100644
index 5838bc1c2d6eef69ac36dad50e1ebc14d0b64f68..0000000000000000000000000000000000000000
--- a/20210128/unions-4.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 = { x: 478560413000 };
-  printf ("%s\n", test.s);
-  return 0;
-}
diff --git a/20210204/aufgabe-1a.c b/20210204/aufgabe-1a.c
deleted file mode 100644
index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000
--- a/20210204/aufgabe-1a.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/20210204/aufgabe-1b.c b/20210204/aufgabe-1b.c
deleted file mode 100644
index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000
--- a/20210204/aufgabe-1b.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/20210204/aufgabe-2.c b/20210204/aufgabe-2.c
deleted file mode 100644
index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/hello-gtk.png b/20210204/hello-gtk.png
deleted file mode 120000
index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000
--- a/20210204/hello-gtk.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/hello-gtk.png
\ No newline at end of file
diff --git a/20210204/hp-2020ws-p4.pdf b/20210204/hp-2020ws-p4.pdf
deleted file mode 100644
index 1f17c91ca4ab823ea9f3781f79b36d148b0d36c6..0000000000000000000000000000000000000000
Binary files a/20210204/hp-2020ws-p4.pdf and /dev/null differ
diff --git a/20210204/hp-2020ws-p4.tex b/20210204/hp-2020ws-p4.tex
deleted file mode 100644
index bb2a1a765df1d1bcf2cf122b32fc68e0df2b75fa..0000000000000000000000000000000000000000
--- a/20210204/hp-2020ws-p4.tex
+++ /dev/null
@@ -1,200 +0,0 @@
-% hp-2020ws-p4.pdf - Labor Notes on Low-Level Programming
-% Copyright (C) 2014, 2015, 2016, 2018, 2019, 2020, 2021  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: 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 2020/21\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}{2020ws/20210128}{objects-9.c} zeigt,
-      wie man in C verschiedenartige Objekte
-      in einem Array von Zeigern verwaltet.
-    \item
-      Das Beispielprogramm \gitfile{hp}{2020ws/script}{gtk-6.c} zeigt,
-      wie man mit Hilfe der GUI-Bibliothek GTK+
-      verschiedene Objekte in ein Fenster zeichnet.
-    \item
-      Das Beispielprogramm \gitfile{hp}{2020ws/script}{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}{2020ws/script}{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.)
-    \item
-      \textbf{Abgabe:}
-      Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte
-      per E-Mail an \file{peter.gerwinski@hs-bochum.de}
-      mit dem \textbf{Betreff:} \lstinline[style=terminal]{eif7booD}
-      unter Angabe von Name, Matrikel-Nummer,
-      Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS).
-  \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/2020ws/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: 4.\ Februar 2021
-
-%    Soweit nicht anders angegeben:\\
-    Copyright \copyright\ 2014, 2015, 2016, 2018, 2019, 2020, 2021\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/20210204/hp-20210204.pdf b/20210204/hp-20210204.pdf
deleted file mode 100644
index 1906c32d866445597b7611b8a74ccda92b49806a..0000000000000000000000000000000000000000
Binary files a/20210204/hp-20210204.pdf and /dev/null differ
diff --git a/20210204/hp-20210204.tex b/20210204/hp-20210204.tex
deleted file mode 100644
index 037525827465f0a7f481dfd24dcfb969fed21905..0000000000000000000000000000000000000000
--- a/20210204/hp-20210204.tex
+++ /dev/null
@@ -1,702 +0,0 @@
-% hp-20210204.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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: virtuelle Methoden
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{rotating}
-\usepackage{tikz}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{4.\ Februar 2021}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \item[6.3] Unions
-        \color{red}
-        \item[6.4] Virtuelle Methoden
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-    \vspace*{-1cm}
-  \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 \textarrow\ \newterm{Objekt}
-    \item
-      Problem: Die Elemente sind unterschiedlich groß (Speicherplatz).
-    \item
-      Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf.
-  \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.05){\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.05){\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 \textarrow\ \newterm{Objekt}
-    \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{Klassenhierarchie} 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]
-        ¡tobject *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}
-    \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}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \item[6.3] Unions
-        \color{medgreen}
-        \item[6.4] Virtuelle Methoden
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\end{frame}
-
-\end{document}
diff --git a/20210204/hp-musterloesung-20210204.pdf b/20210204/hp-musterloesung-20210204.pdf
deleted file mode 100644
index 2e8c876bf111098365da8cf9547fdf3296c55cc6..0000000000000000000000000000000000000000
Binary files a/20210204/hp-musterloesung-20210204.pdf and /dev/null differ
diff --git a/20210204/hp-musterloesung-20210204.tex b/20210204/hp-musterloesung-20210204.tex
deleted file mode 100644
index 458400cdc557311597c6efaaee6783d61491971e..0000000000000000000000000000000000000000
--- a/20210204/hp-musterloesung-20210204.tex
+++ /dev/null
@@ -1,629 +0,0 @@
-% hp-musterloesung-20210204.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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 Tier-Datenbank (Neuauflage), Iterationsfunktionen, dynamisches Bit-Array
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 4.\ Februar 2021}
-
-  \exercise{Objektorientierte Tier-Datenbank (Neuauflage)}
-
-  Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der
-  Übung vom 28.\ Januar 2021,\\
-  ergänzt um die Teilaufgaben (e) bis (g).
-
-  \medskip
-
-  Das auf der nächsten Seite dargestellte Programm
-  (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1a.c})
-  soll Daten von Tieren verwalten.
-
-  Beim Compilieren erscheinen die folgende Fehlermeldungen:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-1a.c -o aufgabe-1a¿
-    aufgabe-1a.c: In function 'main':
-    aufgabe-1a.c:31: error: 'animal' has no member named 'wings'
-    aufgabe-1a.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}{2020ws/20210204}{aufgabe-1b.c}).
-  Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-1b.c -o aufgabe-1b¿
-    $ ¡./aufgabe-1b¿
-    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}{2020ws/20210204}{loesung-1d-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}{2020ws/20210204}{loesung-1d-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}{2020ws/20210204}{loesung-1d-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}{2020ws/20210204}{loesung-1e.c}.
-      
-      Diese Lösung basiert auf \gitfile{hp}{2020ws/20210204}{loesung-1d-2.c},
-      da diese bereits weniger explizite Typumwandlungen enthält
-      als \gitfile{hp}{2020ws/20210204}{loesung-1d-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}{2020ws/20210204}{loesung-1f.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}{2020ws/20210204}{loesung-1g.c}.
-
-  \end{itemize}
-
-  \clearpage
-
-  \exercise{Iterationsfunktionen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210204}{loesung-1.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}{2020ws/20210204}{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}{2020ws/20210204}{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 folgenden \textbf{Hinweise} beschreiben
-  einen möglichen Weg, die Aufgabe zu lösen.
-  Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen.
-  \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}{2020ws/20210204}{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}{2020ws/20210204}{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}{2020ws/20210204}{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}{2020ws/20210204}{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}
-
-\end{document}
diff --git a/20210204/hp-uebung-20210204.pdf b/20210204/hp-uebung-20210204.pdf
deleted file mode 100644
index b0b178e5c4573e66b3c4dad8392afd2fcd61f901..0000000000000000000000000000000000000000
Binary files a/20210204/hp-uebung-20210204.pdf and /dev/null differ
diff --git a/20210204/hp-uebung-20210204.tex b/20210204/hp-uebung-20210204.tex
deleted file mode 100644
index bef613ff2e7feff1584b6a485869365486b95933..0000000000000000000000000000000000000000
--- a/20210204/hp-uebung-20210204.tex
+++ /dev/null
@@ -1,303 +0,0 @@
-% hp-uebung-20210204.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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 Tier-Datenbank (Neuauflage), Iterationsfunktionen, dynamisches Bit-Array
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 4.\ Februar 2021}
-
-%  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
-%  17 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Objektorientierte Tier-Datenbank (Neuauflage)}
-
-  Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der
-  Übung vom 28.\ Januar 2021,\\
-  ergänzt um die Teilaufgaben (e) bis (g).
-
-  \medskip
-
-  Das auf der nächsten Seite dargestellte Programm
-  (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1a.c})
-  soll Daten von Tieren verwalten.
-
-  Beim Compilieren erscheinen die folgende Fehlermeldungen:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-1a.c -o aufgabe-1a¿
-    aufgabe-1a.c: In function 'main':
-    aufgabe-1a.c:31: error: 'animal' has no member named 'wings'
-    aufgabe-1a.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}{2020ws/20210204}{aufgabe-1b.c}).
-  Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet:
-  \begin{lstlisting}[style=terminal]
-    $ ¡gcc -std=c99 -Wall -O aufgabe-1b.c -o aufgabe-1b¿
-    $ ¡./aufgabe-1b¿
-    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}
-
-  \exercise{Iterationsfunktionen}
-
-  Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210204}{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}
-
-  \clearpage
-
-  \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 folgenden \textbf{Hinweise} beschreiben
-  einen möglichen Weg, die Aufgabe zu lösen.
-  Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen.
-  \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.)
-
-  \begin{flushright}
-    \textit{Viel Erfolg!}
-  \end{flushright}
-
-  \makeatletter
-    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-  \makeatother
-
-\end{document}
diff --git a/20210204/loesung-1d-0f.c b/20210204/loesung-1d-0f.c
deleted file mode 100644
index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000
--- a/20210204/loesung-1d-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/20210204/loesung-1d-1.c b/20210204/loesung-1d-1.c
deleted file mode 100644
index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000
--- a/20210204/loesung-1d-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/20210204/loesung-1d-2.c b/20210204/loesung-1d-2.c
deleted file mode 100644
index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000
--- a/20210204/loesung-1d-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/20210204/loesung-1e.c b/20210204/loesung-1e.c
deleted file mode 100644
index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000
--- a/20210204/loesung-1e.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/20210204/loesung-1f.c b/20210204/loesung-1f.c
deleted file mode 100644
index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000
--- a/20210204/loesung-1f.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/20210204/loesung-1g.c b/20210204/loesung-1g.c
deleted file mode 100644
index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000
--- a/20210204/loesung-1g.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/20210204/loesung-3-1.c b/20210204/loesung-3-1.c
deleted file mode 100644
index 11ad08a28a2c16e645e4b55c1b0f4556246fd692..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/loesung-3-2.c b/20210204/loesung-3-2.c
deleted file mode 100644
index e510904b033cf7d55737cee55ad08ecb9510f324..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/loesung-3-3.c b/20210204/loesung-3-3.c
deleted file mode 100644
index 4177464aebf41205169a6bb02b27ac972e3a4f4e..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/loesung-3-4.c b/20210204/loesung-3-4.c
deleted file mode 100644
index 1930580aae8e8b24528852d1dacf58051f6bd6cc..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/logo-hochschule-bochum-cvh-text-v2.pdf b/20210204/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/logo-hochschule-bochum.pdf b/20210204/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210204/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210204/objects-10.c b/20210204/objects-10.c
deleted file mode 100644
index ac47c0ed5479be655b7d76aba558526b2dc774a3..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/objects-11.c b/20210204/objects-11.c
deleted file mode 100644
index a15c8eb239b2315845f24f3b4f111d3670d7ea33..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/objects-11a.c b/20210204/objects-11a.c
deleted file mode 100644
index 8be8d4eb28ccc2ea950d601a2b1da4c2a38270dc..0000000000000000000000000000000000000000
--- a/20210204/objects-11a.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)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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/20210204/objects-11b.c b/20210204/objects-11b.c
deleted file mode 100644
index 3b3a798df03399f69f6704ac1391d22781c6fd30..0000000000000000000000000000000000000000
--- a/20210204/objects-11b.c
+++ /dev/null
@@ -1,76 +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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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/20210204/objects-11c.c b/20210204/objects-11c.c
deleted file mode 100644
index 50c5c3acfe2e66f7b847f4120419c6044447ee1f..0000000000000000000000000000000000000000
--- a/20210204/objects-11c.c
+++ /dev/null
@@ -1,76 +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, char *comment);
-  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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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/20210204/objects-11d.c b/20210204/objects-11d.c
deleted file mode 100644
index 283a3ec68063dbb6da72efa2cf64e20897dff296..0000000000000000000000000000000000000000
--- a/20210204/objects-11d.c
+++ /dev/null
@@ -1,76 +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, char *comment);
-  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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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], "Dies ist ein Test.");
-
-  return 0;
-}
diff --git a/20210204/objects-11e.c b/20210204/objects-11e.c
deleted file mode 100644
index 47184be39f60e173479bf93e40361b77d93a2bb0..0000000000000000000000000000000000000000
--- a/20210204/objects-11e.c
+++ /dev/null
@@ -1,76 +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, char *comment);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, char *comment);
-  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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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], "Dies ist ein Test.");
-
-  return 0;
-}
diff --git a/20210204/objects-11f.c b/20210204/objects-11f.c
deleted file mode 100644
index 6c4673803a82e0f4ab055d536cdc3b12f37afc2b..0000000000000000000000000000000000000000
--- a/20210204/objects-11f.c
+++ /dev/null
@@ -1,77 +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, char *comment);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, char *comment);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, char *comment);
-  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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this, char *comment)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-  (void) comment;
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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], "Dies ist ein Test.");
-
-  return 0;
-}
diff --git a/20210204/objects-11g.c b/20210204/objects-11g.c
deleted file mode 100644
index 80b6e8a012850dab7c62fe326a7e76104f7ff035..0000000000000000000000000000000000000000
--- a/20210204/objects-11g.c
+++ /dev/null
@@ -1,82 +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, char *comment);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, char *comment);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, char *comment);
-  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, char *comment)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-void print_string (t_object *this, char *comment)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-  printf ("Kommentar: %s\n", comment);
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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], "Dies ist ein Test.");
-
-  return 0;
-}
diff --git a/20210204/objects-11h.c b/20210204/objects-11h.c
deleted file mode 100644
index 717922a974268fb97ee62cea074ef99545b34c08..0000000000000000000000000000000000000000
--- a/20210204/objects-11h.c
+++ /dev/null
@@ -1,81 +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, void *data);
-} t_base;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, void *data);
-  int content;
-} t_integer;
-
-typedef struct
-{
-  int type;
-  void (* print) (union t_object *this, void *data);
-  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, void *data)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  if (data)
-    {
-      char *comment = data;
-      printf ("Kommentar: %s\n", comment);
-    }
-}
-
-void print_string (t_object *this, void *data)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-  (void) data;
-}
-
-t_object *new_integer (int i)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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], "Dies ist ein Test.");
-
-  return 0;
-}
diff --git a/20210204/objects-11i.c b/20210204/objects-11i.c
deleted file mode 100644
index bda518a83af77239e526a86b329abf34d10ffd2f..0000000000000000000000000000000000000000
--- a/20210204/objects-11i.c
+++ /dev/null
@@ -1,79 +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;
-  char *comment;
-} 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)  /* virtuelle Methode des Objekts t_integer */
-{
-  printf ("Integer: %d\n", this->integer.content);
-  if (this->integer.comment)
-    printf ("Kommentar: %s\n", this->integer.comment);
-}
-
-void print_string (t_object *this)  /* virtuelle Methode des Objekts t_string */
-{
-  printf ("String: \"%s\"\n", this->string.content);
-}
-
-t_object *new_integer (int i, char *comment)  /* Konstruktor des Objekts t_integer */
-{
-  t_object *p = malloc (sizeof (t_integer));  /* Anforderung von Speicherplatz */
-  p->integer.type = T_INTEGER;
-  p->integer.print = print_integer;  /* Zuweisung der virtuellen Methode */
-  p->integer.content = i;  /* Initialisierung des Objekts */
-  p->integer.comment = comment;  /* Initialisierung des Objekts */
-  return p;
-}
-
-t_object *new_string (char *s)  /* Konstruktor des Objekts t_string */
-{
-  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, "Dies ist ein Test."),
-                         new_string ("Hello, world!"),
-                         NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->base.print (object[i]);
-
-  return 0;
-}
diff --git a/20210204/objects-12.c b/20210204/objects-12.c
deleted file mode 100644
index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000
--- a/20210204/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/20210204/objects-13.c b/20210204/objects-13.c
deleted file mode 100644
index 8cbf2d435ce6642568a809660b8d63866963450a..0000000000000000000000000000000000000000
--- a/20210204/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->string.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/20210204/objects-13a.c b/20210204/objects-13a.c
deleted file mode 100644
index 83d01abade9685d4f591570e03ea080fbde8b6d2..0000000000000000000000000000000000000000
--- a/20210204/objects-13a.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->base.vmt = &vmt_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->base.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/20210204/objects-14.c b/20210204/objects-14.c
deleted file mode 100644
index acd20b5af1a6a425da4d6af47e03185e224e3461..0000000000000000000000000000000000000000
--- a/20210204/objects-14.c
+++ /dev/null
@@ -1,82 +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_integer_with_comment (t_object *this, char *comment)
-{
-  printf ("%s: %d\n", comment, 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->base.vmt = &vmt_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->base.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]);
-
-  print_integer_with_comment (object[1], "Die Antwort lautet");
-
-  return 0;
-}
diff --git a/20210204/objects-15.c b/20210204/objects-15.c
deleted file mode 100644
index b0ef5540e78cd00ce615ae19b34a23157d9f13ef..0000000000000000000000000000000000000000
--- a/20210204/objects-15.c
+++ /dev/null
@@ -1,82 +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_integer_with_comment (t_object *this, char *comment)
-{
-  printf ("%s: %d\n", comment, 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->base.vmt = &vmt_integer;
-  p->integer.content = i;
-  return p;
-}
-
-t_object *new_string (char *s)
-{
-  t_object *p = malloc (sizeof (t_string));
-  p->base.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]);
-
-  print_integer_with_comment (object[0], "Die Antwort lautet");
-
-  return 0;
-}
diff --git a/20210204/objects-16.cpp b/20210204/objects-16.cpp
deleted file mode 100644
index ea40a139bacadb6ce4de30312bb0c1b6c21d9c8e..0000000000000000000000000000000000000000
--- a/20210204/objects-16.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-
-struct TBase
-{
-  virtual void print () = 0;
-};
-
-struct TInteger: TBase
-{
-  int content;
-  virtual void print ();
-  TInteger (int i);
-};
-
-struct TString: TBase
-{
-  char *content;
-  virtual void print ();
-  TString (char *s);
-};
-
-void TInteger::print ()
-{
-  printf ("Integer: %d\n", content);
-}
-
-void TString::print ()
-{
-  printf ("String: \"%s\"\n", content);
-}
-
-TInteger::TInteger (int i)
-{
-  content = i;
-}
-
-TString::TString (char *s)
-{
-  content = s;
-}
-
-int main (void)
-{
-  TBase *object[] = { new TInteger (42),
-                      new TString ("Hello, world!"),
-                      NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->print ();
-
-  return 0;
-}
diff --git a/20210204/pgscript.sty b/20210204/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210204/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210204/pgslides.sty b/20210204/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210204/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210211/aufgabe-1.c b/20210211/aufgabe-1.c
deleted file mode 100644
index 82e5b1ca9e2f896bcbec98bc5c34cdf15d086e26..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/aufgabe-2.c b/20210211/aufgabe-2.c
deleted file mode 100644
index f26ce5d665012e2cdbaac8b0f43f01d40f338254..0000000000000000000000000000000000000000
--- a/20210211/aufgabe-2.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-void output_list (node *first)
-{
-  for (node *p = first; p; p = p->next)
-    printf ("%d ", p->content);
-  printf ("\n");
-}
-
-void insert_into_list (node *what, node *where)
-{
-  what->next = where->next;
-  where->next = what;
-}
-
-int main (void)
-{
-  node *element3 = malloc (sizeof (node));
-  node *element7 = malloc (sizeof (node));
-  node *element137 = malloc (sizeof (node));
-
-  element3->content = 3;
-  element7->content = 7;
-  element137->content = 137;
-
-  node *first = element3;
-  element3->next = element7;
-  element7->next = element137;
-  element137->next = NULL;
-
-  output_list (first);
-
-  node *element5 = malloc (sizeof (node));
-  element5->content = 5;
-  insert_into_list (element5, element3);
-
-  output_list (first);
-
-  return 0;
-}
diff --git a/20210211/baeume-1.txt b/20210211/baeume-1.txt
deleted file mode 100644
index c397a0bfab179bee2d9cf5fb74731fc89b8337ed..0000000000000000000000000000000000000000
--- a/20210211/baeume-1.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Zahlen von 0 bis 14 in einem Baum
-
-best case: O(log n) - "ausbalancierter Baum"
-
-                 7
-
-
-        3               11
-     1      5       9       13
-   0  2   4  6     8 10   12  14
-
-worst case: O(n) - "entarteter Baum"
-
-   0
-     1
-       2
-         3
-           4
-            ...
-               14
diff --git a/20210211/fifo-1.c b/20210211/fifo-1.c
deleted file mode 100644
index 8bce6c07c152381c11ce367027b980a9330be3e0..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-2.c b/20210211/fifo-2.c
deleted file mode 100644
index f95579893f62180b408ecb10756ac8938b3c9848..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-3.c b/20210211/fifo-3.c
deleted file mode 100644
index 5214e1b28fb1b060bdaeea7be09e346a644e7f5d..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-4.c b/20210211/fifo-4.c
deleted file mode 100644
index 957d5f18f6c8fe9d7c057db3d2467221b9dc463e..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-5.c b/20210211/fifo-5.c
deleted file mode 100644
index 092c1cdb5863d5c7bdac98f48ca8527ca3520e6b..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-6.c b/20210211/fifo-6.c
deleted file mode 100644
index 2f055d6ce6df4c2fca950192053a6e008bed38b4..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-6a.c b/20210211/fifo-6a.c
deleted file mode 100644
index 6a7b2d3c138908cb7eb06379b9c574f262717af0..0000000000000000000000000000000000000000
--- a/20210211/fifo-6a.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_pointer; 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/20210211/fifo-7.c b/20210211/fifo-7.c
deleted file mode 100644
index 0d739115c136639f64c4d98c439af7e4d72fe420..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-8.c b/20210211/fifo-8.c
deleted file mode 100644
index b4ff68713645e0a5782b516071022bf71a8c50ac..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/fifo-9.c b/20210211/fifo-9.c
deleted file mode 100644
index 27f77412bac52fd70c52378c25531f03bd93d734..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/hello-gtk.png b/20210211/hello-gtk.png
deleted file mode 120000
index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000
--- a/20210211/hello-gtk.png
+++ /dev/null
@@ -1 +0,0 @@
-../common/hello-gtk.png
\ No newline at end of file
diff --git a/20210211/hp-20210211.pdf b/20210211/hp-20210211.pdf
deleted file mode 100644
index 1a7c24d02c73d27c93d48f4e4eb307e255ec0952..0000000000000000000000000000000000000000
Binary files a/20210211/hp-20210211.pdf and /dev/null differ
diff --git a/20210211/hp-20210211.tex b/20210211/hp-20210211.tex
deleted file mode 100644
index e7641ee2847378b4e1e5b17bb60f1ffa2bf79d62..0000000000000000000000000000000000000000
--- a/20210211/hp-20210211.tex
+++ /dev/null
@@ -1,1187 +0,0 @@
-% hp-20210211.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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: virtuelle Methoden
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-\usepackage{rotating}
-\usepackage{tikz}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{11.\ Februar 2021}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \item[6.3] Unions
-        \color{medgreen}
-        \item[6.4] Virtuelle Methoden
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-    \vspace*{-1cm}
-  \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 \textarrow\ \newterm{Objekt}
-    \item
-      Problem: Die Elemente sind unterschiedlich groß (Speicherplatz).
-    \item
-      Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf.
-  \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.05){\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.05){\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 \textarrow\ \newterm{Objekt}
-    \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{Klassenhierarchie} 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]
-        ¡tobject *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}
-    \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}
-        \vspace*{-1cm}
-      \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}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-      \begin{itemize}
-        \item[6.0] Dynamische Speicherverwaltung
-        \item[6.1] Konzepte und Ziele
-        \item[6.2] Beispiel: Zahlen und Buchstaben
-        \item[6.3] Unions
-        \color{medgreen}
-        \item[6.4] Virtuelle Methoden
-        \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI)
-        \item[6.6] Ausblick: C++
-      \end{itemize}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\end{frame}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-      \begin{itemize}
-        \color{red}
-        \item[7.1] Stack und FIFO
-        \item[7.2] Verkettete Listen
-        \item[7.3] Bäume
-      \end{itemize}
-    \vspace*{-1cm}
-  \end{itemize}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-    \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}
-
-\end{frame}
-
-\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{Algorithmen}
-    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
-    \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
-    \item[\textbf{7}] \textbf{Datenstrukturen}
-      \begin{itemize}
-        \item[7.1] Stack und FIFO
-        \item[7.2] Verkettete Listen
-        \item[7.3] Bäume
-      \end{itemize}
-  \end{itemize}
-
-  \begin{flushright}
-    \large\bf\em\color{medgreen}Vielen Dank für Ihre Aufmerksamkeit\\
-      und viel Erfolg bei den Prüfungen!
-  \end{flushright}
-
-\end{frame}
-
-\end{document}
diff --git a/20210211/hp-musterloesung-20210211.pdf b/20210211/hp-musterloesung-20210211.pdf
deleted file mode 100644
index dabd16ee9cad834b0785b2fb6bd1f82980e60dec..0000000000000000000000000000000000000000
Binary files a/20210211/hp-musterloesung-20210211.pdf and /dev/null differ
diff --git a/20210211/hp-musterloesung-20210211.tex b/20210211/hp-musterloesung-20210211.tex
deleted file mode 100644
index f0c1dd2e22b4afe80c6ccd1b2f2749a4651a948f..0000000000000000000000000000000000000000
--- a/20210211/hp-musterloesung-20210211.tex
+++ /dev/null
@@ -1,604 +0,0 @@
-% hp-musterloesung-20210211.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, einfach und doppelt verkettete Listen, ternärer Baum
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{tikz}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 11.\ Februar 2021}
-
-  \exercise{Stack-Operationen}
-
-  Das folgende Programm (\gitfile{hp}{2020ws/20210211}{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}
-
-  \goodbreak
-
-  \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}{2020ws/20210211}{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}{2020ws/20210211}{loesung-1b-1.c})
-      oder die Schleife von oben nach unten durchlaufen
-      (siehe \gitfile{hp}{2020ws/20210211}{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}{2020ws/20210211}{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}{2020ws/20210211}{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}{2020ws/20210211}{loesung-1d.c}) --
-      wie in der Funktion \lstinline{push_sorted()}
-      im Beispiel-Programm \gitfile{hp}{2020ws/20210211}{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}
-
-  \goodbreak
-
-  \exercise{Einfach und doppelt verkettete Listen}
-
-  Das Beispiel-Programm \gitfile{hp}{2020ws/20210211}{aufgabe-2.c}
-  demonstriert zwei Funktionen zur Verwaltung einfach verketteter Listen:
-  \lstinline{output_list()} zum Ausgeben der Liste auf den Bildschirm und
-  \lstinline{insert_into_list()} zum Einfügen in die Liste.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Ergänzen Sie eine Funktion \lstinline{delete_from_list()}
-      zum Löschen eines Elements aus der Liste
-      mit Freigabe des Speicherplatzes.
-      \points{5}
-    \item
-      Ergänzen Sie eine Funktion \lstinline{reverse_list()}
-      die die Reihenfolge der Elemente in der Liste umdreht.\\
-      \points{3}
-  \end{enumerate}
-
-  Eine doppelt verkettete Liste hat in jedem Knotenpunkt (\lstinline{node})
-  \emph{zwei\/} Zeiger -- einen auf das nächste Element (\lstinline{next})
-  und einen auf das vorherige Element (z.\,B.\ \lstinline{prev} für "`previous"').
-  Dadurch ist es leichter als bei einer einfach verketteten Liste,
-  die Liste in umgekehrter Reihenfolge durchzugehen.
-
-  \begin{quote}
-    \begin{tikzpicture}
-      \color{blendedblue}
-      \node(first) at (0,3.5) {first};
-      \node(NULL1) at (-1,1.25) {NULL};
-      \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(NULL2) at (7,2.75) {NULL};
-      \draw[-latex](first)--(3);
-      \draw[-latex](3) to[out=45,in=135] (7);
-      \draw[-latex](3) to[out=-135,in=0] (NULL1);
-      \draw[-latex](7) to[out=-135,in=-45] (3);
-      \draw[-latex](7) to[out=45,in=135] (137);
-      \draw[-latex](137) to[out=-135,in=-45] (7);
-      \draw[-latex](137) to[out=45,in=180] (NULL2);
-    \end{tikzpicture}
-  \end{quote}
-
-  Der Rückwärts-Zeiger (\lstinline{prev}) des ersten Elements zeigt,
-  genau wie der Vorwärts-Zeiger (\lstinline{next}) des letzten Elements,
-  auf \emph{nichts}, hat also den Wert \lstinline{NULL}.
-
-  \begin{enumerate}[\quad(a)]\setcounter{enumi}{2}
-    \item
-      Schreiben Sie das Programm um für doppelt verkettete Listen.
-      \points{5}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Ergänzen Sie eine Funktion \lstinline{delete_from_list()}
-      zum Löschen eines Elements aus der Liste
-      mit Freigabe des Speicherplatzes.}
-
-      Siehe: \gitfile{hp}{2020ws/20210211}{loesung-2a.c}
-
-      Um ein Element aus einer verketteten Liste zu löschen,
-      müssen zuerst die Zeiger umgestellt werden,
-      um das Element von der Liste auszuschließen.
-      Erst danach darf der Speicherplatz für das Element freigegeben werden.
-
-%      Da das Beispielprogramm (\gitfile{hp}{2020ws/20210211}{lists-5.c})
-%      nicht mit dynamischem Speicher arbeitet,
-%      stellen wir dieses zunächst auf dynamischen Speicher um, z.\,B.:
-%      \begin{lstlisting}[gobble=8]
-%        node *element5 = malloc (sizeof (node));
-%      \end{lstlisting}
-%      Danach bezeichnet \lstinline{element5}
-%      die Adresse der \lstinline{struct}-Variablen;
-%      es wird also \lstinline{element5} an die Funktionen übergeben
-%      und nicht \lstinline{&element5} (die Adresse des Zeigers).
-
-%      Um nun ein Element aus der Liste zu entfernen,
-%      benötigt man
-      Man benötigt also
-      \emph{das vorherige Element},
-      dessen \lstinline{next}-Zeiger man dann auf
-      das übernächste Element \lstinline{next->next} weitersetzt.
-
-      Bei jedem Zeiger muß man vor dem Zugriff prüfen,
-      daß dieser nicht auf \lstinline{NULL} zeigt.
-      (Die Musterlösung ist in dieser Hinsicht nicht konsequent.
-      Für den Produktiveinsatz müßte z.\,B.\ \lstinline{delete_from_list()}
-      auch den übergebenen Zeiger \lstinline{what} auf \lstinline{NULL} prüfen.)
-
-      Ein Spezialfall tritt ein, wenn das erste Element einer Liste
-      entfernt werden soll. In diesem Fall tritt \lstinline{first}
-      an die Stelle des \lstinline{next}-Zeigers
-      des (nicht vorhandenen) vorherigen Elements.
-      Da \lstinline{delete_from_list()} \emph{schreibend\/} auf \lstinline{first}
-      zugreift, muß \lstinline{first} \emph{als Zeiger\/} übergeben werden
-      (\lstinline{node **first}).
-
-      Um alle Spezialfälle zu testen (am Anfang, am Ende und in der Mitte der Liste),
-      wurden die Testfälle im Hauptprogramm erweitert.
-
-    \item
-      \textbf{Schreiben Sie das Programm um für doppelt verkettete Listen.}
-
-      Siehe: \gitfile{hp}{2020ws/20210211}{loesung-2b.c}
-
-      Bei allen Einfüge- und Löschaktionen müssen \emph{jeweils zwei\/}
-      \lstinline{next}- und \lstinline{prev}-Zeiger neu gesetzt werden.
-
-      Zum Debuggen empfiehlt es sich sehr,
-      eine Funktion zu schreiben, die die Liste auf Konsistenz prüft
-      (hier: \lstinline{check_list()}).
-
-      Das Testprogramm macht von der Eigenschaft der doppelt verketteten Liste,
-      daß man sie auch rückwärts effizient durchgehen kann, keinen Gebrauch.
-      Um diese Eigenschaft als Vorteil nutzen zu können, empfiehlt es sich,
-      zusätzlich zu \lstinline{first}
-      auch einen Zeiger auf das letzte Element (z.\,B.\ \lstinline{last})
-      einzuführen. Dieser muß dann natürlich bei allen Operationen
-      (Einfügen, Löschen, \dots) auf dem aktuellen Stand gehalten werden.
-
-  \end{enumerate}
-
-  \exercise{Ternärer Baum}
-
-  Der in der Vorlesung vorgestellte \newterm{binäre Baum\/}
-  ist nur ein Spezialfall;
-  im allgemeinen können Bäume auch mehr als zwei Verzweigungen
-  pro Knotenpunkt haben.
-  Dies ist nützlich bei der Konstruktion \emph{balancierter Bäume},
-  also solcher, die auch im \emph{Worst Case\/}
-  nicht zu einer linearen Liste entarten,
-  sondern stets eine -- möglichst flache -- Baumstruktur behalten.
-
-  Wir betrachten einen Baum mit bis zu drei Verzweigungen pro Knotenpunkt,
-  einen sog.\ \newterm{ternären Baum}.
-  Jeder Knoten enthält dann nicht nur einen,
-  sondern \emph{zwei\/} Werte als Inhalt:
-
-  \begin{lstlisting}
-    typedef struct node
-    {
-      int content_left, content_right;
-      struct node *left, *middle, *right;
-    } node;
-  \end{lstlisting}
-
-  Wir konstruieren nun einen Baum nach folgenden Regeln:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item
-      Innerhalb eines Knotens sind die Werte sortiert:
-      \lstinline{content_left} muß stets kleiner sein als \lstinline{content_right}.
-    \item
-      Der Zeiger \lstinline{left} zeigt auf Knoten,
-      deren enthaltene Werte durchweg kleiner sind als \lstinline{content_left}.
-    \item
-      Der Zeiger \lstinline{right} zeigt auf Knoten,
-      deren enthaltene Werte durchweg größer sind als \lstinline{content_right}.
-    \item
-      Der Zeiger \lstinline{middle} zeigt auf Knoten,
-      deren enthaltene Werte durchweg größer sind als \lstinline{content_left},
-      aber kleiner als \lstinline{content_right}.
-    \item
-      Ein Knoten muß nicht immer mit zwei Werten voll besetzt sein;
-      er darf auch \emph{nur einen\/} gültigen Wert enthalten.
-
-      Der Einfachheit halber lassen wir in diesem Beispiel
-      nur positive Zahlen als Werte zu.
-      Wenn ein Knoten nur einen Wert enthält,
-      setzen wir \lstinline{content_right = -1},
-      und der Zeiger \lstinline{middle} wird nicht verwendet.
-    \item
-      Wenn wir neue Werte in den Baum einfügen,
-      werden \emph{zuerst\/} die nicht voll besetzten Knoten aufgefüllt
-      und \emph{danach erst\/} neue Knoten angelegt und Zeiger gesetzt.
-    \item
-      Beim Auffüllen eines Knotens darf nötigenfalls \lstinline{content_left}
-      nach \lstinline{content_right} verschoben werden.
-      Ansonsten werden einmal angelegte Knoten nicht mehr verändert.
-  \end{itemize}
-  \vspace*{-\medskipamount}
-  (In der Praxis dürfen Knoten gemäß speziellen Regeln
-  nachträglich verändert werden,
-  um Entartungen gar nicht erst entstehen zu lassen --
-  siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}.)
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Zeichnen Sie ein Schaubild, das veranschaulicht,
-      wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12
-      nacheinander und in dieser Reihenfolge
-      in den oben beschriebenen Baum eingefügt werden
-      -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20210211.pdf}),
-      Seite 42.
-      \points{3}
-      %
-      % Lösung:
-      %
-      %           7 137
-      %         /   |
-      %      3 5  12 42
-      %     /   \
-      %   1 2    6
-      %
-      % (NULL-Zeiger sind hier nicht dargestellt,
-      % gehören aber dazu.)
-      %
-    \goodbreak
-    \item
-      Dasselbe, aber in der Reihenfolge 
-      2, 7, 42, 12, 1, 137, 5, 6, 3.
-      \points{3}
-      %
-      % Lösung:
-      %
-      %           2 7
-      %         /  |  \
-      %       1   5 6  12 42
-      %         /           \
-      %        3             137
-      %
-      % (NULL-Zeiger sind hier wieder nicht dargestellt,
-      % gehören aber dazu.)
-      %
-    \item
-      Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment,
-      wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum
-      sortiert auszugeben.
-      \points{4}
-  \end{enumerate}
-
-  \solution
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      \textbf{Zeichnen Sie ein Schaubild, das veranschaulicht,
-      wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12
-      nacheinander und in dieser Reihenfolge
-      in den oben beschriebenen Baum eingefügt werden
-      -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20190121.pdf}),
-      Seite 21.}
-      %
-      % Lösung:
-      %
-      %           7 137
-      %         /   |
-      %      3 5  12 42
-      %     /   \
-      %   1 2    6
-      %
-      % (NULL-Zeiger sind hier nicht dargestellt,
-      % gehören aber dazu.)
-      %
-      \begin{center}
-        \newcommand{\x}{~\makebox(0,0){\raisebox{0.7em}{\rule{1pt}{1.4em}}}~}
-        \begin{tikzpicture}
-          \color{blendedblue}
-          \node(root) at (0,0) {\lstinline{node *root;}};
-          \node[shape=rectangle,draw,line width=1pt](7-137) at (0,-1.5) {7\x 137};
-          \draw[-latex](root)--(7-137);
-          \node[shape=rectangle,draw,line width=1pt](3-5) at (-2,-3) {3\x 5};
-          \draw[-latex](7-137)--(3-5);
-          \node[shape=rectangle,draw,line width=1pt](12-42) at (0,-3) {12\x 42};
-          \draw[-latex](7-137)--(12-42);
-          \node[shape=rectangle,draw,line width=1pt](1-2) at (-4,-4.5) {1\x 2};
-          \draw[-latex](3-5)--(1-2);
-          \node[shape=rectangle,draw,line width=1pt](6) at (0,-4.5) {6};
-          \draw[-latex](3-5)--(6);
-        \end{tikzpicture}
-      \end{center}
-      Bemerkungen:
-      \begin{itemize}
-        \item
-          Zeiger mit dem Wert \lstinline{NULL} sind nicht dargestellt:
-          \lstinline{right}-Zeiger von 7/137,
-          \lstinline{middle}-Zeiger von 3/5,
-          sämtliche Zeiger von 1/2, 12/42 und 6.
-        \item
-          Beim Einfügen der 12 wird die sich bereits vorher in diesem
-          \lstinline{node} befindliche 42 zu \lstinline{content_right},
-          und die 12 wird das neue \lstinline{content_left}.
-        \item
-          Dieser Baum hat sehr einfache Regeln und ist daher \emph{nicht\/}
-          balanciert. Insbesondere unsere Regel, daß einmal angelegte Knoten
-          nicht mehr verändert werden dürfen, steht dem im Wege.
-          Ein einfaches Beispiel für einen \emph{balancierten\/} ternären
-          Baum ist der 2-3-Baum -- siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}.
-      \end{itemize}
-    \goodbreak
-    \item
-      \textbf{Dasselbe, aber in der Reihenfolge 
-      2, 7, 42, 12, 1, 137, 5, 6, 3.}
-      %
-      % Lösung:
-      %
-      %           2 7
-      %         /  |  \
-      %       1   5 6  12 42
-      %         /           \
-      %        3             137
-      %
-      % (NULL-Zeiger sind hier wieder nicht dargestellt,
-      % gehören aber dazu.)
-      %
-      \begin{center}
-        \newcommand{\x}{~\makebox(0,0){\raisebox{0.7em}{\rule{1pt}{1.4em}}}~}
-        \begin{tikzpicture}
-          \color{blendedblue}
-          \node(root) at (0,0) {\lstinline{node *root;}};
-          \node[shape=rectangle,draw,line width=1pt](2-7) at (0,-1.5) {2\x 7};
-          \draw[-latex](root)--(7-137);
-          \node[shape=rectangle,draw,line width=1pt](1) at (-2,-3) {1};
-          \draw[-latex](2-7)--(1);
-          \node[shape=rectangle,draw,line width=1pt](5-6) at (0,-3) {5\x 6};
-          \draw[-latex](2-7)--(5-6);
-          \node[shape=rectangle,draw,line width=1pt](3) at (-2,-4.5) {3};
-          \draw[-latex](5-6)--(3);
-          \node[shape=rectangle,draw,line width=1pt](12-42) at (2,-3) {12\x 42};
-          \draw[-latex](2-7)--(12-42);
-          \node[shape=rectangle,draw,line width=1pt](137) at (4,-4.5) {137};
-          \draw[-latex](12-42)--(137);
-        \end{tikzpicture}
-      \end{center}
-      Bemerkungen:
-      \begin{itemize}
-        \item
-          Wieder sind Zeiger mit dem Wert \lstinline{NULL} nicht dargestellt:
-          \lstinline{middle}- und \lstinline{right}-Zeiger von 5/6,
-          \lstinline{left}- und \lstinline{middle}-Zeiger von 12/42,
-          sämtliche Zeiger von 1, 3 und 137.
-        \item
-          Beim Einfügen der 12 wird wieder die sich bereits vorher in diesem
-          \lstinline{node} befindliche 42 zu \lstinline{content_right},
-          und die 12 wird das neue \lstinline{content_left}.
-      \end{itemize}
-    \item
-      \textbf{Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment,
-      wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum
-      sortiert auszugeben.}
-
-      Die entscheidende Idee ist \textbf{Rekursion}.
-
-      Eine Funktion, die den gesamten Baum ausgibt,
-      müßte einmalig für den Zeiger \lstinline{root} aufgerufen werden
-      und folgendes tun:
-      \begin{enumerate}[\quad 1.]
-        \item
-          falls der übergebene Zeiger den Wert \lstinline{NULL} hat,
-          nichts ausgeben, sondern die Funktion direkt beenden,
-        \item
-          sich selbst für den \lstinline{left}-Zeiger aufrufen,
-        \item
-          den Wert von \lstinline{content_left} ausgeben,
-        \item
-          sich selbst für den \lstinline{middle}-Zeiger aufrufen,
-        \item
-          sofern vorhanden (also ungleich \lstinline{-1}),
-          den Wert von \lstinline{content_right} ausgeben,
-        \item
-          sich selbst für den \lstinline{right}-Zeiger aufrufen.
-      \end{enumerate}
-      Als C-Fragment:
-      \begin{lstlisting}[gobble=8]
-        void output_tree (node *root)
-        {
-          if (root)
-            {
-              output_tree (root->left);
-              printf ("%d\n", root->content_left);
-              output_tree (root->middle);
-              if (root->content_right >= 0)
-                printf ("%d\n", root->content_right);
-              output_tree (root->right);
-            }
-        }
-      \end{lstlisting}
-      Die Datei \gitfile{hp}{2020ws/20210211}{loesung-3c.c} erweitert dieses Fragment
-      zu einem vollständigen C-Programm zum Erstellen und sortierten Ausgeben
-      eines ternären Baums mit den Zahlenwerten von Aufgabenteil (a).
-  \end{enumerate}
-
-\end{document}
diff --git a/20210211/hp-uebung-20210211.pdf b/20210211/hp-uebung-20210211.pdf
deleted file mode 100644
index 12f115890aa74b65cc4417e5b75e9a48d6dd9f50..0000000000000000000000000000000000000000
Binary files a/20210211/hp-uebung-20210211.pdf and /dev/null differ
diff --git a/20210211/hp-uebung-20210211.tex b/20210211/hp-uebung-20210211.tex
deleted file mode 100644
index 14f6615c4971fa69cfe83b56bab318926d285de2..0000000000000000000000000000000000000000
--- a/20210211/hp-uebung-20210211.tex
+++ /dev/null
@@ -1,313 +0,0 @@
-% hp-uebung-20210204.pdf - Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  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, einfach und doppelt verkettete Listen, ternärer Baum
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{tikz}
-
-\begin{document}
-
-%  \thispagestyle{empty}
-
-  \section*{Hardwarenahe Programmierung\\
-            Übungsaufgaben -- 11.\ Februar 2021}
-
-%  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
-%  17 Punkte (von insgesamt \totalpoints) erreichen.
-
-  \exercise{Stack-Operationen}
-
-  Das folgende Programm (\gitfile{hp}{2020ws/20210211}{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}
-
-  \goodbreak
-
-  \exercise{Einfach und doppelt verkettete Listen}
-
-  Das Beispiel-Programm \gitfile{hp}{2020ws/20210211}{aufgabe-2.c}
-  demonstriert zwei Funktionen zur Verwaltung einfach verketteter Listen:
-  \lstinline{output_list()} zum Ausgeben der Liste auf den Bildschirm und
-  \lstinline{insert_into_list()} zum Einfügen in die Liste.
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Ergänzen Sie eine Funktion \lstinline{delete_from_list()}
-      zum Löschen eines Elements aus der Liste
-      mit Freigabe des Speicherplatzes.
-%      \points{5}
-    \item
-      Ergänzen Sie eine Funktion \lstinline{reverse_list()}
-      die die Reihenfolge der Elemente in der Liste umdreht.\\
-%      \points{3}
-  \end{enumerate}
-
-  Eine doppelt verkettete Liste hat in jedem Knotenpunkt (\lstinline{node})
-  \emph{zwei\/} Zeiger -- einen auf das nächste Element (\lstinline{next})
-  und einen auf das vorherige Element (z.\,B.\ \lstinline{prev} für "`previous"').
-  Dadurch ist es leichter als bei einer einfach verketteten Liste,
-  die Liste in umgekehrter Reihenfolge durchzugehen.
-
-  \begin{quote}
-    \begin{tikzpicture}
-      \color{blendedblue}
-      \node(first) at (0,3.5) {first};
-      \node(NULL1) at (-1,1.25) {NULL};
-      \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(NULL2) at (7,2.75) {NULL};
-      \draw[-latex](first)--(3);
-      \draw[-latex](3) to[out=45,in=135] (7);
-      \draw[-latex](3) to[out=-135,in=0] (NULL1);
-      \draw[-latex](7) to[out=-135,in=-45] (3);
-      \draw[-latex](7) to[out=45,in=135] (137);
-      \draw[-latex](137) to[out=-135,in=-45] (7);
-      \draw[-latex](137) to[out=45,in=180] (NULL2);
-    \end{tikzpicture}
-  \end{quote}
-
-  Der Rückwärts-Zeiger (\lstinline{prev}) des ersten Elements zeigt,
-  genau wie der Vorwärts-Zeiger (\lstinline{next}) des letzten Elements,
-  auf \emph{nichts}, hat also den Wert \lstinline{NULL}.
-
-  \begin{enumerate}[\quad(a)]\setcounter{enumi}{2}
-    \item
-      Schreiben Sie das Programm um für doppelt verkettete Listen.
-%      \points{5}
-  \end{enumerate}
-
-  \exercise{Ternärer Baum}
-
-  Der in der Vorlesung vorgestellte \newterm{binäre Baum\/}
-  ist nur ein Spezialfall;
-  im allgemeinen können Bäume auch mehr als zwei Verzweigungen
-  pro Knotenpunkt haben.
-  Dies ist nützlich bei der Konstruktion \emph{balancierter Bäume},
-  also solcher, die auch im \emph{Worst Case\/}
-  nicht zu einer linearen Liste entarten,
-  sondern stets eine -- möglichst flache -- Baumstruktur behalten.
-
-  Wir betrachten einen Baum mit bis zu drei Verzweigungen pro Knotenpunkt,
-  einen sog.\ \newterm{ternären Baum}.
-  Jeder Knoten enthält dann nicht nur einen,
-  sondern \emph{zwei\/} Werte als Inhalt:
-
-  \begin{lstlisting}
-    typedef struct node
-    {
-      int content_left, content_right;
-      struct node *left, *middle, *right;
-    } node;
-  \end{lstlisting}
-
-  Wir konstruieren nun einen Baum nach folgenden Regeln:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item
-      Innerhalb eines Knotens sind die Werte sortiert:
-      \lstinline{content_left} muß stets kleiner sein als \lstinline{content_right}.
-    \item
-      Der Zeiger \lstinline{left} zeigt auf Knoten,
-      deren enthaltene Werte durchweg kleiner sind als \lstinline{content_left}.
-    \item
-      Der Zeiger \lstinline{right} zeigt auf Knoten,
-      deren enthaltene Werte durchweg größer sind als \lstinline{content_right}.
-    \item
-      Der Zeiger \lstinline{middle} zeigt auf Knoten,
-      deren enthaltene Werte durchweg größer sind als \lstinline{content_left},
-      aber kleiner als \lstinline{content_right}.
-    \item
-      Ein Knoten muß nicht immer mit zwei Werten voll besetzt sein;
-      er darf auch \emph{nur einen\/} gültigen Wert enthalten.
-
-      Der Einfachheit halber lassen wir in diesem Beispiel
-      nur positive Zahlen als Werte zu.
-      Wenn ein Knoten nur einen Wert enthält,
-      setzen wir \lstinline{content_right = -1},
-      und der Zeiger \lstinline{middle} wird nicht verwendet.
-    \item
-      Wenn wir neue Werte in den Baum einfügen,
-      werden \emph{zuerst\/} die nicht voll besetzten Knoten aufgefüllt
-      und \emph{danach erst\/} neue Knoten angelegt und Zeiger gesetzt.
-    \item
-      Beim Auffüllen eines Knotens darf nötigenfalls \lstinline{content_left}
-      nach \lstinline{content_right} verschoben werden.
-      Ansonsten werden einmal angelegte Knoten nicht mehr verändert.
-  \end{itemize}
-  \vspace*{-\medskipamount}
-  (In der Praxis dürfen Knoten gemäß speziellen Regeln
-  nachträglich verändert werden,
-  um Entartungen gar nicht erst entstehen zu lassen --
-  siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}.)
-
-  \begin{enumerate}[\quad(a)]
-    \item
-      Zeichnen Sie ein Schaubild, das veranschaulicht,
-      wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12
-      nacheinander und in dieser Reihenfolge
-      in den oben beschriebenen Baum eingefügt werden
-      -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20210211.pdf}),
-      Seite 42.
-%      \points{3}
-      %
-      % Lösung:
-      %
-      %           7 137
-      %         /   |
-      %      3 5  12 42
-      %     /   \
-      %   1 2    6
-      %
-      % (NULL-Zeiger sind hier nicht dargestellt,
-      % gehören aber dazu.)
-      %
-    \item
-      Dasselbe, aber in der Reihenfolge 
-      2, 7, 42, 12, 1, 137, 5, 6, 3.
-%      \points{3}
-      %
-      % Lösung:
-      %
-      %           2 7
-      %         /  |  \
-      %       1   5 6  12 42
-      %         /           \
-      %        3             137
-      %
-      % (NULL-Zeiger sind hier wieder nicht dargestellt,
-      % gehören aber dazu.)
-      %
-    \item
-      Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment,
-      wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum
-      sortiert auszugeben.
-%      \points{4}
-  \end{enumerate}
-
-  \begin{flushright}
-    \textit{Viel Erfolg -- auch in den Prüfungen!}
-  \end{flushright}
-
-%  \makeatletter
-%    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
-%  \makeatother
-
-\end{document}
diff --git a/20210211/lists-1.c b/20210211/lists-1.c
deleted file mode 100644
index a04067e1403601ef56dd706d6148c1d386884e82..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/lists-2.c b/20210211/lists-2.c
deleted file mode 100644
index f27d1d5af7c0c237f0d0286155380ef9452a497a..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/lists-3.c b/20210211/lists-3.c
deleted file mode 100644
index 9c9029724efff25263813c5491add92504779d17..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/lists-4.c b/20210211/lists-4.c
deleted file mode 100644
index e048736b85cc228c35f31644d003e00cdefc5496..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/lists-5.c b/20210211/lists-5.c
deleted file mode 100644
index a0cc620a884c133dd89582de726139091bc9c5d0..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-1.c b/20210211/loesung-1.c
deleted file mode 100644
index 9b87d6c2f977af2843bcc2b75896fb5f00d8fc35..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-1b-1.c b/20210211/loesung-1b-1.c
deleted file mode 100644
index cbbe37055109d203105a7ad4acb63d5bef61f4c0..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-1b-2.c b/20210211/loesung-1b-2.c
deleted file mode 100644
index b1e1ae846f15a29e9cd53a8d1d689e3ccbefacce..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-1c.c b/20210211/loesung-1c.c
deleted file mode 100644
index 79d061e3d7b78a2bec05b632e74b083a16d5a326..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-1d.c b/20210211/loesung-1d.c
deleted file mode 100644
index 9079d8d3be7a500498aede2cf8e89a7d7db48a35..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/loesung-2a.c b/20210211/loesung-2a.c
deleted file mode 100644
index 93f5e5629a98d13d6292c56d1a3f855b4f5bd8fd..0000000000000000000000000000000000000000
--- a/20210211/loesung-2a.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next;
-} node;
-
-void output_list (node *first)
-{
-  for (node *p = first; p; p = p->next)
-    printf ("%d ", p->content);
-  printf ("\n");
-}
-
-void insert_into_list (node *what, node *where)
-{
-  what->next = where->next;
-  where->next = what;
-}
-
-void delete_from_list (node *what, node **first)
-{
-  if (what == *first)
-    *first = what->next;
-  else
-    {
-      node *p = *first;
-      while (p && p->next != what)
-        p = p->next;
-      if (p)
-        p->next = what->next;
-    }
-  free (what);
-}
-
-int main (void)
-{
-  node *element3 = malloc (sizeof (node));
-  node *element7 = malloc (sizeof (node));
-  node *element137 = malloc (sizeof (node));
-
-  element3->content = 3;
-  element7->content = 7;
-  element137->content = 137;
-
-  node *first = element3;
-  element3->next = element7;
-  element7->next = element137;
-  element137->next = NULL;
-
-  output_list (first);
-
-  node *element5 = malloc (sizeof (node));
-  element5->content = 5;
-  insert_into_list (element5, element3);
-
-  output_list (first);
-
-  delete_from_list (element5, &first);
-  output_list (first);
-  delete_from_list (element3, &first);
-  output_list (first);
-  delete_from_list (element137, &first);
-  output_list (first);
-
-  return 0;
-}
diff --git a/20210211/loesung-2b.c b/20210211/loesung-2b.c
deleted file mode 100644
index 811b99b1fc9697ca0302eea8950c9bc6e7ab6042..0000000000000000000000000000000000000000
--- a/20210211/loesung-2b.c
+++ /dev/null
@@ -1,97 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content;
-  struct node *next, *prev;
-} node;
-
-void check_list (node *first)
-{
-  for (node *p = first; p; p = p->next)
-    {
-      if (p->next && p->next->prev != p)
-        fprintf (stderr, "List inconsistency!\n");
-      if (p->prev && p->prev->next != p)
-        fprintf (stderr, "List inconsistency!\n");
-    }
-}
-
-void output_list (node *first)
-{
-  for (node *p = first; p; p = p->next)
-    printf ("%d ", p->content);
-  printf ("\n");
-}
-
-void insert_into_list (node *what, node *where)
-{
-  what->next = where->next;
-  if (where->next)
-    where->next->prev = what;
-  what->prev = where;
-  where->next = what;
-}
-
-void delete_from_list (node *what, node **first)
-{
-  if (what == *first)
-    {
-      *first = what->next;
-      if (*first)
-        (*first)->prev = NULL;
-    }
-  else
-    {
-      node *p = *first;
-      while (p && p->next != what)
-        p = p->next;
-      if (p)
-        p->next = what->next;
-      if (what->next)
-        what->next->prev = p;
-    }
-  free (what);
-}
-
-int main (void)
-{
-  node *element3 = malloc (sizeof (node));
-  node *element7 = malloc (sizeof (node));
-  node *element137 = malloc (sizeof (node));
-
-  element3->content = 3;
-  element7->content = 7;
-  element137->content = 137;
-
-  node *first = element3;
-  element3->prev = NULL;
-  element3->next = element7;
-  element7->prev = element3;
-  element7->next = element137;
-  element137->prev = element7;
-  element137->next = NULL;
-
-  output_list (first);
-  check_list (first);
-
-  node *element5 = malloc (sizeof (node));
-  element5->content = 5;
-  insert_into_list (element5, element3);
-
-  output_list (first);
-  check_list (first);
-
-  delete_from_list (element5, &first);
-  output_list (first);
-  check_list (first);
-  delete_from_list (element3, &first);
-  output_list (first);
-  check_list (first);
-  delete_from_list (element137, &first);
-  output_list (first);
-  check_list (first);
-
-  return 0;
-}
diff --git a/20210211/loesung-3c.c b/20210211/loesung-3c.c
deleted file mode 100644
index a6dea990b25895475e343f07895c6a946426d2d8..0000000000000000000000000000000000000000
--- a/20210211/loesung-3c.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef struct node
-{
-  int content_left, content_right;
-  struct node *left, *middle, *right;
-} node;
-
-void insert_into_tree (node **root, int value)
-{
-  if (*root)
-    {
-      if ((*root)->content_right >= 0)
-        if (value < (*root)->content_left)
-          insert_into_tree (&(*root)->left, value);
-        else if (value < (*root)->content_right)
-          insert_into_tree (&(*root)->middle, value);
-        else
-          insert_into_tree (&(*root)->right, value);
-      else
-        if (value < (*root)->content_left)
-          {
-            (*root)->content_right = (*root)->content_left;
-            (*root)->content_left = value;
-          }
-        else
-          (*root)->content_right = value;
-    }
-  else
-    {
-      *root = malloc (sizeof (node));
-      (*root)->left = NULL;
-      (*root)->content_left = value;
-      (*root)->middle = NULL;
-      (*root)->content_right = -1;
-      (*root)->right = NULL;
-    }
-}
-
-void output_tree (node *root)
-{
-  if (root)
-    {
-      output_tree (root->left);
-      printf ("%d\n", root->content_left);
-      output_tree (root->middle);
-      if (root->content_right >= 0)
-        printf ("%d\n", root->content_right);
-      output_tree (root->right);
-    }
-}
-
-int main (void)
-{
-  node *root = NULL;
-  insert_into_tree (&root, 7);
-  insert_into_tree (&root, 137);
-  insert_into_tree (&root, 3);
-  insert_into_tree (&root, 5);
-  insert_into_tree (&root, 6);
-  insert_into_tree (&root, 42);
-  insert_into_tree (&root, 1);
-  insert_into_tree (&root, 2);
-  insert_into_tree (&root, 12);
-  output_tree (root);
-  return 0;
-}
diff --git a/20210211/logo-hochschule-bochum-cvh-text-v2.pdf b/20210211/logo-hochschule-bochum-cvh-text-v2.pdf
deleted file mode 120000
index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/logo-hochschule-bochum.pdf b/20210211/logo-hochschule-bochum.pdf
deleted file mode 120000
index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000
--- a/20210211/logo-hochschule-bochum.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20210211/pgscript.sty b/20210211/pgscript.sty
deleted file mode 120000
index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000
--- a/20210211/pgscript.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgscript.sty
\ No newline at end of file
diff --git a/20210211/pgslides.sty b/20210211/pgslides.sty
deleted file mode 120000
index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000
--- a/20210211/pgslides.sty
+++ /dev/null
@@ -1 +0,0 @@
-../common/pgslides.sty
\ No newline at end of file
diff --git a/20210211/stack-0.c b/20210211/stack-0.c
deleted file mode 100644
index 289aab7602e1e1f9f1e6433b858f295792499b1b..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-1.c b/20210211/stack-1.c
deleted file mode 100644
index d1de6e09d718b69a9d255b6c83f6f7815584b430..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-2.c b/20210211/stack-2.c
deleted file mode 100644
index 20bed3660cffea7e0a9803451f69ef56a4a04b93..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-3.c b/20210211/stack-3.c
deleted file mode 100644
index b20a444d628a88101416097c79b34e0669b24d21..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-4.c b/20210211/stack-4.c
deleted file mode 100644
index 0d738f95ff81ce1701b4aa8a12df30094b723851..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-5.c b/20210211/stack-5.c
deleted file mode 100644
index 38a187208208488bdb8e988d93442d57730e421e..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-6.c b/20210211/stack-6.c
deleted file mode 100644
index be00e160384be5e4af05831547ed74b636c3bdf0..0000000000000000000000000000000000000000
--- a/20210211/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/20210211/stack-7.c b/20210211/stack-7.c
deleted file mode 100644
index b583bc281f9ae3acd673ec9ea4de75720084fb50..0000000000000000000000000000000000000000
--- a/20210211/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/20201105/gitlab.png b/20211004/gitlab.png
similarity index 100%
rename from 20201105/gitlab.png
rename to 20211004/gitlab.png
diff --git a/20201105/hp-20201105-fig1.pdf b/20211004/hp-20211004-fig1.pdf
similarity index 100%
rename from 20201105/hp-20201105-fig1.pdf
rename to 20211004/hp-20211004-fig1.pdf
diff --git a/20201105/hp-20201105-fig1.tex b/20211004/hp-20211004-fig1.tex
similarity index 100%
rename from 20201105/hp-20201105-fig1.tex
rename to 20211004/hp-20211004-fig1.tex
diff --git a/20201105/hp-20201105.pdf b/20211004/hp-20211004.pdf
similarity index 55%
rename from 20201105/hp-20201105.pdf
rename to 20211004/hp-20211004.pdf
index 2c02ccc81ae5c7f44daf48b6bd2b5af95cc58715..f7304d7daca827ffe6f17406e104426c2338fb58 100644
Binary files a/20201105/hp-20201105.pdf and b/20211004/hp-20211004.pdf differ
diff --git a/20201105/hp-20201105.tex b/20211004/hp-20211004.tex
similarity index 95%
rename from 20201105/hp-20201105.tex
rename to 20211004/hp-20211004.tex
index 3860857857e2d771ab1b4c2bb2f0936e9fa5fe07..d968501660e458c428082d5fdedef75aa4d80aa5 100644
--- a/20201105/hp-20201105.tex
+++ b/20211004/hp-20211004.tex
@@ -1,5 +1,5 @@
-% hp-20201105.pdf - Lecture Slides on Low-Level Programming
-% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020  Peter Gerwinski
+% hp-20211004.pdf - Lecture Slides on Low-Level Programming
+% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021  Peter Gerwinski
 %
 % This document is free software: you can redistribute it and/or
 % modify it either under the terms of the Creative Commons
@@ -37,9 +37,11 @@
   \usepackage{pstricks,pst-grad}
 \end{psinputs}
 
+\newcommand{\redurl}[1]{\href{#1}{\color{red}\nolinkurl{#1}}}
+
 \title{Hardwarenahe Programmierung}
 \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{5.\ November 2020}
+\date{4.\ Oktober 2021}
 
 \begin{document}
 
@@ -47,10 +49,11 @@
 
 \date{\begin{picture}(0,0)
         \color{red}
-        \put(0.63,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{%
+        \put(0.55,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{%
           \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}}
+        \put(1.5,-3){\makebox(0,0)[bl]{\redurl{https://www.peter.gerwinski.de/physik/}}}
       \end{picture}%
-      5.\ November 2020}
+      4.\ Oktober 2021}
 
 \maketitleframe
 
@@ -62,15 +65,19 @@
 
   \showsectionnonumber
   \begin{itemize}
+    \item
+      Diese Veranstaltung findet \textbf{in Präsenz} statt.\\
+      Wir versuchen aber, auch eine Online-Teilnahme zu ermöglichen.
+    \medskip
     \item
       \textbf{Mumble}: Seminarraum 2\\
-      Fragen: Mikrophon einschalten oder über den Chat\\
-      Umfragen: über den Chat
+      Fragen: Mikrofon einschalten oder über den Chat\\
+      Umfragen: über den Chat -- \textbf{auch während der Präsenz-Veranstaltung}
     \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
+      Eigenen Bildschirm freigeben: VNC-Software oder Web-Interface \emph{yesVNC}\\
+      Eigenes Kamerabild übertragen: Web-Interface \emph{CVH-Camera}
     \smallskip
     \item
       Allgemeine Informationen:
@@ -82,8 +89,7 @@
     \smallskip
     \item
       Bei Problemen: bitte notieren:\\
-      Art des Problems, genaue Uhrzeit, eigener Internet-Provider\\
-      speziell: Netzanschluß des Studierendenwohnheims
+      Art des Problems, genaue Uhrzeit, eigener Internet-Zugang
     \bigskip
     \item
       GitLab: \url{https://gitlab.cvh-server.de/pgerwinski/hp}
@@ -326,11 +332,12 @@
       \end{itemize}
     \item
       \textbf{Übungen}\\
-      finden bereits diese Woche statt.
+      sind mit der Vorlesung integriert.
     \item
       Das \textbf{Praktikum}\\
-      findet weitgehend in Heimarbeit statt.\\
-      Bereits heute: vorbereitende Maßnahmen
+      findet jede Woche statt.\\
+      Diese Woche: vorbereitende Maßnahmen,\\
+      Kennenlernen der verwendeten Werkzeuge
   \end{itemize}
 
 \end{frame}
diff --git a/20201105/hp-uebung-20201105.pdf b/20211004/hp-uebung-20211004.pdf
similarity index 100%
rename from 20201105/hp-uebung-20201105.pdf
rename to 20211004/hp-uebung-20211004.pdf
diff --git a/20201105/hp-uebung-20201105.tex b/20211004/hp-uebung-20211004.tex
similarity index 100%
rename from 20201105/hp-uebung-20201105.tex
rename to 20211004/hp-uebung-20211004.tex
diff --git a/20201105/logo-hochschule-bochum-cvh-text-v2.pdf b/20211004/logo-hochschule-bochum-cvh-text-v2.pdf
similarity index 100%
rename from 20201105/logo-hochschule-bochum-cvh-text-v2.pdf
rename to 20211004/logo-hochschule-bochum-cvh-text-v2.pdf
diff --git a/20201105/logo-hochschule-bochum.pdf b/20211004/logo-hochschule-bochum.pdf
similarity index 100%
rename from 20201105/logo-hochschule-bochum.pdf
rename to 20211004/logo-hochschule-bochum.pdf
diff --git a/20201105/pgscript.sty b/20211004/pgscript.sty
similarity index 100%
rename from 20201105/pgscript.sty
rename to 20211004/pgscript.sty
diff --git a/20201105/pgslides.sty b/20211004/pgslides.sty
similarity index 100%
rename from 20201105/pgslides.sty
rename to 20211004/pgslides.sty
diff --git a/hp-slides-2020ws.pdf b/hp-slides-2020ws.pdf
deleted file mode 100644
index a74ee6002f891133eb1b11e2d785db5644b347df..0000000000000000000000000000000000000000
Binary files a/hp-slides-2020ws.pdf and /dev/null differ
diff --git a/hp-slides-2020ws.tex b/hp-slides-2020ws.tex
deleted file mode 100644
index a621d08bd4c5a7088814622ca5a4120663f7ff9c..0000000000000000000000000000000000000000
--- a/hp-slides-2020ws.tex
+++ /dev/null
@@ -1,39 +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-2020ws.pdf}
-  \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis}
-  \includepdf[pages=2-]{script/hp-slides-title-2020ws.pdf}
-  \pdfbookmark[1]{05.11.2020: Einführung, Einführung in C (bis Schleifen)}{20201105}
-  \includepdf[pages=-]{20201105/hp-20201105.pdf}
-  \pdfbookmark[1]{12.11.2020: Einführung in C: Seiteneffekte, Funktionen}{20201112}
-  \includepdf[pages=-]{20201112/hp-20201112.pdf}
-  \pdfbookmark[1]{19.11.2020: Einführung in C: Zeiger, Arrays und Strings}{20201119}
-  \includepdf[pages=-]{20201119/hp-20201119.pdf}
-  \pdfbookmark[1]{26.11.2020: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung}{20201126}
-  \includepdf[pages=-]{20201126/hp-20201126.pdf}
-  \pdfbookmark[1]{03.12.2020: Parameter des Hauptprogramms, String-Operationen}{20201203}
-  \includepdf[pages=-]{20201203/hp-20201203.pdf}
-  \pdfbookmark[1]{10.12.2020: Präprozessor, Bibliotheken einbinden und verwenden}{20201210}
-  \includepdf[pages=-]{20201210/hp-20201210.pdf}
-  \pdfbookmark[1]{17.12.2020: make, Differentialgleichungen}{20201217}
-  \includepdf[pages=-]{20201217/hp-20201217.pdf}
-  \pdfbookmark[1]{07.01.2021: Rekursion, Aufwandsabschätzungen}{20210107}
-  \includepdf[pages=-]{20210107/hp-20210107.pdf}
-  \pdfbookmark[1]{14.01.2021: Hardwarenahe Programmierung: Bit-Operationen, I/O-Ports}{20210114}
-  \includepdf[pages=-]{20210114/hp-20210114.pdf}
-  \pdfbookmark[1]{21.01.2021: Hardwarenahe Programmierung: Interrupts, volatile-Variable, Byte-Reihenfolge – Endianness, Binärdarstellung negativer Zahlen, Speicherausrichtung – Alignment}{20210121}
-  \includepdf[pages=-]{20210121/hp-20210121.pdf}
-  \pdfbookmark[1]{28.01.2021: Objektorientierte Programmierung}{20210128}
-  \includepdf[pages=-]{20210128/hp-20210128.pdf}
-  \pdfbookmark[1]{04.02.2021: Objektorientierte Programmierung: virtuelle Methoden}{20210204}
-  \includepdf[pages=-]{20210204/hp-20210204.pdf}
-  \pdfbookmark[1]{11.02.2021: Objektorientierte Programmierung: virtuelle Methoden}{20210211}
-  \includepdf[pages=-]{20210211/hp-20210211.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/egal.txt b/script/egal.txt
deleted file mode 100644
index 70fbe4a435e96acc7b3db8eefb8018eda4ab0e4d..0000000000000000000000000000000000000000
--- a/script/egal.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-GNU/Linux
-~~~~~~~~~
-Compilieren:  gcc -Wall -O cube-5.c opengl-magic.c \
-              -lGL -lGLU -lglut -o cube-5
-Aufrufen:     ./cube-5
-
-MacOS
-~~~~~
-Compilieren:  gcc -Wall -O cube-5.c opengl-magic.c \
-              -framework OpenGL -framework GLUT -o cube-5
-Aufrufen:     ./cube-5
-
-Cygwin mit X11
-~~~~~~~~~~~~~~
-Compilieren:  gcc -Wall -O cube-5.c opengl-magic.c \
-              -lGL -lGLU -lglut -o cube-5
-Aufrufen:     DISPLAY=:0.0 ./cube-5
-oder:
-  einmalig:   export DISPLAY=:0.0
-  danach:     ./cube-5
-
-Vorher einmalig: X-Server starten
-              XWin -multiwindow &
-
-Cygwin ohne X11
-~~~~~~~~~~~~~~~
-Compilieren:  i686-pc-mingw32-gcc -I freeglut/include -L freeglut/lib \
-              -Wall -O cube-5.c opengl-magic.c \
-              -lOpenGL32 -lGLU32 -lfreeglut -o cube-5
-Aufrufen:     ./cube-5
-
-MinGW ohne X11
-~~~~~~~~~~~~~~
-Compilieren:  gcc -I freeglut/include -L freeglut/lib \
-              -Wall -O cube-5.c opengl-magic.c \
-              -lOpenGL32 -lGLU32 -lfreeglut -o cube-5
-Aufrufen:     ./cube-5
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/fifo-8.c b/script/fifo-8.c
deleted file mode 100644
index 5ee60f2325c170808389365a522d6e6cab0f1f45..0000000000000000000000000000000000000000
--- a/script/fifo-8.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <stdio.h>
-
-#define FIFO_SIZE 10
-
-int fifo[FIFO_SIZE];
-int fifo_read = 0;
-int fifo_write = 0;
-
-void push (int x)
-{
-  if ((fifo_write + 1) % FIFO_SIZE == fifo_read)
-    fprintf (stderr, "push(): FIFO is full\n");
-  else
-    {
-      fifo[fifo_write++] = x;
-      if (fifo_write >= FIFO_SIZE)
-        fifo_write = 0;
-    }
-}
-
-int pop (void)
-{
-  if (fifo_read == fifo_write)
-    {
-      fprintf (stderr, "pop(): FIFO is empty\n");
-      return -1;
-    }
-  else
-    {
-      int result = fifo[fifo_read++];
-      if (fifo_read >= FIFO_SIZE)
-        fifo_read = 0;
-      return result;
-    }
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  printf ("%d\n", pop ());
-  for (int i = 0; i < 15; i++)
-    push (i);
-  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/gtk-1.c b/script/gtk-1.c
deleted file mode 100644
index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-2.c b/script/gtk-2.c
deleted file mode 100644
index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-3.c b/script/gtk-3.c
deleted file mode 100644
index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-4.c b/script/gtk-4.c
deleted file mode 100644
index 3e15b640a0f1503294f93bb69fa0b457d60288e4..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-5.c b/script/gtk-5.c
deleted file mode 100644
index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-6.c b/script/gtk-6.c
deleted file mode 100644
index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000
--- a/script/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/script/gtk-7.c b/script/gtk-7.c
deleted file mode 100644
index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000
--- a/script/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/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-2020ws.pdf b/script/hp-2020ws.pdf
deleted file mode 100644
index 9ffec9021c72492cdbc0119d27f88f428ac500e2..0000000000000000000000000000000000000000
Binary files a/script/hp-2020ws.pdf and /dev/null differ
diff --git a/script/hp-2020ws.tex b/script/hp-2020ws.tex
deleted file mode 100644
index 5adc27dadc1e263360ba7f3071e7186e01fc5807..0000000000000000000000000000000000000000
--- a/script/hp-2020ws.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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{if-5.c}) ist für ihn
-  vollkommen gleichwertig zu \gitfile{hp}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/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}{2020ws/script}{params-1.c} -- siehe oben)
-  oder die Schleife mit dem Erreichen der Endmarkierung abbrechen
-  (Schleifenbedingung \lstinline{argv[i] != NULL}, Datei: \gitfile{hp}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{answer.c}:
-  \begin{lstlisting}
-    int answer (void)
-    {
-      return 42;
-    }
-  \end{lstlisting}
- 
-  \goodbreak
-  \gitfile{hp}{2020ws/script}{answer.h}:
-  \begin{lstlisting}
-    extern int answer (void);
-  \end{lstlisting}
-
-  Das Programm \gitfile{hp}{2020ws/script}{philosophy.c} verwendet eine Funktion \lstinline{answer()}, die
-  in der Datei \gitfile{hp}{2020ws/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}{2020ws/script}{philosophy.c}, sondern in einer separaten Datei \gitfile{hp}{2020ws/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}{2020ws/script}{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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{cube-3.c} der Bildschirm.
-%      Dies wird in \gitfile{hp}{2020ws/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}{2020ws/script}{opengl-magic.c}
-%      durch \gitfile{hp}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{cube-4.c} (langsame Drehung) und \gitfile{hp}{2020ws/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}{2020ws/script}{cube-5.c} und \gitfile{hp}{2020ws/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}{2020ws/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}{2020ws/script}{philosophy.c} oder
-  \gitfile{hp}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/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}{2020ws/script}{sort-0.c} (mit "`Schummeln"'),
-      \gitfile{hp}{2020ws/script}{sort-1.c} (lineare Suche),
-      \gitfile{hp}{2020ws/script}{sort-2.c} (mit Visualisierung)
-    \item
-      Selectionsort:
-      \gitfile{hp}{2020ws/script}{sort-3.c} (bei Minimumsuche Anfang des Arrays überspringen),
-      \gitfile{hp}{2020ws/script}{sort-4.c} (Selectionsort),
-      \gitfile{hp}{2020ws/script}{sort-5.c} (100 Namen),
-      \gitfile{hp}{2020ws/script}{sort-6.c} (100 Namen, ohne Visualisierung)
-    \item
-      Bubblesort:
-      \gitfile{hp}{2020ws/script}{sort-7.c} (Selectionsort, Minimumsuche mit in der Hauptschleife),
-      \gitfile{hp}{2020ws/script}{bsort-1.c} (Minimumsuche durch Vergleich benachbarter Strings),
-      \gitfile{hp}{2020ws/script}{bsort-2.c} (Abbruch in äußerer Schleife, sobald sortiert),
-      \gitfile{hp}{2020ws/script}{bsort-3.c} (Abbruch auch in innerer Schleife, sobald sortiert)
-    \item
-      Quicksort:
-      \gitfile{hp}{2020ws/script}{qsort-1.c} (Array in 2 Hälften vorsortieren),
-      \gitfile{hp}{2020ws/script}{qsort-2.c} (rekursiver Aufruf für linke Hälfte),
-      \gitfile{hp}{2020ws/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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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}{2016ws/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/2020ws/script}%
-  {\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/2016ws/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}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{objects-14.cpp}
-  ist eine direkte Übersetzung von \gitfile{hp}{2020ws/script}{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}{2020ws/script}{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}{2020ws/script}{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-2020ws.pdf b/script/hp-slides-title-2020ws.pdf
deleted file mode 100644
index 5f9b06adb89e7eed1d8b163cabc6c2955153bdad..0000000000000000000000000000000000000000
Binary files a/script/hp-slides-title-2020ws.pdf and /dev/null differ
diff --git a/script/hp-slides-title-2020ws.tex b/script/hp-slides-title-2020ws.tex
deleted file mode 100644
index 0ab157f1bb3f3134cdb74c302bee3fb45214fef8..0000000000000000000000000000000000000000
--- a/script/hp-slides-title-2020ws.tex
+++ /dev/null
@@ -1,75 +0,0 @@
-% hp-slides-title-2020ws.pdf - Title Page for Lecture Slides on Low-Level Programming
-% Copyright (C) 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/>.
-
-\documentclass[10pt,t]{beamer}
-
-\usepackage{pgslides}
-
-\setlength{\parskip}{\medskipamount}
-
-\title{Hardwarenahe Programmierung}
-\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
-\date{Wintersemester 2020/21}
-
-\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.\,2020 unter
-  \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201105/}\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/objects-12.c b/script/objects-12.c
deleted file mode 100644
index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000
--- a/script/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/script/objects-13.c b/script/objects-13.c
deleted file mode 100644
index 81ef279b060e0b6290194fdeda8c3330cb716cdd..0000000000000000000000000000000000000000
--- a/script/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/script/objects-14.cpp b/script/objects-14.cpp
deleted file mode 100644
index ea40a139bacadb6ce4de30312bb0c1b6c21d9c8e..0000000000000000000000000000000000000000
--- a/script/objects-14.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-
-struct TBase
-{
-  virtual void print () = 0;
-};
-
-struct TInteger: TBase
-{
-  int content;
-  virtual void print ();
-  TInteger (int i);
-};
-
-struct TString: TBase
-{
-  char *content;
-  virtual void print ();
-  TString (char *s);
-};
-
-void TInteger::print ()
-{
-  printf ("Integer: %d\n", content);
-}
-
-void TString::print ()
-{
-  printf ("String: \"%s\"\n", content);
-}
-
-TInteger::TInteger (int i)
-{
-  content = i;
-}
-
-TString::TString (char *s)
-{
-  content = s;
-}
-
-int main (void)
-{
-  TBase *object[] = { new TInteger (42),
-                      new TString ("Hello, world!"),
-                      NULL };
-
-  for (int i = 0; object[i]; i++)
-    object[i]->print ();
-
-  return 0;
-}
diff --git a/script/objects-7.c b/script/objects-7.c
deleted file mode 100644
index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000
--- a/script/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/script/objects-8.c b/script/objects-8.c
deleted file mode 100644
index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000
--- a/script/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/script/objects-9.c b/script/objects-9.c
deleted file mode 100644
index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000
--- a/script/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/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/stack-11.c b/script/stack-11.c
deleted file mode 100644
index 89629d661097948711db9ed252f568aa4a15440a..0000000000000000000000000000000000000000
--- a/script/stack-11.c
+++ /dev/null
@@ -1,64 +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 push_at (int x, int pos)
-{
-  for (int i = stack_pointer - 1; i >= pos; i--)
-    stack[i + 1] = stack[i];
-  stack[pos] = x;
-  stack_pointer++;
-}
-
-void push_sorted (int x)
-{
-  int left = 0;
-  int right = stack_pointer;
-  while (left < right - 1)
-    {
-      int i = (left + right) / 2;
-      if (x < stack[i])
-        right = i;
-      else
-        left = i;
-    }
-  push_at (x, right);
-}
-
-int pop (void)
-{
-  return stack[--stack_pointer];
-}
-
-void show (void)
-{
-  printf ("stack:");
-  for (int i = 0; i < stack_pointer; i++)
-    printf (" %d", stack[i]);
-  printf ("\n");
-}
-
-int main (void)
-{
-  push (3);
-  push (7);
-  push (137);
-  show ();
-  push_sorted (5);
-  show ();
-  push_sorted (256);
-  show ();
-  push_sorted (42);
-  push_sorted (13);
-  push_sorted (107);
-  show ();
-  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-14.c b/script/strings-14.c
deleted file mode 100644
index dd05111f79e0573d616522593362f6f93beb89e7..0000000000000000000000000000000000000000
--- a/script/strings-14.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/script/strings-15.c b/script/strings-15.c
deleted file mode 100644
index fed7abe314e9db92eb804177d9aae413b60fb4c6..0000000000000000000000000000000000000000
--- a/script/strings-15.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/script/strings-16.c b/script/strings-16.c
deleted file mode 100644
index 731a6b182fcc38e984565425a141d50bb09893df..0000000000000000000000000000000000000000
--- a/script/strings-16.c
+++ /dev/null
@@ -1,15 +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/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/script/unions-1.c b/script/unions-1.c
deleted file mode 100644
index 87e5325939f6b045d78f92d62eacdbe2045e3190..0000000000000000000000000000000000000000
--- a/script/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 n;
-  n.i = -3;
-  printf ("%d\n", n.u);
-  return 0;
-}