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