diff --git a/20151119/ainf-20151119.pdf b/20151119/ainf-20151119.pdf
index b92b2e5bec937142c1366714b4d6a31f610c33b4..8ecf79dfd380bc0581c57c55efeab6a5f1abb56e 100644
Binary files a/20151119/ainf-20151119.pdf and b/20151119/ainf-20151119.pdf differ
diff --git a/20151119/ainf-20151119.tex b/20151119/ainf-20151119.tex
index 679ceed16f226e4b974d24b89552c2d2b067ec65..58065e6c0d274f2062bb994bcf5503378d555fc6 100644
--- a/20151119/ainf-20151119.tex
+++ b/20151119/ainf-20151119.tex
@@ -104,7 +104,7 @@
     \item
       \textbf{Doppelte Pufferung}\\
       2 "`Bildschirme"': einer zum Zeichnen; einer wird angezeigt\\
-      \file{opengl-magic.double.c}, \lstinline{gluSwapBuffers()}
+      \file{opengl-magic-double.c}, \lstinline{gluSwapBuffers()}
     \pause
     \item
       \textbf{Im Display-Handler} (\lstinline{draw()}) \textbf{wirklich nur zeichnen!}\\
diff --git a/20151119/ainf-uebung-20151119.pdf b/20151119/ainf-uebung-20151119.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3aa5cf5589f41bcda03631ac636e8893ca0ae695
Binary files /dev/null and b/20151119/ainf-uebung-20151119.pdf differ
diff --git a/20151119/ainf-uebung-20151119.tex b/20151119/ainf-uebung-20151119.tex
new file mode 100644
index 0000000000000000000000000000000000000000..cc7c62d26d4c799cb16cc2d676f0736f0c7850fa
--- /dev/null
+++ b/20151119/ainf-uebung-20151119.tex
@@ -0,0 +1,179 @@
+% ainf-uebung-20151119.pdf - Exercises on Applied Computer Sciences
+% Copyright (C) 2013, 2015  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{fleqn}
+
+\begin{psinputs}
+  \usepackage{pgscript}
+  \definecolor{PracticallyWhite}{rgb}{0.99 0.99 0.99}
+\end{psinputs}
+
+\newcounter{exercise}
+\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}}
+
+\newcounter{points}
+\newcommand{\onepoint}{(1 Punkt)\addtocounter{points}{1}}
+\newcommand{\points}[1]{(#1 Punkte)\addtocounter{points}{#1}}
+
+\begin{document}
+
+%  \thispagestyle{empty}
+
+  \section*{Angewandte Informatik\\Übungsaufgaben -- 19.\ November 2015}
+
+  \exercise{Fakultät}
+
+  Die Fakultät $n!$ einer natürlichen Zahl $n$ ist definiert als:
+  \begin{eqnarray*}
+    0 & \mbox{für} & n \le 1, \\
+    n \cdot (n-1)! & \mbox{für} & n > 1.
+  \end{eqnarray*}
+
+  Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$.
+
+  Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv}:
+
+  \begin{lstlisting}
+    #include <stdio.h>
+
+    int fak (int n)
+    {
+      if (n <= 1)
+        return 1;
+      else
+        return n * fak (n - 1);
+    }
+
+    int main (void)
+    {
+      for (int n = 1; n <= 5; n++)
+        printf ("%d\n", fak (n));
+      return 0;
+    }
+  \end{lstlisting}
+
+  \begin{itemize}
+    \item[(a)]
+      Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\
+      d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.
+    \item[(b)]
+      Wie viele Multiplikationen erfordern beide Versionen der Fakultätsfunktion?
+    \item[(c)]
+      Wieviel Speicherplatz erfordern beide Versionen der Fakultätsfunktion?
+  \end{itemize}
+
+%  \exercise{Koordinaten-FIFO}
+%
+%  Implementieren Sie einen FIFO für Koordinaten-Paare.\\
+%  Koordinatenpaare sollen "`hintereinander eingereiht"' werden.
+%
+%  \begin{itemize}
+%    \item
+%      Eine Funktion \lstinline{push (int x, int y)}
+%      schiebt sie in den FIFO.
+%    \item
+%      Eine Funktion \lstinline{pop (int &x, int &y)}
+%      liest und entfernt sie wieder aus dem FIFO.
+%    \item
+%      Eine Funktion \lstinline{dump ()}
+%      gibt den Inhalt des FIFO auf dem Bildschirm aus.
+%  \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, 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 weist mehrere Code-Verdopplungen auf:
+  \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,
+  die sich -- z.\,B.\ durch eine Funktion \lstinline{DaysInYear()} -- leicht hätte vermeiden lassen.
+
+  Gut hingegen ist die Verwendung einer Präprozessor-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}
+
+%  \bigskip
+%
+%  Anleitung:
+%  \begin{itemize}
+%    \item
+%      1 Array
+%    \item
+%      2 Index-Variablen (eine zum Schreiben, eine zum Lesen)
+%    \item
+%      ansonsten wie Stack
+%  \end{itemize}
+
+\end{document}
diff --git a/20151119/bla/hex-1.c b/20151119/bla/hex-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..937b43c837bd7c3f9d2b1b4652a3545014441f56
--- /dev/null
+++ b/20151119/bla/hex-1.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void print_hex (uint32_t x)
+{
+  print_hex (x / 16);
+  int e = x % 16;
+  if (e < 10)
+    printf ("%d", e);
+  else
+    printf ("%c", 'a' + e - 10);
+}
+
+int main (void)
+{
+  print_hex (16777226);
+  printf ("\n");
+  return 0;
+}
diff --git a/20151119/bla/mainparam-1.c b/20151119/bla/mainparam-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2
--- /dev/null
+++ b/20151119/bla/mainparam-1.c
@@ -0,0 +1,9 @@
+#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/20151119/bla/pruzzel.c b/20151119/bla/pruzzel.c
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/20151119/blubb b/20151119/blubb
new file mode 100644
index 0000000000000000000000000000000000000000..fc22e11c08b409d0dd264bad74fd85c1b9d38b88
--- /dev/null
+++ b/20151119/blubb
@@ -0,0 +1,9 @@
+
+         ************************
+         *                      *
+         *     ++     ++        *
+         *     ++     ++        *
+         *  -             -    *
+         *   -------------    *
+         *                   *
+         ********************
diff --git a/20151119/fak-1.c b/20151119/fak-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..75c7d8535dbdd6264b6dd3bf864bf3c1983a32ac
--- /dev/null
+++ b/20151119/fak-1.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+int fak (int n)
+{
+  if (n <= 1)
+    return 1;
+  else
+    return n * fak (n - 1);
+}
+
+int main (void)
+{
+  for (int n = 1; n <= 5; n++)
+    printf ("%d\n", fak (n));
+  return 0;
+}
diff --git a/20151119/hanoi-0.c b/20151119/hanoi-0.c
new file mode 100644
index 0000000000000000000000000000000000000000..38b2ef9bfd7b1532a47c0537f60388362edaf872
--- /dev/null
+++ b/20151119/hanoi-0.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+int main (void)
+{
+  n[0] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+}
diff --git a/20151119/hanoi-1.c b/20151119/hanoi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..686325a32d4634acfb085e6ba7cfb7d3a4eebc1f
--- /dev/null
+++ b/20151119/hanoi-1.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+int main (void)
+{
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+}
diff --git a/20151119/hanoi-2.c b/20151119/hanoi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bbbc07b0c3e1b2682d4a9a5e08837f60bd18bfa8
--- /dev/null
+++ b/20151119/hanoi-2.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+    }
+}
+
+int main (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  move (2, 0, 1);
+  display ();
+}
diff --git a/20151119/hanoi-3.c b/20151119/hanoi-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..0fff0efb5d1005fd5dd6ba7eaaa266d94bd4183c
--- /dev/null
+++ b/20151119/hanoi-3.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+    }
+}
+
+int main (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  move (0, 2, 1);
+  display ();
+}
diff --git a/20151119/hanoi-4.c b/20151119/hanoi-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d6f224f18bcab9e814dfba2a060d43c5db2e7de
--- /dev/null
+++ b/20151119/hanoi-4.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      display ();
+    }
+}
+
+int main (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, 1);
+}
diff --git a/20151119/hanoi-5.c b/20151119/hanoi-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..49cbb2638a06f13f0137bfefd3ab9a6f8f8d17e8
--- /dev/null
+++ b/20151119/hanoi-5.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      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, 1);
+      move (from, to, disks - 1);
+      move (help, to, 1);
+    }
+}
+
+int main (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+}
diff --git a/20151119/hanoi-6.c b/20151119/hanoi-6.c
new file mode 100644
index 0000000000000000000000000000000000000000..7815e9816f2520c7be0ddcb6e439bbe2c0053591
--- /dev/null
+++ b/20151119/hanoi-6.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        fatal_error ("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, 1);
+      move (from, to, disks - 1);
+      move (help, to, 1);
+    }
+}
+
+int main (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+}
diff --git a/20151119/hanoi-7.c b/20151119/hanoi-7.c
new file mode 100644
index 0000000000000000000000000000000000000000..fadef7250422506b0e2bacf053a7ca667b9f8721
--- /dev/null
+++ b/20151119/hanoi-7.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        fatal_error ("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 (int argc, char **argv)
+{
+  program_name = argv[0];
+  n[0] = 4;
+  tower[0][0] = 3;
+  tower[0][1] = 2;
+  tower[0][2] = 1;
+  tower[0][3] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+}
diff --git a/20151119/hanoi-8.c b/20151119/hanoi-8.c
new file mode 100644
index 0000000000000000000000000000000000000000..4b3cb8137be06176f62b7d8b7023e7e3ad416af4
--- /dev/null
+++ b/20151119/hanoi-8.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 5
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d: ", i);
+      for (int j = 0; j < n[i]; j++)
+        printf ("%2d", tower[i][j]);
+      printf ("\n");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        fatal_error ("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 (int argc, char **argv)
+{
+  program_name = argv[0];
+  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);
+}
diff --git a/20151119/hanoi-9.c b/20151119/hanoi-9.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c15ceb0212c198463c5bd98ed393574eb4b2b58
--- /dev/null
+++ b/20151119/hanoi-9.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DISKS 64
+
+int n[3], tower[3][DISKS];
+char *program_name;
+
+void display (void)
+{
+  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");
+    }
+  printf ("\n");
+}
+
+void fatal_error (char *msg)
+{
+  fprintf (stderr, "%s: %s\n", program_name, msg);
+  exit (1);
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        fatal_error ("trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        fatal_error ("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 (int argc, char **argv)
+{
+  program_name = argv[0];
+  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);
+}
diff --git a/20151119/hex-2.c b/20151119/hex-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a5ec0321fcb421e7b0b8227048da969fc35e9113
--- /dev/null
+++ b/20151119/hex-2.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void print_hex (uint32_t x)
+{
+  if (x > 0)
+    {
+      print_hex (x / 16);
+      int e = x % 16;
+      if (e < 10)
+        printf ("%d", e);
+      else
+        printf ("%c", 'a' + e - 10);
+    }
+}
+
+int main (void)
+{
+  print_hex (16777226);
+  printf ("\n");
+  return 0;
+}
diff --git a/20151119/hex-3.c b/20151119/hex-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..d4d8429e08a6a1f9bba8f448076618af2b7de50a
--- /dev/null
+++ b/20151119/hex-3.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void print_hex (uint32_t x)
+{
+  if (x > 0)
+    {
+      print_hex (x / 16);
+      int e = x % 16;
+      if (e < 10)
+        printf ("%d", e);
+      else
+        printf ("%c", 'a' + e - 10);
+    }
+}
+
+int main (void)
+{
+  print_hex (0);
+  printf ("\n");
+  return 0;
+}
diff --git a/20151119/hex-4.c b/20151119/hex-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f1aa73da0dcce6d98e00052a82cf50de36a6167
--- /dev/null
+++ b/20151119/hex-4.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void print_hex (uint32_t x)
+{
+  if (x == 0)
+    printf ("0");
+  else
+    {
+      print_hex (x / 16);
+      int e = x % 16;
+      if (e < 10)
+        printf ("%d", e);
+      else
+        printf ("%c", 'a' + e - 10);
+    }
+}
+
+int main (void)
+{
+  print_hex (0);
+  printf ("\n");
+  return 0;
+}
diff --git a/20151119/hex-5.c b/20151119/hex-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..60419c1296e20e264d4ac79f8d43bda8ee4694f3
--- /dev/null
+++ b/20151119/hex-5.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void print_hex (uint32_t x)
+{
+  if (x >= 16)
+    print_hex (x / 16);
+  int e = x % 16;
+  if (e < 10)
+    printf ("%d", e);
+  else
+    printf ("%c", 'a' + e - 10);
+}
+
+int main (void)
+{
+  print_hex (16777226);
+  printf ("\n");
+  print_hex (0);
+  printf ("\n");
+  return 0;
+}
diff --git a/20151119/mainparam-1.c b/20151119/mainparam-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2
--- /dev/null
+++ b/20151119/mainparam-1.c
@@ -0,0 +1,9 @@
+#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;
+}