diff --git a/README.md b/README.md
index 62ffb7f588c421fc9de8c2d4e4508f188ecbd776..6d3d0c10e19d25d460bc10cb6b01710d1c8ad5be 100644
--- a/README.md
+++ b/README.md
@@ -82,6 +82,12 @@ Praktikumsunterlagen:
  * [Versuch 3, 5.12.2017 und 9.1.2019: Druckknopfampel](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20181203/hp-2018ws-p3.pdf)
  * [Versuch 4, 16. und 23.1.2019: Objektorientiertes Grafik-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20190114/hp-2018ws-p4.pdf)
 
+Alte Klausuren:
+---------------
+ * [Klausur, Wintersemester 2015/16](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20160129/ainf-klausur-20160129.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20160129/)
+ * [Klausur, Wintersemester 2016/17](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20170206/hp-klausur-20170206.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20170206/)
+ * [Klausur, Wintersemester 2017/18](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/exams/20180213/hp-klausur-20180213.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/exams/20180213/)
+
 Skript:
 -------
  * [Hardwarenahe Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/script/hp-2018ws.pdf)
diff --git a/exams/20160129/ainf-klausur-20160129.pdf b/exams/20160129/ainf-klausur-20160129.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..98188d5dc9c53ae369995adcd740f311233698f4
Binary files /dev/null and b/exams/20160129/ainf-klausur-20160129.pdf differ
diff --git a/exams/20160129/ainf-klausur-20160129.tex b/exams/20160129/ainf-klausur-20160129.tex
new file mode 100644
index 0000000000000000000000000000000000000000..137b2d131a336273fac1e76ae91b5751d4c5f04b
--- /dev/null
+++ b/exams/20160129/ainf-klausur-20160129.tex
@@ -0,0 +1,376 @@
+% ainf-klausur-20160129.pdf - Examination on Applied Computer Sciences
+% Copyright (C) 2015, 2016  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+% README: Klausur, Wintersemester 2015/16
+
+\documentclass[a4paper]{article}
+
+\usepackage{pgscript}
+
+\newcounter{exercise}
+\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}}
+\usepackage{enumerate}
+\usepackage{ifthen}
+
+\newcommand{\workspacexyt}[3]{%
+  \begin{center}
+    \setlength{\unitlength}{0.5cm}
+    \begin{picture}(#1,#2)
+      \color[rgb]{0.7,0.7,0.7}
+      \put(0,0){\line(1,0){#1}}
+      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
+      \put(0,0){\line(0,1){#2}}
+      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
+      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
+    \end{picture}
+  \end{center}}
+
+\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
+
+\newcounter{points}
+\newcommand{\points}[1]{\ifthenelse{#1=1}{(1 Punkt)}{(#1 Punkte)}\addtocounter{points}{#1}}
+
+\begin{document}
+
+  \thispagestyle{empty}
+  \strut\hfill
+  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
+  \section*{Angewandte Informatik -- Klausur -- 29.\ Januar 2016}
+  Prof.~Dr.~Peter Gerwinski, Wintersemester 2015/16
+
+  \bigskip
+  \bigskip
+
+  \begin{center}
+    \renewcommand{\arraystretch}{2.0}
+    \begin{tabular}{|l|p{10cm}|} \hline
+      Name: & \\\hline
+      Matrikel-Nr.: & \\\hline
+    \end{tabular}
+  \end{center}
+
+  \bigskip
+
+  Zeit: 120 Minuten
+
+  Zulässige Hilfsmittel: 
+  \begin{itemize}
+    \item Schreibgerät
+    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
+    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)\\
+          \emph{ohne}\/ Zugang zu Datennetzen jeglicher Art
+  \end{itemize}
+
+  Nur die o.\,a.\ zulässigen Hilfsmittel
+  dürfen sich während der Klausur im Arbeitsbereich befinden.
+  \mbox{WLAN-,} Bluetooth- und sonstige Funkeinheiten von Notebooks o.\,ä.\
+  sind auszuschalten;
+  ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
+  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
+  sind auszuschalten und in der Tasche
+  zu verstauen.
+
+  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
+  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
+  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
+
+  Die Beispielprogramme werden Ihnen auf Datenträger (USB-Stick)
+  zur Verfügung gestellt. Die Abgabe von digital gelösten Aufgaben
+  hat auf demselben Datenträger zu erfolgen.
+
+  \clearpage
+
+  \exercise{Strings}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <string.h>
+
+    void fun (char *s)
+    {
+      int len = strlen (s);
+      for (int i = 0; i < len; i++)
+        for (int j = i + 1; j < len; j++)
+          if (s[i] > s[j])
+            {
+              char sx = s[i];
+              s[i] = s[j];
+              s[j] = sx;
+            }
+    }
+
+    int main (void)
+    {
+      char s[] = "Informatik";
+      fun (s);
+      printf ("%s\n", s);
+      return 0;
+    }
+  \end{lstlisting}
+  Auf einem Rechner, der den ASCII-Zeichensatz verwendet, lautet die Ausgabe:
+  \lstinline[style=terminal]{Iafikmnort}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Was bewirkt die Funktion \lstinline{fun}, und wie funktioniert sie?
+      \points{4}
+      \workspace{14}
+    \item
+      Warum beginnt der Ausgabe-String mit \lstinline{'I'} und nicht mit \lstinline{'a'}?
+      \points{2}
+      \workspace{10}
+    \item
+      Was passiert, wenn die Zeile \lstinline{char s[] = "Informatik";}
+      durch \lstinline|char s[] = { 'I', 'n', 'f', 'o'|~\lstinline|};| ersetzt wird, und warum?
+      \points{2}
+      \workspace{10}
+    \item
+      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun} und warum?
+
+      Wir beziehen uns hierbei auf die Anzahl der Vergleiche \lstinline{s[i] > s[j]}
+      in Abhängigkeit von der Länge des Eingabe-Strings \lstinline{"Informatik"}.
+      \points{1}
+      \workspace{10}
+    \item
+      Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
+      sich die Funktion \lstinline{fun} hinsichtlich der Rechenzeit
+      effizienter gestalten läßt. Von welcher Ordnung
+      (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?
+      \points{4}
+      \workspace{21}
+  \end{enumerate}
+
+  \exercise{Zeigerarithmetik}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <stdint.h>
+
+    void output (uint16_t *a)
+    {
+      for (int i = 0; a[i]; i++)
+        printf (" %d", a[i]);
+      printf ("\n");
+    }
+
+    int main (void)
+    {
+      uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
+
+      uint16_t *p1 = prime_numbers;
+      output (p1);
+      p1++;
+      output (p1);
+
+      char *p2 = prime_numbers;
+      output (p2);
+      p2++;
+      output (p2);
+
+      return 0;
+    }
+  \end{lstlisting}
+
+  Das Programm wird compiliert und ausgeführt:
+
+  \begin{lstlisting}[style=terminal]
+    $ ¡gcc -Wall -std=c99 aufgabe-2.c -o aufgabe-2¿
+    aufgabe-2.c: In function 'main':
+    aufgabe-2.c:20:13: warning: initialization from
+                       incompatible pointer type [enabled by default]
+    aufgabe-2.c:21:3: warning: passing argument 1 of 'output' from
+                      incompatible pointer type [enabled by default]
+    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
+    aufgabe-2.c:23:3: warning: passing argument 1 of 'output' from
+                      incompatible pointer type [enabled by default]
+    aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
+    $ ¡./aufgabe-2¿
+     2 3 5 7 11 13 17
+     3 5 7 11 13 17
+     2 3 5 7 11 13 17
+     768 1280 1792 2816 3328 4352
+  \end{lstlisting}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.
+      \points{2}
+      \workspace{10}
+      \workspace{5}
+    \item
+      Begründen Sie den Unterschied zwischen der ersten (\lstinline{2 3 5 7 11 13 17})\\
+      und der zweiten Zeile (\lstinline{3 5 7 11 13 17}) der Ausgabe des Programms.
+      \points{2}
+      \workspace{11}
+    \item
+      Erklären Sie die beim Compilieren auftretenden Warnungen\\
+      und die dritte Zeile (\lstinline{2 3 5 7 11 13 17}) der Ausgabe des Programms.
+      \points{3}
+      \workspace{11}
+    \item
+      Erklären Sie die vierte Zeile (\lstinline{768 1280 1792 2816 3328 4352})
+      der Ausgabe des Programms.\\
+%      Welche Endianness hat der verwendete Rechner?\\
+%      Wie sähe die Ausgabezeile bei umgekehrter Endianness aus?
+%
+% 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
+%   0 3 0 5 0 7 0 11 --> 768 1280 ...
+%
+% 0 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
+%   2 0 3 0 5 0 7 0 11 --> 768 1280 ...
+%
+% --> Endianness nicht erkennbar!
+%
+      Sie dürfen einen Little-Endian-Rechner voraussetzen.
+      \points{4}
+      \workspace{16}
+  \end{enumerate}
+
+  \exercise{Objektorientierte Programmierung}
+
+  Wir betrachten das folgende Fragment (\file{aufgabe-3.c})
+  eines objektorientierten Mathematik-Programms:
+  \begin{lstlisting}
+    #include <stdio.h>
+    #include <stdlib.h>
+
+    typedef struct
+    {
+      char symbol;
+      int (*calculate) (int a, int b);
+    }
+    operation;
+
+    operation *new_operation (void)
+    {
+      operation *op = malloc (sizeof (operation));
+      op->symbol = '?';
+      op->calculate = NULL;
+      return op;
+    }
+
+    [...]
+
+    int main (void)
+    {
+      operation *op[4];
+      op[0] = new_plus ();
+      op[1] = new_minus ();
+      op[2] = new_times ();
+      op[3] = NULL;
+      for (int i = 0; op[i]; i++)
+        printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+      return 0;
+    }
+  \end{lstlisting}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Was bedeutet \lstinline{int (*calculate) (int a, int b)},
+      und für welchen Zweck wird es verwendet?
+      \points{3}
+      \workspace{12}
+    \item
+      Ergänzen Sie das Fragment zu einem funktionsfähigen Programm,
+      das die folgende Ausgabe erzeugt:
+      \begin{lstlisting}[style=terminal,gobble=8]
+        2 + 3 = 5
+        2 - 3 = -1
+        2 * 3 = 6
+      \end{lstlisting}
+      \points{5}
+
+      Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.\\
+      Für Notizen verwenden Sie nötigenfalls die Rückseiten der Klausurbögen
+      und/oder zusätzliche Blätter.
+    \item
+      Was geschieht, wenn man auf die Zeile \lstinline{op[3] = NULL;} verzichtet,
+      und warum?
+      \points{2}
+      \workspace{8}
+  \end{enumerate}
+
+  \exercise{XBM-Grafik}
+
+  Bei einer XBM-Grafikdatei handelt es sich
+  um ein als C-Quelltext abgespeichertes Array,
+  das die Bildinformationen enthält:
+  \begin{itemize}\itemsep0pt
+    \item Jedes Bit entspricht einem Pixel.
+    \item Nullen stehen für Weiß, Einsen für Schwarz.
+    \item LSB first.
+    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
+    \item Breite und Höhe des Bildes sind als Konstantendefinitionen
+          (\lstinline{#define}) in der Datei enthalten.
+  \end{itemize}
+  Sie können eine XBM-Datei sowohl mit einem Texteditor
+  als auch mit vielen Grafikprogrammen öffnen und bearbeiten.
+
+  Beispiel (\file{aufgabe-4.xbm}):\hfill
+  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
+  \begin{lstlisting}
+    #define aufgabe_4_width 14
+    #define aufgabe_4_height 14
+    static unsigned char aufgabe_4_bits[] = {
+       0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
+       0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
+       0xf0, 0x03, 0x00, 0x00 };
+  \end{lstlisting} 
+  Ein C-Programm, das eine XBM-Grafik nutzen will,
+  kann die \file{.xbm}-Datei mit \lstinline{#include "..."} direkt einbinden.
+
+  Schreiben Sie ein Programm, das die XBM-Datei als ASCII-Grafik ausgibt, z.\,B.:
+  \begin{lstlisting}[style=terminal,lineskip=-4pt]
+                  
+        ******    
+       *      *   
+      *        *  
+     *          * 
+     *  **  **  * 
+     *   *   *  * 
+     *          * 
+     * *      * * 
+     *  *    *  * 
+      *  ****  *  
+       *      *   
+        ******    
+    ¡              ¿
+  \end{lstlisting}
+  \points{8}
+
+  Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.\\
+  Für Notizen verwenden Sie nötigenfalls die Rückseiten der Klausurbögen
+  und/oder zusätzliche Blätter.
+
+  \makeatletter
+    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
+  \makeatother
+
+  \vfill
+
+  \begin{flushright}
+    \textit{Viel Erfolg!}
+  \end{flushright}
+
+\end{document}
diff --git a/exams/20160129/aufgabe-1.c b/exams/20160129/aufgabe-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ea4fbee0996c834e8dfed3a72e0d46a2debcce68
--- /dev/null
+++ b/exams/20160129/aufgabe-1.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <string.h>
+
+void fun (char *s)
+{
+  int len = strlen (s);
+  for (int i = 0; i < len; i++)
+    for (int j = i + 1; j < len; j++)
+      if (s[i] > s[j])
+        {
+          char sx = s[i];
+          s[i] = s[j];
+          s[j] = sx;
+        }
+}
+
+int main (void)
+{
+  char s[] = "Informatik";
+  fun (s);
+  printf ("%s\n", s);
+  return 0;
+}
diff --git a/exams/20160129/aufgabe-1c.c b/exams/20160129/aufgabe-1c.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6fd60d1a083b255af53f05089afb2da5333b157
--- /dev/null
+++ b/exams/20160129/aufgabe-1c.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <string.h>
+
+void fun (char *s)
+{
+  int len = strlen (s);
+  for (int i = 0; i < len; i++)
+    for (int j = i + 1; j < len; j++)
+      if (s[i] > s[j])
+        {
+          char sx = s[i];
+          s[i] = s[j];
+          s[j] = sx;
+        }
+}
+
+int main (void)
+{
+  char s[] = { 'I', 'n', 'f', 'o' };
+  fun (s);
+  printf ("%s\n", s);
+  return 0;
+}
diff --git a/exams/20160129/aufgabe-2.c b/exams/20160129/aufgabe-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..33dbe39325bbfe9bf2481194b0be3420f1e3344e
--- /dev/null
+++ b/exams/20160129/aufgabe-2.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdint.h>
+
+void output (uint16_t *a)
+{
+  for (int i = 0; a[i]; i++)
+    printf (" %d", a[i]);
+  printf ("\n");
+}
+
+int main (void)
+{
+  uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
+
+  uint16_t *p1 = prime_numbers;
+  output (p1);
+  p1++;
+  output (p1);
+
+  char *p2 = prime_numbers;
+  output (p2);
+  p2++;
+  output (p2);
+
+  return 0;
+}
diff --git a/exams/20160129/aufgabe-3.c b/exams/20160129/aufgabe-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..d99132fcf7a86b293c935794295c258c25726b55
--- /dev/null
+++ b/exams/20160129/aufgabe-3.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+[...]
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/exams/20160129/aufgabe-4.png b/exams/20160129/aufgabe-4.png
new file mode 100644
index 0000000000000000000000000000000000000000..e655af0096cc6e50da81c8f820395dfaed27277f
Binary files /dev/null and b/exams/20160129/aufgabe-4.png differ
diff --git a/exams/20160129/aufgabe-4.xbm b/exams/20160129/aufgabe-4.xbm
new file mode 100644
index 0000000000000000000000000000000000000000..cf5404b5fb3e52ccc9540704ea91e424868a49df
--- /dev/null
+++ b/exams/20160129/aufgabe-4.xbm
@@ -0,0 +1,6 @@
+#define aufgabe_4_width 14
+#define aufgabe_4_height 14
+static unsigned char aufgabe_4_bits[] = {
+   0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
+   0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
+   0xf0, 0x03, 0x00, 0x00 };
diff --git a/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..2ae7a6ddbaa9711b01243c982a6c77071c8e9514
--- /dev/null
+++ b/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20160129/logo-hochschule-bochum.pdf b/exams/20160129/logo-hochschule-bochum.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..35d431010a361efed244d159b4c2e656c2501f54
--- /dev/null
+++ b/exams/20160129/logo-hochschule-bochum.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20160129/pgscript.sty b/exams/20160129/pgscript.sty
new file mode 120000
index 0000000000000000000000000000000000000000..cf485ba198c47b1a801fa5ee6de384e2bcd2427a
--- /dev/null
+++ b/exams/20160129/pgscript.sty
@@ -0,0 +1 @@
+../../common/pgscript.sty
\ No newline at end of file
diff --git a/exams/20170206/aufgabe-1.c b/exams/20170206/aufgabe-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..da281ff2018fa58fcf5b0186922926e199c269b5
--- /dev/null
+++ b/exams/20170206/aufgabe-1.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <string.h>
+
+void fun (char *s)
+{
+  int len = strlen (s);
+  for (int i = 0; i < len; i++)
+    {
+      for (int j = i - 1; j >= 0; j--)
+        {
+          if (s[i] < s[j])
+            {
+              char sx = s[i];
+              s[i] = s[j];
+              s[j] = sx;
+            }
+        }
+    }
+}
+
+int main (void)
+{
+  char s[] = "BAECD";
+  fun (s);
+  printf ("%s\n", s);
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-2.c b/exams/20170206/aufgabe-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9be1f468a89b529d8d6927563a85237ce3da6e8a
--- /dev/null
+++ b/exams/20170206/aufgabe-2.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  uint16_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
+  printf ("%s", numbers);
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-2c.c b/exams/20170206/aufgabe-2c.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef804f62f90340145cb321b9f0cc29da5cb30d0d
--- /dev/null
+++ b/exams/20170206/aufgabe-2c.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  uint32_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
+  printf ("%s\n", numbers);
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-2d.c b/exams/20170206/aufgabe-2d.c
new file mode 100644
index 0000000000000000000000000000000000000000..325f461e52acb26ee88c6473d172e0a445141add
--- /dev/null
+++ b/exams/20170206/aufgabe-2d.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  uint8_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
+  printf ("%s\n", numbers);
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-3.c b/exams/20170206/aufgabe-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..69c78edeb13d6c015a3f2a7eca66dc46ccb8edfe
--- /dev/null
+++ b/exams/20170206/aufgabe-3.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+[...]
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort (strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort (numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-4.c b/exams/20170206/aufgabe-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..29d7f6b5d138009bb988867409a2c9cb97aadaa0
--- /dev/null
+++ b/exams/20170206/aufgabe-4.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+
+[...]
+
+int main (void)
+{
+  pbm_open (14, 14, "test.pbm");
+  pbm_line ("              ");
+  pbm_line ("    XXXXXX    ");
+  pbm_line ("   X      X   ");
+  pbm_line ("  X        X  ");
+  pbm_line (" X          X ");
+  pbm_line (" X  XX  XX  X ");
+  pbm_line (" X   X   X  X ");
+  pbm_line (" X          X ");
+  pbm_line (" X X      X X ");
+  pbm_line (" X  X    X  X ");
+  pbm_line ("  X  XXXX  X  ");
+  pbm_line ("   X      X   ");
+  pbm_line ("    XXXXXX    ");
+  pbm_line ("              ");
+  pbm_close ();
+  return 0;
+}
diff --git a/exams/20170206/aufgabe-4.pbm b/exams/20170206/aufgabe-4.pbm
new file mode 100644
index 0000000000000000000000000000000000000000..bc5b70b1ad6f7236ec9469afac311f05fb056946
Binary files /dev/null and b/exams/20170206/aufgabe-4.pbm differ
diff --git a/exams/20170206/aufgabe-4.png b/exams/20170206/aufgabe-4.png
new file mode 100644
index 0000000000000000000000000000000000000000..e655af0096cc6e50da81c8f820395dfaed27277f
Binary files /dev/null and b/exams/20170206/aufgabe-4.png differ
diff --git a/exams/20170206/hp-klausur-20170206.pdf b/exams/20170206/hp-klausur-20170206.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..61bc53b93f31062bf34b056bc292c198beddbaa3
Binary files /dev/null and b/exams/20170206/hp-klausur-20170206.pdf differ
diff --git a/exams/20170206/hp-klausur-20170206.tex b/exams/20170206/hp-klausur-20170206.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2691d29d1895c9544a3a373de1e1024e451cfabc
--- /dev/null
+++ b/exams/20170206/hp-klausur-20170206.tex
@@ -0,0 +1,56 @@
+% hp-klausur-20170206.pdf - Examination on Applied Computer Sciences
+% Copyright (C) 2015, 2016, 2017  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+% README: Klausur, Wintersemester 2016/17
+
+\documentclass[a4paper]{article}
+
+\usepackage{pgscript}
+
+\newcommand{\workspacexyt}[3]{%
+  \begin{center}
+    \setlength{\unitlength}{0.5cm}
+    \begin{picture}(#1,#2)
+      \color[rgb]{0.7,0.7,0.7}
+      \put(0,0){\line(1,0){#1}}
+      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
+      \put(0,0){\line(0,1){#2}}
+      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
+      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
+    \end{picture}
+  \end{center}}
+
+\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
+
+\newcommand{\klausur}[2]{%
+  \clearpage
+  \setcounter{page}{1}
+  \setcounter{points}{0}
+  \setcounter{exercise}{0}
+  \gdef\username{#1}
+  \gdef\password{#2}
+  \input{klausur}
+}
+
+\begin{document}
+  \klausur{29}{ksVY3vujsxPY}
+\end{document}
diff --git a/exams/20170206/klausur.tex b/exams/20170206/klausur.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a031e1aaa047639fa30657d6f15ec7c294e66a31
--- /dev/null
+++ b/exams/20170206/klausur.tex
@@ -0,0 +1,355 @@
+  \thispagestyle{empty}
+  \strut\hfill
+  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
+  \section*{Hardwarenahe Programmierung / Angewandte Informatik\\
+            Klausur -- 6.\ Februar 2017}
+  Prof.~Dr.~Peter Gerwinski, Wintersemester 2016/17
+
+  \bigskip
+  \bigskip
+
+  \begin{center}
+    \renewcommand{\arraystretch}{2.0}
+    \begin{tabular}{|l|p{10cm}|} \hline
+      Name: & \\\hline
+      Matrikel-Nr.: & \\\hline
+      Benutzername: & \username \\\hline
+      Passwort: & \password \\\hline
+      \rule{0pt}{0.8cm}\raisebox{-1pt}{\shortstack[l]{Prüfsumme der hoch-\\[1pt]geladenen Datei:}} & \\\hline
+    \end{tabular}
+  \end{center}
+
+  \bigskip
+
+  Zeit: 150 Minuten
+
+  Zulässige Hilfsmittel: 
+  \begin{itemize}
+    \item Schreibgerät
+    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
+    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)
+    \item Zugang zum Klausur-WLAN
+  \end{itemize}
+
+  Nur die o.\,a.\ zulässigen Hilfsmittel
+  dürfen sich während der Klausur im Arbeitsbereich befinden.
+
+  Der einzige zulässige Zugang zu Datennetzen jeglicher Art
+  (LAN, WLAN, Bluetooth, \dots) ist der Zugang zum Klausur-WLAN,
+  das während der Klausur unter der ESSID \lstinline{klausur}
+  mit Passwort \lstinline{klausurklausur} zugänglich ist.
+  Sonstige Funkeinheiten (z.\,B.\ Bluetooth) von Notebooks o.\,ä.\
+  sind auszuschalten; ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
+  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
+  sind auszuschalten und in der Tasche zu verstauen.
+
+  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
+  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
+  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
+
+  Die Beispielprogramme werden Ihnen über das \textbf{Klausur-WLAN}
+  unter der URL \url{http://klausur} zum Herunterladen angeboten.
+  Unter derselben URL finden Sie auch ein Web-Interface
+  zum Hochladen \emph{einer einzigen Datei\/}
+  (normalerweise eine Archiv-Datei) mit Ihren Klausurergebnissen.
+  Bei mehrfachem Hochladen wird die vorherige Version überschrieben.
+  Zulässige Archiv-Dateiformate sind \file{tar.gz}, \file{tar.bz2},
+  \file{tar.xz}, \file{zip} und \file{7z}.
+  \textbf{Wichtig: Bitte tragen Sie nach dem Hochladen die Prüfsumme
+  oben auf diesem Blatt in das dafür vorgesehene Feld ein},
+  damit wir die Datei eindeutig Ihnen zuordnen können.
+  
+  Wenn Sie nicht über einen Zugang zum Klausur-WLAN verfügen,
+  stellen wir Ihnen alternativ die Beispiel-Programme auf Datenträger (USB-Stick)
+  zur Verfügung. Die Abgabe von digital gelösten Aufgaben
+  hat dann auf demselben Datenträger zu erfolgen.
+
+  \clearpage
+
+  \exercise{Strings umsortieren}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <string.h>
+
+    void fun (char *s)
+    {
+      int len = strlen (s);
+      for (int i = 0; i < len; i++)
+        {
+          for (int j = i - 1; j >= 0; j--)
+            {
+              if (s[i] < s[j])
+                {
+                  char sx = s[i];
+                  s[i] = s[j];
+                  s[j] = sx;
+                }
+            }
+        }
+    }
+
+    int main (void)
+    {
+      char s[] = "BAECD";
+      fun (s);
+      printf ("%s\n", s);
+      return 0;
+    }
+  \end{lstlisting}
+  Auf einem Rechner, der den ASCII-Zeichensatz verwendet, lautet die Ausgabe:
+  \lstinline[style=terminal]{ABCDE}
+
+  \begin{enumerate}[\quad(a)]
+%    \item
+%      Was bewirkt die Funktion \lstinline{fun}?
+%      \points{4}
+%      \workspace{12}
+    \item
+      Beweisen Sie (z.\,B.\ anhand eines Gegenbeispiels),
+      daß die Funktion allgemein \lstinline{fun} \emph{nicht\/} dazu geeignet ist,
+      die Buchstaben eines Strings gemäß ihrer ASCII-Reihenfolge zu sortieren.
+      \points{2}
+      \workspace{9}
+    \item
+      Was kann passieren, wenn die Zeile \lstinline{char s[] = "BAECD";}
+      durch \lstinline|char s[] = { 'B', 'A', 'E', 'C', 'D'|~\lstinline|};| ersetzt wird, und warum?
+      \points{2}
+      \workspace{10}
+    \item
+      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun} und warum?
+
+      Wir beziehen uns hierbei auf die Anzahl der Vergleiche \lstinline{s[i] < s[j]}
+      in Abhängigkeit von der Länge des Eingabe-Strings \lstinline{"BAECD"}.
+      \points{1}
+      \workspace{10}
+    \item
+      Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
+      sich die Funktion \lstinline{fun} so abwandeln läßt,
+      daß sie die Buchstaben des Strings \lstinline{s} gemäß ihrer ASCII-Reihenfolge sortiert.
+      Von welcher Ordnung (Landau-Symbol) ist Ihre Version der Funktion und warum?
+      \points{3}
+      \workspace{22}
+  \end{enumerate}
+
+  \exercise{Speicherformate von Zahlen}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <stdint.h>
+
+    int main (void)
+    {
+      uint16_t numbers[] = { 25928, 27756, 11375, 30496, 29295, 25708, 2593, 0 };
+      printf ("%s", numbers);
+      return 0;
+    }
+  \end{lstlisting}
+
+  Das Programm wird compiliert und ausgeführt:
+
+  \begin{lstlisting}[style=terminal]
+    $ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
+    aufgabe-2.c: In function ‘main’:
+    aufgabe-2.c:7:3: warning: format ‘%s’ expects argument of type ‘char *’,
+                     but argument 2 has type ‘uint16_t *’ [-Wformat]
+    $ ¡./aufgabe-2¿
+    Hello, world!
+  \end{lstlisting}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Erklären Sie die beim Compilieren auftretende Warnung.
+      \points{2}
+      \workspace{8}
+    \item
+      Erklären Sie die Ausgabe des Programms.\\
+      Welche Endianness hat der verwendete Rechner?
+      \points{4}
+      \workspace{16}
+%    \item
+%      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
+%      \points{2}
+%      \workspace{11}
+    \item
+      Erklären Sie die Ausgabe des Programms,
+      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint32_t} ersetzen.
+      \points{3}
+      \workspace{12}
+    \item
+      Erklären Sie die Ausgabe des Programms
+      und die beim Compilieren auftretenden Warnungen,
+      wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint8_t} ersetzen.
+      Warum tritt die Warnung aus den vorherigen Aufgabenteilen nicht mehr auf?
+      \points{3}
+      \workspace{14}
+  \end{enumerate}
+
+  \exercise{Allgemeine Sortierfunktion}
+
+  Ein Zeiger auf \lstinline{void} ist ein \emph{generischer Zeiger},
+  der auch ohne explizite Typumwandlung zu allen anderen Zeigertypen
+  zuweisungskompatibel ist.
+
+  Wir betrachten das folgende Fragment (\file{aufgabe-3.c})
+  eines Sortier-Programms:
+  \begin{lstlisting}
+    #include <stdio.h>
+
+    void sort (void **data, int (*compare) (void *x1, void *x2))
+    {
+      for (int i = 0; data[i]; i++)
+        for (int j = i + 1; data[j]; j++)
+          if (compare (data[i], data[j]) > 0)
+            {
+              void *tmp = data[i];
+              data[i] = data[j];
+              data[j] = tmp;
+            }
+    }
+
+    [...]
+
+    int main (void)
+    {
+      char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+      sort (strings, compare_strings);
+      for (int i = 0; strings[i]; i++)
+        printf ("%s\n", strings[i]);
+
+      printf ("\n");
+
+      int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+      int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+      sort (numbers, compare_numbers);
+      for (int i = 0; numbers[i]; i++)
+        printf ("%d\n", *numbers[i]);
+
+      return 0;
+    }
+  \end{lstlisting}
+
+  Dieses Programm stellt eine allgemeine Sortier-Funktion \lstinline{sort} zur Verfügung,
+  die prinzipiell beliebige Arrays sortieren kann
+  -- also z.\,B.\ sowohl Strings als auch Zahlen.
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Erklären Sie die Struktur des Arrays \lstinline{numbers}.
+      Was ist in dem Array gespeichert, und wo befinden sich die Zahlen?
+      Was ist der Unterschied zwischen \lstinline{&zero} und dem Wert \lstinline{NULL}?
+      \points{3}
+      \workspace{15}
+    \item
+      Was bedeutet \lstinline{int (*compare) (void *x1, void *x2)},
+      und für welchen Zweck wird es verwendet?\\
+      Stellen Sie einen Bezug zur objektorientierten Programmierung her.
+      \points{3}
+      \workspace{12}
+    \item
+      Was kann passieren, wenn man in den Arrays auf das letzte Element \lstinline{NULL} verzichtet
+      und warum?\\
+      \points{1}
+      \workspace{8}
+    \item
+      Ergänzen Sie das Fragment zu einem funktionsfähigen Programm,
+      das beide Arrays \lstinline{strings} und \lstinline{numbers}
+      sortiert ausgibt.
+      \points{5}
+
+      Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
+      aber nicht zwingend.
+      Für Notizen verwenden Sie nötigenfalls
+      die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
+  \end{enumerate}
+
+  \exercise{PBM-Grafik}
+
+  Bei einer PBM-Grafikdatei handelt es sich
+  um ein abgespeichertes C-Array von Bytes (\lstinline{uint8_t}),
+  das die Bildinformationen enthält:
+  \begin{itemize}\itemsep0pt
+    \item Die Datei beginnt mit der Kennung \lstinline{P4},
+          danach folgen Breite und Höhe in Pixel als ASCII-Zahlen,
+          danach ein Trennzeichen und die eigentlichen Bilddaten.
+    \item Jedes Bit entspricht einem Pixel.
+    \item Nullen stehen für Weiß, Einsen für Schwarz.
+    \item MSB first.
+    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
+  \end{itemize}
+  Viele Grafikprogramme können PBM-Dateien öffnen und bearbeiten.
+  Der Anfang der Datei (Kennung, Breite und Höhe)
+  ist auch in einem Texteditor lesbar.
+
+  Beispiel (\file{aufgabe-4.pbm}):\hfill
+  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
+  \begin{lstlisting}
+    P4
+    14 14
+    <Bilddaten>
+  \end{lstlisting}
+
+  In dem untenstehenden Programmfragment (\file{aufgabe-4.c})
+  wird eine Grafik aus Textzeilen zusammengesetzt,
+  so daß man mit einem Texteditor "`malen"' kann:
+  \begin{lstlisting}
+    #include <stdio.h>
+
+    [...]
+
+    int main (void)
+    {
+      pbm_open (14, 14, "test.pbm");
+      pbm_line ("              ");
+      pbm_line ("    XXXXXX    ");
+      pbm_line ("   X      X   ");
+      pbm_line ("  X        X  ");
+      pbm_line (" X          X ");
+      pbm_line (" X  XX  XX  X ");
+      pbm_line (" X   X   X  X ");
+      pbm_line (" X          X ");
+      pbm_line (" X X      X X ");
+      pbm_line (" X  X    X  X ");
+      pbm_line ("  X  XXXX  X  ");
+      pbm_line ("   X      X   ");
+      pbm_line ("    XXXXXX    ");
+      pbm_line ("              ");
+      pbm_close ();
+      return 0;
+    }
+  \end{lstlisting}
+  Ergänzen Sie das Programmfragment so,
+  daß es eine Datei \file{test.pbm} erzeugt,
+  die die Grafik enthält.
+
+  Das Programm soll typische Benutzerfehler abfangen
+  (z.\,B.\ weniger Zeilen als in \lstinline{pbm_open} angegeben),
+  keine fehlerhaften Ausgaben produzieren oder abstürzen,
+  sondern stattdessen sinnvolle Fehlermeldungen ausgeben.
+
+  Zum Vergleich liegt eine Datei \file{aufgabe-4.pbm}
+  mit dem gewünschten Ergebnis bei,\\
+  und die Datei \file{aufgabe-4.png} enthält dasselbe Bild.
+
+  \points{10}
+
+  Abgabe über das Klausur-WLAN oder auf Datenträger ist erwünscht,
+  aber nicht zwingend.
+  Für Notizen verwenden Sie nötigenfalls
+  die Rückseite des letzten Klausurbogens und/oder zusätzliche Blätter.
+
+  \makeatletter
+    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
+  \makeatother
+
+  \bigskip
+
+  \begin{flushright}
+    \textit{Viel Erfolg!}
+  \end{flushright}
+
+  \clearpage
+  \thispagestyle{empty}
+  Raum für Notizen
diff --git a/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..2ae7a6ddbaa9711b01243c982a6c77071c8e9514
--- /dev/null
+++ b/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20170206/logo-hochschule-bochum.pdf b/exams/20170206/logo-hochschule-bochum.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..35d431010a361efed244d159b4c2e656c2501f54
--- /dev/null
+++ b/exams/20170206/logo-hochschule-bochum.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20170206/pgscript.sty b/exams/20170206/pgscript.sty
new file mode 120000
index 0000000000000000000000000000000000000000..cf485ba198c47b1a801fa5ee6de384e2bcd2427a
--- /dev/null
+++ b/exams/20170206/pgscript.sty
@@ -0,0 +1 @@
+../../common/pgscript.sty
\ No newline at end of file
diff --git a/exams/20180213/aufgabe-1.c b/exams/20180213/aufgabe-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ae72941b931c04f3c380cb3bbcd64bec7f08c20
--- /dev/null
+++ b/exams/20180213/aufgabe-1.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <string.h>
+
+void insert_into_string (char src, char *target, int pos)
+{
+  int len = strlen (target);
+  for (int i = pos; i < len; i++)
+    target[i+1] = target[i];
+  target[pos] = src;
+}
+
+int main (void)
+{
+  char test[100] = "Hochshule Bochum";
+  insert_into_string ('c', test, 5);
+  printf ("%s\n", test);
+  return 0;
+}
diff --git a/exams/20180213/aufgabe-1b.c b/exams/20180213/aufgabe-1b.c
new file mode 100644
index 0000000000000000000000000000000000000000..db8744a1ff1c291a6c0c7202ba2dfa077ae856eb
--- /dev/null
+++ b/exams/20180213/aufgabe-1b.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <string.h>
+
+void insert_into_string (char src, char *target, int pos)
+{
+  int len = strlen (target);
+  for (int i = pos; i < len; i++)
+    target[i+1] = target[i];
+  target[pos] = src;
+}
+
+int main (void)
+{
+  char test[] = "Hochshule Bochum";
+  insert_into_string ('c', test, 5);
+  printf ("%s\n", test);
+  return 0;
+}
diff --git a/exams/20180213/aufgabe-1c.c b/exams/20180213/aufgabe-1c.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffe65caed9ed925e4ce9d59e94b906bc295de803
--- /dev/null
+++ b/exams/20180213/aufgabe-1c.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <string.h>
+
+void insert_into_string (char src, char *target, int pos)
+{
+  int len = strlen (target);
+  for (int i = pos; i < len; i++)
+    target[i+1] = target[i];
+  target[pos] = src;
+}
+
+int main (void)
+{
+  char *test = "Hochshule Bochum";
+  insert_into_string ('c', test, 5);
+  printf ("%s\n", test);
+  return 0;
+}
diff --git a/exams/20180213/aufgabe-2.c b/exams/20180213/aufgabe-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cb09b0e10aade5c202ed88fddcb2e52d700d9915
--- /dev/null
+++ b/exams/20180213/aufgabe-2.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdint.h>
+
+typedef struct
+{
+  uint32_t a;
+  uint64_t b;
+  uint8_t c;
+} three_numbers;
+
+int main (void)
+{
+  three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
+  printf ("%s\n", &xyz);
+  return 0;
+}
diff --git a/exams/20180213/aufgabe-3.c b/exams/20180213/aufgabe-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1054f2b601850a402dccb6f4878437d1bb6909c
--- /dev/null
+++ b/exams/20180213/aufgabe-3.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+
+void foreach (int *a, void (*fun) (int x))
+{
+  for (int *p = a; *p >= 0; p++)
+    fun (*p);
+}
+
+void even_or_odd (int x)
+{
+  if (x % 2)
+    printf ("%d ist ungerade.\n", x);
+  else
+    printf ("%d ist gerade.\n", x);
+}
+
+int main (void)
+{
+  int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
+  foreach (numbers, even_or_odd);
+  return 0;
+}
diff --git a/exams/20180213/aufgabe-4.pbm b/exams/20180213/aufgabe-4.pbm
new file mode 100644
index 0000000000000000000000000000000000000000..bc5b70b1ad6f7236ec9469afac311f05fb056946
Binary files /dev/null and b/exams/20180213/aufgabe-4.pbm differ
diff --git a/exams/20180213/aufgabe-4.png b/exams/20180213/aufgabe-4.png
new file mode 100644
index 0000000000000000000000000000000000000000..e655af0096cc6e50da81c8f820395dfaed27277f
Binary files /dev/null and b/exams/20180213/aufgabe-4.png differ
diff --git a/exams/20180213/aufgabe-4.xbm b/exams/20180213/aufgabe-4.xbm
new file mode 100644
index 0000000000000000000000000000000000000000..cf5404b5fb3e52ccc9540704ea91e424868a49df
--- /dev/null
+++ b/exams/20180213/aufgabe-4.xbm
@@ -0,0 +1,6 @@
+#define aufgabe_4_width 14
+#define aufgabe_4_height 14
+static unsigned char aufgabe_4_bits[] = {
+   0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
+   0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
+   0xf0, 0x03, 0x00, 0x00 };
diff --git a/exams/20180213/hp-klausur-20180213.pdf b/exams/20180213/hp-klausur-20180213.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0c6c736769933848459a752fe4cce08740ed6d71
Binary files /dev/null and b/exams/20180213/hp-klausur-20180213.pdf differ
diff --git a/exams/20180213/hp-klausur-20180213.tex b/exams/20180213/hp-klausur-20180213.tex
new file mode 100644
index 0000000000000000000000000000000000000000..11b4aa0afc204d896536936795cf98d61046e3ff
--- /dev/null
+++ b/exams/20180213/hp-klausur-20180213.tex
@@ -0,0 +1,57 @@
+% hp-klausur-20180213.pdf - Examination on Applied Computer Sciences
+% Copyright (C) 2015, 2016, 2017, 2018  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+% README: Klausur, Wintersemester 2017/18
+
+\documentclass[a4paper]{article}
+
+\usepackage{pgscript}
+\usepackage{ifthen}
+
+\newcommand{\workspacexyt}[3]{%
+  \begin{center}
+    \setlength{\unitlength}{0.5cm}
+    \begin{picture}(#1,#2)
+      \color[rgb]{0.7,0.7,0.7}
+      \put(0,0){\line(1,0){#1}}
+      \multiput(0,1)(0,1){#2}{\line(1,0){#1}}
+      \put(0,0){\line(0,1){#2}}
+      \multiput(1,0)(1,0){#1}{\line(0,1){#2}}
+      \put(0,0){\makebox(#1,#2)[c]{\color[rgb]{0.2,0.2,0.2}#3}}
+    \end{picture}
+  \end{center}}
+
+\newcommand{\workspace}[1]{\workspacexyt{30}{#1}{}}
+
+\newcommand{\klausur}[2]{%
+  \clearpage
+  \setcounter{page}{1}
+  \setcounter{points}{0}
+  \setcounter{exercise}{0}
+  \gdef\username{#1}
+  \gdef\password{#2}
+  \input{klausur}
+}
+
+\begin{document}
+  \klausur{12}{8Hdy2fG2Zvlk}
+\end{document}
diff --git a/exams/20180213/klausur.tex b/exams/20180213/klausur.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2f0b522e5fb2daf2862a4072f508ef98bd94d7dd
--- /dev/null
+++ b/exams/20180213/klausur.tex
@@ -0,0 +1,352 @@
+  \thispagestyle{empty}
+  \strut\hfill
+  \includegraphics[height=1.5cm]{logo-hochschule-bochum.pdf}
+  \section*{Hardwarenahe Programmierung / Angewandte Informatik\\
+            Klausur -- 13.\ Februar 2018}
+  Prof.~Dr.~Peter Gerwinski, Wintersemester 2017/18
+
+  \bigskip
+  \bigskip
+
+  \begin{center}
+    \renewcommand{\arraystretch}{2.0}
+    \begin{tabular}{|l|p{10cm}|} \hline
+      Name: & \\\hline
+      Matrikel-Nr.: & \\\hline
+      Benutzername: & \username \\\hline
+      Passwort: & \password \\\hline
+      \rule{0pt}{0.8cm}\raisebox{-1pt}{\shortstack[l]{Prüfsumme der hoch-\\[1pt]geladenen Datei:}} & \\\hline
+    \end{tabular}
+  \end{center}
+
+  \bigskip
+
+  Zeit: 150 Minuten
+
+  Zulässige Hilfsmittel: 
+  \begin{itemize}
+    \item Schreibgerät
+    \item Beliebige Unterlagen in Papierform und/oder auf Datenträgern
+    \item Elektronische Rechner (Notebook, Taschenrechner o.\,ä.)
+    \item Zugang zum Klausur-WLAN
+  \end{itemize}
+
+  Nur die o.\,a.\ zulässigen Hilfsmittel
+  dürfen sich während der Klausur im Arbeitsbereich befinden.
+
+  Der einzige zulässige Zugang zu Datennetzen jeglicher Art
+  (LAN, WLAN, Bluetooth, \dots) ist der Zugang zum Klausur-WLAN,
+  das während der Klausur unter der ESSID \lstinline{klausur}
+  mit Passwort \lstinline{klausurklausur} zugänglich ist.
+  Sonstige Funkeinheiten (z.\,B.\ Bluetooth) von Notebooks o.\,ä.\
+  sind auszuschalten; ggf.\ dafür vorhandene physische Schalter sind zu benutzen.
+  Mobiltelefone, Geräte mit mobilem Internet-Zugang u.\,ä.\
+  sind auszuschalten und in der Tasche zu verstauen.
+
+  Die reguläre Maximalpunktzahl beträgt \totalpoints\ Punkte.\\
+  Bei besonderen Leistungen sind Zusatzpunkte möglich.\\
+  Mit 20 erreichten Punkten gilt die Klausur als bestanden.
+
+  Die Beispielprogramme werden Ihnen über das \textbf{Klausur-WLAN}
+  unter der URL \url{http://klausur} zum Herunterladen angeboten.
+  Unter derselben URL finden Sie auch ein Web-Interface
+  zum Hochladen \emph{einer einzigen Datei\/}
+  (normalerweise eine Archiv-Datei) mit Ihren Klausurergebnissen.
+  Bei mehrfachem Hochladen wird die vorherige Version überschrieben.
+  Zulässige Archiv-Dateiformate sind \file{tar.gz}, \file{tar.bz2},
+  \file{tar.xz}, \file{zip} und \file{7z}.
+  \textbf{Wichtig: Bitte tragen Sie nach dem Hochladen die Prüfsumme
+  oben auf diesem Blatt in das dafür vorgesehene Feld ein},
+  damit wir die Datei eindeutig Ihnen zuordnen können.
+  
+  Wenn Sie nicht über einen Zugang zum Klausur-WLAN verfügen,
+  stellen wir Ihnen alternativ die Beispiel-Programme auf Datenträger (USB-Stick)
+  zur Verfügung. Die Abgabe von digital gelösten Aufgaben
+  hat dann auf demselben Datenträger zu erfolgen.
+
+  \clearpage
+
+  \exercise{Einfügen in Strings}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-1.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <string.h>
+
+    void insert_into_string (char src, char *target, int pos)
+    {
+      int len = strlen (target);
+      for (int i = pos; i < len; i++)
+        target[i+1] = target[i];
+      target[pos] = src;
+    }
+
+    int main (void)
+    {
+      char test[100] = "Hochshule Bochum";
+      insert_into_string ('c', test, 5);
+      printf ("%s\n", test);
+      return 0;
+    }
+  \end{lstlisting}
+  Die Ausgabe des Programms lautet:
+  \lstinline[style=terminal]{Hochschhhhhhhhhhh}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Erklären Sie die Ausgabe.
+      \points{3}
+      \workspace{12}
+    \item
+      Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
+      daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos}
+      in den String \lstinline{target} einfügt.\par
+      Die Ausgabe des Programms müßte dann
+      \lstinline[style=terminal]{Hochschule Bochum} lauten.
+      \points{2}
+      \workspace{13}
+    \item
+      Was kann passieren, wenn Sie die Zeile
+      \lstinline{char test[100] = "Hochshule Bochum";}\\
+      durch
+      \lstinline{char test[] = "Hochshule Bochum";}
+      ersetzen und warum?
+      \points{2}
+      \workspace{10}
+    \item
+      Was passiert, wenn Sie 
+      \lstinline{char test[100] = "Hochshule Bochum";}\\
+      durch
+      \lstinline{char *test = "Hochshule Bochum";}
+      ersetzen und warum?
+      \points{2}
+      \workspace{10}
+    \item
+      Schreiben Sie eine Funktion
+      \lstinline{void insert_into_string_sorted (char src, char *target)},
+      die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist
+      und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle
+      einfügt. Diese Funktion darf die bereits vorhandene Funktion
+      \lstinline|insert_into_string()| aufrufen.\\
+      \points{4}\par
+      Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm:
+      \begin{lstlisting}[gobble=8]
+        char test[100] = "";
+        insert_into_string_sorted ('c', test);
+        insert_into_string_sorted ('a', test);
+        insert_into_string_sorted ('d', test);
+        insert_into_string_sorted ('b', test);
+      \end{lstlisting}
+      Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten.
+      \workspace{14}
+    \item
+      Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
+      arbeitet Ihre Funktion
+      \lstinline{void insert_into_string_sorted (char src, char *target)}
+      und warum?
+      \points{1}
+      \workspace{10}
+    \item
+      Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\
+      \lstinline{void insert_into_string_sorted (char src, char *target)}
+      so gestalten kann,\\
+      daß sie in $\mathcal{O}(\log n)$ arbeitet.
+      \points{3}
+      \workspace{35}
+  \end{enumerate}
+
+  \exercise{Speicherformate von Zahlen}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-2.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+    #include <stdint.h>
+
+    typedef struct
+    {
+      uint32_t a;
+      uint64_t b;
+      uint8_t c;
+    } three_numbers;
+
+    int main (void)
+    {
+      three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
+      printf ("%s\n", &xyz);
+      return 0;
+    }
+  \end{lstlisting}
+
+  Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
+  (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
+  daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
+
+  \begin{lstlisting}[style=terminal]
+    $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
+    aufgabe-2.c: In function "main":
+    aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
+    argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
+       printf ("%s\n", &xyz);
+                 ^
+    $ ¡./aufgabe-2¿
+    Hallo, Welt!
+  \end{lstlisting}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Erklären Sie die beim Compilieren auftretende Warnung.
+      \points{2}
+      \workspace{10}
+    \item
+      Erklären Sie die Ausgabe des Programms.
+      \points{4}
+      \workspace{11}
+      \workspace{7}
+    \item
+      Welche Endianness hat der verwendete Rechner?
+      Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
+      \points{2}
+      \workspace{12}
+    \item
+      Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
+      (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
+      daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
+      \begin{lstlisting}[style=terminal,gobble=8]
+        $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
+        aufgabe-2.c: In function "main":
+        aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
+        but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
+        [-Wformat=]
+           printf ("%s\n", &xyz);
+                     ^
+        $ ¡./aufgabe-2¿
+        Hall5V
+      \end{lstlisting}
+      (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
+      Erklären Sie die geänderte Ausgabe des Programms.
+      \points{3}
+      \workspace{16}
+  \end{enumerate}
+
+  \exercise{Iterationsfunktionen}
+
+  Wir betrachten das folgende Programm (\file{aufgabe-3.c}):
+  \begin{lstlisting}[style=numbered]
+    #include <stdio.h>
+
+    void foreach (int *a, void (*fun) (int x))
+    {
+      for (int *p = a; *p >= 0; p++)
+        fun (*p);
+    }
+
+    void even_or_odd (int x)
+    {
+      if (x % 2)
+        printf ("%d ist ungerade.\n", x);
+      else
+        printf ("%d ist gerade.\n", x);
+    }
+
+    int main (void)
+    {
+      int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 };
+      foreach (numbers, even_or_odd);
+      return 0;
+    }
+  \end{lstlisting}
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Was bedeutet \lstinline{void (*fun) (int x)},
+      und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?
+      \points{2}
+      \workspace{8}
+    \item
+      Schreiben Sie das Hauptprogramm \lstinline{main()} so um,
+      daß es unter Verwendung der Funktion \lstinline{foreach()}
+      die Summe aller positiven Zahlen in dem Array berechnet.
+      Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.
+      \points{4}
+      \workspace{14}
+  \end{enumerate}
+
+  \exercise{XBM- und PBM-Grafik}
+
+  Bei einer XBM-Grafikdatei handelt es sich
+  um ein als C-Quelltext abgespeichertes Array,
+  das die Bildinformationen enthält:
+  \begin{itemize}\itemsep0pt
+    \item Jedes Bit entspricht einem Pixel.
+    \item Nullen stehen für Weiß, Einsen für Schwarz.
+    \item LSB first.
+    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
+    \item Breite und Höhe des Bildes sind als Konstantendefinitionen
+          (\lstinline{#define}) in der Datei enthalten.
+  \end{itemize}
+  Sie können eine XBM-Datei sowohl mit einem Texteditor
+  als auch mit vielen Grafikprogrammen öffnen und bearbeiten.
+
+  Beispiel (\file{aufgabe-4.xbm}):\hfill
+  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
+  \begin{lstlisting}
+    #define aufgabe_4_width 14
+    #define aufgabe_4_height 14
+    static unsigned char aufgabe_4_bits[] = {
+       0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13,
+       0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04,
+       0xf0, 0x03, 0x00, 0x00 };
+  \end{lstlisting} 
+  Ein C-Programm, das eine XBM-Grafik nutzen will,
+  kann die \file{.xbm}-Datei mit \lstinline{#include "..."} direkt einbinden.
+
+  Bei einer PBM-Grafikdatei handelt es sich
+  um ein binär abgespeichertes C-Array von Bytes (\lstinline{uint8_t}),
+  das die Bildinformationen enthält:
+  \begin{itemize}\itemsep0pt
+    \item Die Datei beginnt mit der Kennung \lstinline{P4},
+          danach folgen Breite und Höhe in Pixel als ASCII-Zahlen,
+          danach genau ein Trennzeichen (z.\,B.\ \lstinline{"\n"})
+          und zuletzt die eigentlichen Bilddaten.
+    \item Jedes Bit entspricht einem Pixel.
+    \item Nullen stehen für Weiß, Einsen für Schwarz.
+    \item MSB first.
+    \item Jede Zeile des Bildes wird auf ganze Bytes aufgefüllt.
+  \end{itemize}
+  Viele Grafikprogramme können PBM-Dateien öffnen und bearbeiten.
+  Der Anfang der Datei (Kennung, Breite und Höhe)
+  ist auch in einem Texteditor lesbar.
+
+  Beispiel (\file{aufgabe-4.pbm}):\hfill
+  \makebox(0,0)[tr]{\framebox{\includegraphics[scale=3]{aufgabe-4.png}}}
+  \begin{lstlisting}
+    P4
+    14 14
+    <Bilddaten>
+  \end{lstlisting}
+
+  Schreiben Sie ein Programm,
+  das die Datei \file{aufgabe-4.xbm} mittels \lstinline{#include} liest
+  und in einer PBM-Bilddatei \file{test.pbm} abspeichert.
+  Das Programm wandelt also eine XBM-Datei in eine PBM-Datei um.
+
+  Für Ihre Ergebniskontrolle liegt eine Datei \file{aufgabe-4.pbm}
+  mit dem gewünschten Ergebnis bei,\\
+  und die Datei \file{aufgabe-4.png} enthält dasselbe Bild.
+
+  Hinweis: Verwenden Sie \lstinline{"%c"} für die Ausgabe
+  der eigentlichen Bilddaten.
+
+  \points{8}
+
+  Abgabe auf Datenträger ist erwünscht, aber nicht zwingend.
+
+  \makeatletter
+    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
+  \makeatother
+
+  \bigskip
+
+  \begin{flushright}
+    \textit{Viel Erfolg!}
+  \end{flushright}
diff --git a/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..2ae7a6ddbaa9711b01243c982a6c77071c8e9514
--- /dev/null
+++ b/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/exams/20180213/logo-hochschule-bochum.pdf b/exams/20180213/logo-hochschule-bochum.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..35d431010a361efed244d159b4c2e656c2501f54
--- /dev/null
+++ b/exams/20180213/logo-hochschule-bochum.pdf
@@ -0,0 +1 @@
+../../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/exams/20180213/pgscript.sty b/exams/20180213/pgscript.sty
new file mode 120000
index 0000000000000000000000000000000000000000..cf485ba198c47b1a801fa5ee6de384e2bcd2427a
--- /dev/null
+++ b/exams/20180213/pgscript.sty
@@ -0,0 +1 @@
+../../common/pgscript.sty
\ No newline at end of file
diff --git a/update b/update
index 6a73d7f51b736191641f393bd6e351904e20bd71..7912cfac16bf097435deda062dcdc44ad3026600 100755
--- a/update
+++ b/update
@@ -2,15 +2,18 @@
 
 sem=2018ws
 course=hp
-date_mask="201[89][01][0-9][0-3][0-9]"
+date_mask="201[6-9][01][0-9][0-3][0-9]"
 
 time_mask="[0-2][0-9][0-5][0-9][0-5][0-9]"
 base_url="https://gitlab.cvh-server.de/pgerwinski/$course/tree/master/"
 raw_base_url="https://gitlab.cvh-server.de/pgerwinski/$course/raw/master/"
 pattern="README:"
 
-slides_tex_file="$course-slides-$sem.tex"
-cat > "$slides_tex_file" << EOF
+if [ "$1" = "--no-slides" ]; then
+  shift
+else
+  slides_tex_file="$course-slides-$sem.tex"
+  cat > "$slides_tex_file" << EOF
 \documentclass{article}
 
 \usepackage[final]{pdfpages}
@@ -25,26 +28,30 @@ cat > "$slides_tex_file" << EOF
   \includepdf[pages=2-]{script/$course-slides-title-$sem.pdf}
 EOF
 
-for x in $date_mask/$course-$date_mask.pdf; do
-  f=$(echo $x | cut -d '/' -f 1)
-  y=$(echo $f | cut -b 1-4)
-  m=$(echo $f | cut -b 5-6)
-  d=$(echo $f | cut -b 7-8)
-  date="$d.$m.$y"
-  src=$(echo $x | sed -e 's/\.pdf$/.tex/')
-  description=$(grep -m 1 "$pattern" "$src" | sed -e "s/^.*$pattern *//")
-  echo "  \pdfbookmark[1]{$date: $description}{$f}" >> "$slides_tex_file"
-  echo "  \includepdf[pages=-]{$x}" >> "$slides_tex_file"
-done
-
-echo '\end{document}' >> "$slides_tex_file"
-
-lualatex -interaction batchmode "$slides_tex_file" \
-  && lualatex -interaction batchmode "$slides_tex_file" \
-  || {
-       echo "$0: error compiling $slides_tex_file"
-       exit 1
-     }
+  for x in $date_mask/$course-$date_mask.pdf; do
+    f=$(echo $x | cut -d '/' -f 1)
+    y=$(echo $f | cut -b 1-4)
+    m=$(echo $f | cut -b 5-6)
+    d=$(echo $f | cut -b 7-8)
+    date="$d.$m.$y"
+    src=$(echo $x | sed -e 's/\.pdf$/.tex/')
+    description=$(grep -m 1 "$pattern" "$src" | sed -e "s/^.*$pattern *//")
+    echo "  \pdfbookmark[1]{$date: $description}{$f}" >> "$slides_tex_file"
+    echo "  \includepdf[pages=-]{$x}" >> "$slides_tex_file"
+  done
+
+  echo '\end{document}' >> "$slides_tex_file"
+
+  lualatex -interaction batchmode "$slides_tex_file" \
+    && echo \
+    && lualatex -interaction batchmode "$slides_tex_file" \
+    || {
+         echo
+         echo "$0: error compiling $slides_tex_file"
+         exit 1
+       }
+  echo
+fi
 
 # if pdfjam --papersize "{362.835pt,272.126pt}" -o hp-slides-$sem.pdf \
 #    $date_mask/hp-$date_mask.pdf > /dev/null 2> pdfjam.err; then
@@ -132,6 +139,7 @@ collect "Übungsaufgaben:" tex pdf $date_mask/hp-uebung-$date_mask.tex
 collect "Musterlösungen:" tex pdf $date_mask/hp-musterloesung-$date_mask.tex || echo "(keine)" >> $readme
 collect "Tafelbilder:" txt jpg $date_mask/photo-$date_mask-$time_mask.txt || echo "(keine)" >> $readme
 collect --no-date "Praktikumsunterlagen:" tex pdf $date_mask/hp-$sem-p[1-4].tex || echo "(keine)" >> $readme
+collect --with-examples --no-date "Alte Klausuren:" tex pdf exams/$date_mask/*-klausur-$date_mask.tex >> $readme
 
 cat >> $readme << EOF