diff --git a/20180205/aufgabe-4.png b/20180205/aufgabe-4.png new file mode 100644 index 0000000000000000000000000000000000000000..e655af0096cc6e50da81c8f820395dfaed27277f Binary files /dev/null and b/20180205/aufgabe-4.png differ diff --git a/20180205/hp-klausur-20170206.pdf b/20180205/hp-klausur-20170206.pdf index 8d24e50cd1782f2e4a3b39afe84dc3b4d9127893..41fc0eb2be7b0c4fc05d4e81d24df235c1bd50ce 100644 Binary files a/20180205/hp-klausur-20170206.pdf and b/20180205/hp-klausur-20170206.pdf differ diff --git a/20180205/hp-klausur-20170206.tex b/20180205/hp-klausur-20170206.tex index 63c6b653eac4a4c6ce333fad010586bf5cae6e82..0d6ce5c70ff7b9a61fe9fec84faf3084afb2b595 100644 --- a/20180205/hp-klausur-20170206.tex +++ b/20180205/hp-klausur-20170206.tex @@ -24,8 +24,6 @@ \usepackage{pgscript} -\newcounter{exercise} -\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}} \usepackage{enumerate} \usepackage{ifthen} @@ -59,63 +57,4 @@ \begin{document} \klausur{29}{ksVY3vujsxPY} - \klausur{04}{vgxMA7CUpvKU} - \klausur{27}{jvdyX9njbR3H} - \klausur{09}{gKwJpPh47jYa} - \klausur{59}{dkKUPaau7Fhj} - \klausur{42}{TPfkYRyuJ9nj} - \klausur{50}{UFJXeK7kmjx3} - \klausur{47}{w4zJ7FmdNrrn} - \klausur{25}{aVVcfUfA4hPC} - \klausur{06}{iMRzsngTr3qn} - \klausur{45}{rPedu3apVMEe} - \klausur{58}{dFLiTg4szWEJ} - \klausur{22}{eTw4twmmmvkc} - \klausur{34}{fECEPEr7AhCK} - \klausur{07}{nL7xXAYwjf4T} - \klausur{56}{mXp4wEtPhmpU} - \klausur{35}{V9Azdb7iiM9N} - \klausur{52}{3KgnTniUspRg} - \klausur{51}{egAyjkmacRR7} - \klausur{10}{hCE3M3vePijb} - \klausur{53}{u4MJwRoezoyY} - \klausur{21}{ztnXs39dAjti} - \klausur{33}{H7YThwhwqks3} - \klausur{46}{9VfP4jxAaA7R} - \klausur{28}{sfga4xMeRXmo} - \klausur{30}{WXysjjvR7JVY} - \klausur{37}{gHKtMRkVooC3} - \klausur{15}{Jj7tHtuvqoap} - \klausur{20}{LbEir4FXKnhM} - \klausur{36}{4amqxVwgfg3H} - \klausur{24}{Vp3UajsUJjRb} - \klausur{57}{n7UxFccciFM9} - \klausur{44}{7qMmVrNjsyVC} - \klausur{01}{U47zYi9VEq7b} - \klausur{31}{FEaKnuLERoR4} - \klausur{19}{Fad4YbupUdnw} - \klausur{38}{73PrJCCNykMx} - \klausur{13}{o7hEzFRTWvqW} - \klausur{32}{pcU3KNrXcdhz} - \klausur{39}{YxnuYP3YhvYa} - \klausur{49}{pmoqjfwCN7n4} - \klausur{16}{fjsYm3dvEMPC} - \klausur{54}{A3kPxXivfHvs} - \klausur{23}{CgF4AUNAKVPj} - \klausur{14}{HoAcL47KaWwf} - \klausur{02}{ucNHnuweEX4o} - \klausur{41}{NTV3WRofwxvK} - \klausur{48}{mJnuCVEzm9uR} - \klausur{55}{rk4M4nrHT77u} - \klausur{17}{eJV9uzxfstpo} - \klausur{05}{nozT7izzJ3xJ} - \klausur{12}{riVaeFUH4NHA} - \klausur{03}{b7LCnwTRJsrV} - \klausur{40}{dFRbW7kfkzaL} - \klausur{00}{mJaiepppsFc9} - \klausur{11}{KeRwm3bCwJkr} - \klausur{18}{KxdE7thMPdkx} - \klausur{08}{zi7PdpsFjd37} - \klausur{43}{nkfAu4UnAHpE} - \klausur{26}{mFnsXk7PuFRP} \end{document} diff --git a/20180205/klausur.tex b/20180205/klausur.tex new file mode 100644 index 0000000000000000000000000000000000000000..a031e1aaa047639fa30657d6f15ec7c294e66a31 --- /dev/null +++ b/20180205/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/20180205/logo-hochschule-bochum-cvh-text.pdf b/20180205/logo-hochschule-bochum-cvh-text.pdf new file mode 120000 index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c --- /dev/null +++ b/20180205/logo-hochschule-bochum-cvh-text.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20180205/logo-hochschule-bochum.pdf b/20180205/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20180205/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20180205/pgscript.sty b/20180205/pgscript.sty new file mode 120000 index 0000000000000000000000000000000000000000..95c888478c99ea7fda0fd11ccf669ae91be7178b --- /dev/null +++ b/20180205/pgscript.sty @@ -0,0 +1 @@ +../common/pgscript.sty \ No newline at end of file